Задача
Зажигать светодиоды по очереди, создавая эффект бегущего огня.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- 8 светодиодов
- 8 резисторов 330 Ом
- резистор 10 кОм
Схема подключения
| Вывод | Подключение |
|---|---|
| RB0…RB7 | восемь светодиодов, каждый через резистор 330 Ом на GND |
| MCLR | через 10 кОм на +5 В |
| OSC1/OSC2 | кварц 4 МГц |
Алгоритм
- Весь порт B настроить на выход (
clrf TRISB). - Записать в порт код
00000001— горит первый светодиод. - Сбросить флаг переноса и командой
rlfсдвинуть содержимое порта влево. - Повторить восемь раз, затем начать заново.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p02.asm · p02.hex (готовая прошивка).
;=======================================================
; Проект 02. Бегущие огни на 8 светодиодах
; PIC16F84A, 4 МГц. Светодиоды RB0..RB7 через 330 Ом
;=======================================================
LIST p=16F84A
#include <p16f84a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
cblock 0x0C
d1, d2, cnt
endc
ORG 0x000
goto Start
Start
bsf STATUS,RP0
clrf TRISB
bcf STATUS,RP0
Main
movlw b'00000001' ; зажигаем младший разряд
movwf PORTB
movlw .8
movwf cnt
Shift
call Delay150
bcf STATUS,C ; сдвигаем огонёк влево
rlf PORTB,f
decfsz cnt,f
goto Shift
goto Main
Delay150
movlw .150
movwf d1
DL1 movlw .200
movwf d2
DL2 nop
decfsz d2,f
goto DL2
decfsz d1,f
goto DL1
return
END
Пояснения
- Команда
rlfсдвигает байт влево через флаг переноса C. Поэтому перед каждым сдвигом переносом управляем сами:bcf STATUS,C. - Скорость бега задаётся подпрограммой задержки — уменьшите константы, и огонь побежит быстрее.
- Ток одного вывода PIC ограничен (около 20 мА), а суммарный ток порта — тоже. Резисторы 330 Ом обязательны.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.