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

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

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

Задача

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

Микроконтроллер: ATmega8, кварц 4 МГц. Среда: Atmel Studio / avra (или avra / Atmel Studio). Как настроить среду и прошить контроллер — в статье программирование AVR.

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

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

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

ВыводПодключение
PB0…PB6сегменты
PD0 / PD1ключи разрядов

Алгоритм

  1. Хранить единицы и десятки в отдельных регистрах.
  2. Около секунды непрерывно обновлять оба разряда.
  3. Увеличить единицы; при достижении десяти обнулить и увеличить десятки.
  4. При достижении ста сбросить счёт.

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

Код проверен ассемблером и собирается без ошибок. Скачать: a13.asm · a13.hex (готовая прошивка).

;=======================================================
; Проект 13. Счётчик 0..99 на двух индикаторах
; ATmega8, 8 МГц. Сегменты PB0..PB6, разряды PD0 и PD1
;=======================================================
.include "m8def.inc"
.def    temp  = r16
.def    tens  = r17
.def    ones  = r18
.def    d1    = r19
.def    d2    = r20
.def    loops = r21

.cseg
.org    0x0000
        rjmp    RESET

SEGTAB: .db 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110
        .db 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111

RESET:
        ldi     temp, low(RAMEND)
        out     SPL, temp
        ldi     temp, high(RAMEND)
        out     SPH, temp
        ldi     temp, 0x7F
        out     DDRB, temp
        ldi     temp, 0x03
        out     DDRD, temp
        clr     tens
        clr     ones

MAIN:
        ldi     loops, 100              ; около секунды показа
SHOW:
        rcall   DIGITS
        dec     loops
        brne    SHOW

        inc     ones                    ; счёт с переносом
        cpi     ones, 10
        brne    MAIN
        clr     ones
        inc     tens
        cpi     tens, 10
        brne    MAIN
        clr     tens
        rjmp    MAIN

DIGITS:
        cbi     PORTD, PD1
        mov     temp, tens
        rcall   SEG
        out     PORTB, temp
        sbi     PORTD, PD0
        rcall   DELAY5MS
        cbi     PORTD, PD0
        mov     temp, ones
        rcall   SEG
        out     PORTB, temp
        sbi     PORTD, PD1
        rcall   DELAY5MS
        ret

SEG:
        ldi     ZL, low(SEGTAB<<1)
        ldi     ZH, high(SEGTAB<<1)
        add     ZL, temp
        clr     temp
        adc     ZH, temp
        lpm     temp, Z
        ret

DELAY5MS:
        ldi     d2, 52
V2:     ldi     d1, 255
V1:     dec     d1
        brne    V1
        dec     d2
        brne    V2
        ret

Пояснения

  • Хранение по разрядам избавляет от деления — у AVR его нет, а двоично-десятичный счёт решается парой сравнений.
  • Пауза отсчитывается числом циклов индикации, поэтому дисплей не гаснет во время ожидания.
  • Регистры счётчиков выбраны из старшей половины (r16 и выше) — только с ними работает команда cpi.

Что дальше

Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры AVR.