Задача
Считать от 0 до 99 с интервалом около секунды и показывать число на двух индикаторах.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- два индикатора с общим катодом
- 7 резисторов 330 Ом
- 2 транзисторных ключа
Схема подключения
| Вывод | Подключение |
|---|---|
| RB0…RB6 | сегменты, общая шина через 330 Ом |
| RA0 / RA1 | ключи катодов разрядов |
| MCLR | через 10 кОм на +5 В |
Алгоритм
- Хранить единицы и десятки в отдельных переменных.
- Около секунды непрерывно обновлять оба разряда динамической индикацией.
- Увеличить единицы; при достижении 10 обнулить их и увеличить десятки.
- При достижении 100 сбросить счёт в ноль.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p13.asm · p13.hex (готовая прошивка).
;=======================================================
; Проект 13. Счётчик 0..99 на двух индикаторах
; PIC16F84A, 4 МГц. Сегменты RB0..RB6, разряды RA0, RA1
;=======================================================
LIST p=16F84A
#include <p16f84a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
cblock 0x0C
d1, tens, ones, loops
endc
ORG 0x000
goto Start
Table
addwf PCL,f
retlw b'00111111'
retlw b'00000110'
retlw b'01011011'
retlw b'01001111'
retlw b'01100110'
retlw b'01101101'
retlw b'01111101'
retlw b'00000111'
retlw b'01111111'
retlw b'01101111'
Start
bsf STATUS,RP0
clrf TRISB
clrf TRISA
bcf STATUS,RP0
clrf tens
clrf ones
Main
movlw .100 ; ~1 с подсветки числа
movwf loops
Show
bcf PORTA,1
movf tens,w
call Table
movwf PORTB
bsf PORTA,0
call Delay5ms
bcf PORTA,0
movf ones,w
call Table
movwf PORTB
bsf PORTA,1
call Delay5ms
decfsz loops,f
goto Show
;--- увеличиваем счётчик ---
incf ones,f
movf ones,w
xorlw .10
btfss STATUS,Z
goto Main
clrf ones ; перенос в десятки
incf tens,f
movf tens,w
xorlw .10
btfsc STATUS,Z
clrf tens ; после 99 — снова 00
goto Main
Delay5ms
movlw .250
movwf d1
D5 nop
nop
nop
nop
nop
decfsz d1,f
goto D5
return
END
Пояснения
- Хранение по разрядам избавляет от деления: у PIC нет аппаратного деления, а двоично-десятичный счёт решает задачу парой сравнений.
- Пауза отсчитывается количеством циклов индикации, а не задержкой, — дисплей не гаснет во время ожидания.
- Сравнение с десяткой сделано через
xorlw .10и проверку флага нуля.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.