Задача
Переключать светодиод каждым нажатием одной кнопки.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- кнопка + резистор 10 кОм
- светодиод + 330 Ом
Схема подключения
| Вывод | Подключение |
|---|---|
| RA0 | кнопка на GND, подтяжка 10 кОм на +5 В |
| RB0 | светодиод через 330 Ом |
| MCLR | через 10 кОм на +5 В |
Алгоритм
- Ждать нажатия кнопки и подтвердить его после антидребезга.
- Инвертировать состояние светодиода командой
xorwfс маской. - Дождаться отпускания кнопки, иначе состояние будет переключаться непрерывно.
- Вернуться к ожиданию следующего нажатия.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: 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.