AFON // радиотехник affonya@mail.ru
← Проекты на PIC

Проект 24. Секундомер 00…99

Секундомер с индикацией и управлением одной кнопкой: нажатие запускает и останавливает счёт. Проект объединяет индикацию, опрос кнопки и отсчёт времени.

Задача

Считать секунды от 00 до 99, запуская и останавливая счёт кнопкой.

Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.

Что понадобится

  • PIC16F84A
  • кварц 4 МГц + 2×22 пФ
  • два индикатора с общим катодом
  • 7 резисторов 330 Ом
  • 2 транзисторных ключа
  • кнопка + резистор 10 кОм

Схема подключения

ВыводПодключение
RB0…RB6сегменты обоих разрядов
RA0 / RA1ключи катодов разрядов
RA2кнопка пуск/стоп, подтяжка 10 кОм

Алгоритм

  1. Хранить флаг работы: считаем или стоим.
  2. Непрерывно обновлять индикацию и попутно опрашивать кнопку.
  3. По нажатию инвертировать флаг работы.
  4. Если счёт разрешён — раз в секунду увеличивать показания.

Листинг на ассемблере

Код проверен ассемблером и собирается без ошибок. Скачать: 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.