Задача
Последовательно выводить цифры от 0 до 9 на семисегментный индикатор.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- индикатор с общим катодом
- 7 резисторов 330 Ом
- резистор 10 кОм
Схема подключения
| Вывод | Подключение |
|---|---|
| RB0…RB6 | сегменты a…g, каждый через резистор 330 Ом |
| Общий катод | на GND |
| MCLR | через 10 кОм на +5 В |
Алгоритм
- Составить таблицу кодов: каждой цифре — свой набор сегментов.
- Получить код командой
addwf PCL,f— вычисляемый переход по таблице. - Вывести код в порт B и выдержать паузу.
- Увеличить цифру, после 9 вернуться к нулю.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p11.asm · p11.hex (готовая прошивка).
;=======================================================
; Проект 11. Статический 7-сегментный индикатор
; PIC16F84A, 4 МГц. Индикатор с ОБЩИМ КАТОДОМ на RB0..RB6
; Счёт 0..9 с интервалом ~1 с
;=======================================================
LIST p=16F84A
#include <p16f84a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
cblock 0x0C
d1, d2, digit
endc
ORG 0x000
goto Start
;--- таблица сегментов (общий катод): dp g f e d c b a ---
Table
addwf PCL,f ; смещение по W
retlw b'00111111' ; 0
retlw b'00000110' ; 1
retlw b'01011011' ; 2
retlw b'01001111' ; 3
retlw b'01100110' ; 4
retlw b'01101101' ; 5
retlw b'01111101' ; 6
retlw b'00000111' ; 7
retlw b'01111111' ; 8
retlw b'01101111' ; 9
Start
bsf STATUS,RP0
clrf TRISB ; порт B — выходы на сегменты
bcf STATUS,RP0
clrf digit
Main
movf digit,w
call Table ; получаем код сегментов
movwf PORTB
call Delay1s
incf digit,f
movf digit,w
xorlw .10 ; после 9 — снова 0
btfsc STATUS,Z
clrf digit
goto Main
Delay1s
movlw .255
movwf d1
DL1 movlw .255
movwf d2
DL2 nop
nop
nop
nop
decfsz d2,f
goto DL2
decfsz d1,f
goto DL1
return
END
Пояснения
- Таблица работает через изменение счётчика команд:
addwf PCL,fприбавляет W к адресу, и выполняется нужная строкаretlw. - Вся таблица должна помещаться в одну страницу памяти (256 слов), иначе переход уйдёт не туда.
- Для индикатора с общим анодом коды нужно инвертировать — сегмент зажигается нулём.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.