Задача
Воспроизвести цикл работы дорожного светофора.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- светодиоды красный, жёлтый, зелёный
- 3 резистора 330 Ом
- резистор 10 кОм
Схема подключения
| Вывод | Подключение |
|---|---|
| RB0 | красный светодиод через 330 Ом |
| RB1 | жёлтый светодиод через 330 Ом |
| RB2 | зелёный светодиод через 330 Ом |
| MCLR | через 10 кОм на +5 В |
Алгоритм
- Включить красный на 5 секунд.
- Добавить жёлтый на 1 секунду (подготовка к движению).
- Включить зелёный на 5 секунд, затем несколько раз мигнуть им.
- Включить жёлтый на 1 секунду и вернуться к красному.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p10.asm · p10.hex (готовая прошивка).
;=======================================================
; Проект 10. Светофор (красный RB0, жёлтый RB1, зелёный RB2)
; PIC16F84A, 4 МГц
;=======================================================
LIST p=16F84A
#include <p16f84a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
cblock 0x0C
d1, d2, d3, blink
endc
ORG 0x000
goto Start
Start
bsf STATUS,RP0
clrf TRISB
bcf STATUS,RP0
clrf PORTB
Main
movlw b'00000001' ; КРАСНЫЙ
movwf PORTB
call Delay5s
movlw b'00000011' ; красный + жёлтый
movwf PORTB
call Delay1s
movlw b'00000100' ; ЗЕЛЁНЫЙ
movwf PORTB
call Delay5s
movlw .6 ; зелёный мигает 3 раза
movwf blink
GrBlink
movlw b'00000100'
xorwf PORTB,f
call Delay500
decfsz blink,f
goto GrBlink
movlw b'00000010' ; ЖЁЛТЫЙ
movwf PORTB
call Delay1s
goto Main
Delay5s
movlw .10
movwf d3
D5 call Delay500
decfsz d3,f
goto D5
return
Delay1s
call Delay500
call Delay500
return
Delay500
movlw .255
movwf d1
DL1 movlw .255
movwf d2
DL2 nop
nop
decfsz d2,f
goto DL2
decfsz d1,f
goto DL1
return
END
Пояснения
- Длинные интервалы набираются вызовом базовой задержки в цикле — так экономится память и не нужны трёхбайтные счётчики.
- Комбинации сигналов задаются одной записью в порт:
b'00000011'— это красный и жёлтый одновременно. - Мигание зелёного реализовано инверсией одного бита с чётным числом повторов, чтобы цикл завершился при погашенном светодиоде.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.