AFON // радиотехник affonya@mail.ru
← Проекты на PIC

Проект 04. Кнопка-триггер (включение с фиксацией)

Одна кнопка попеременно включает и выключает светодиод. Проект показывает обработку нажатия по факту события и ожидание отпускания кнопки.

Задача

Переключать светодиод каждым нажатием одной кнопки.

Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.

Что понадобится

  • PIC16F84A
  • кварц 4 МГц + 2×22 пФ
  • кнопка + резистор 10 кОм
  • светодиод + 330 Ом

Схема подключения

ВыводПодключение
RA0кнопка на GND, подтяжка 10 кОм на +5 В
RB0светодиод через 330 Ом
MCLRчерез 10 кОм на +5 В

Алгоритм

  1. Ждать нажатия кнопки и подтвердить его после антидребезга.
  2. Инвертировать состояние светодиода командой xorwf с маской.
  3. Дождаться отпускания кнопки, иначе состояние будет переключаться непрерывно.
  4. Вернуться к ожиданию следующего нажатия.

Листинг на ассемблере

Код проверен ассемблером и собирается без ошибок. Скачать: p04.asm · p04.hex (готовая прошивка).

;=======================================================
; Проект 04. Кнопка-триггер: нажал — включил, нажал — выключил
; PIC16F84A. Кнопка RA0, светодиод RB0
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

        cblock  0x0C
        d1, d2
        endc

        ORG     0x000
        goto    Start

Start
        bsf     STATUS,RP0
        clrf    TRISB
        movlw   b'00011111'
        movwf   TRISA
        bcf     STATUS,RP0
        clrf    PORTB

Main
        btfsc   PORTA,0         ; ждём нажатия
        goto    Main
        call    Debounce
        btfsc   PORTA,0         ; ложное срабатывание?
        goto    Main

        movlw   b'00000001'     ; инвертируем состояние светодиода
        xorwf   PORTB,f

WaitRel
        btfss   PORTA,0         ; ждём отпускания
        goto    WaitRel
        call    Debounce
        goto    Main

Debounce
        movlw   .26
        movwf   d1
DB1     movlw   .255
        movwf   d2
DB2     decfsz  d2,f
        goto    DB2
        decfsz  d1,f
        goto    DB1
        return

        END

Пояснения

  • Инверсия бита — это исключающее ИЛИ с единицей в нужном разряде: movlw b'00000001' и xorwf PORTB,f.
  • Ожидание отпускания принципиально: без него программа за один долгий нажим прокрутит десятки переключений.
  • Антидребезг ставится и на нажатие, и на отпускание — «звенят» оба перехода.

Что дальше

Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.