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

Проект 13. Счётчик 0…99 на индикаторах

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

Задача

Считать от 0 до 99 с интервалом около секунды и показывать число на двух индикаторах.

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

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

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

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

ВыводПодключение
RB0…RB6сегменты, общая шина через 330 Ом
RA0 / RA1ключи катодов разрядов
MCLRчерез 10 кОм на +5 В

Алгоритм

  1. Хранить единицы и десятки в отдельных переменных.
  2. Около секунды непрерывно обновлять оба разряда динамической индикацией.
  3. Увеличить единицы; при достижении 10 обнулить их и увеличить десятки.
  4. При достижении 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.