Задача
Считать секунды от 00 до 99, запуская и останавливая счёт кнопкой.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- два индикатора с общим катодом
- 7 резисторов 330 Ом
- 2 транзисторных ключа
- кнопка + резистор 10 кОм
Схема подключения
| Вывод | Подключение |
|---|---|
| RB0…RB6 | сегменты обоих разрядов |
| RA0 / RA1 | ключи катодов разрядов |
| RA2 | кнопка пуск/стоп, подтяжка 10 кОм |
Алгоритм
- Хранить флаг работы: считаем или стоим.
- Непрерывно обновлять индикацию и попутно опрашивать кнопку.
- По нажатию инвертировать флаг работы.
- Если счёт разрешён — раз в секунду увеличивать показания.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p24.asm · p24.hex (готовая прошивка).
;=======================================================
; Проект 24. Секундомер 00..99 с кнопкой «пуск/стоп»
; PIC16F84A, 4 МГц
; Сегменты RB0..RB6, разряды RA0/RA1, кнопка RA2
;=======================================================
LIST p=16F84A
#include <p16f84a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
cblock 0x0C
d1, tens, ones, loops, run
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
movlw b'00000100' ; RA2 — вход (кнопка)
movwf TRISA
bcf STATUS,RP0
clrf tens
clrf ones
clrf run ; 0 — стоп, 1 — счёт
Main
movlw .100 ; ~1 секунда индикации
movwf loops
Show
call Digits
call CheckKey
decfsz loops,f
goto Show
movf run,w ; если стоим — не считаем
btfsc STATUS,Z
goto Main
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
goto Main
Digits
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
return
CheckKey
btfsc PORTA,2
return
call Delay5ms ; антидребезг
btfsc PORTA,2
return
movlw .1
xorwf run,f ; пуск/стоп
WaitRel
btfss PORTA,2
goto WaitRel
return
Delay5ms
movlw .250
movwf d1
D5 nop
nop
nop
nop
nop
decfsz d1,f
goto D5
return
END
Пояснения
- Опрос кнопки встроен в цикл индикации, поэтому дисплей не гаснет и реакция на нажатие остаётся быстрой.
- Секунда отсчитывается числом циклов индикации — приём проще таймера и достаточно точен для учебного прибора.
- Для метрологической точности счёт времени переносят на TMR0 с прерыванием, как в следующем проекте.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.