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

Проект 18. Бегущая строка на матрице 8×8

Изображение шире экрана и плавно уезжает влево. Проект показывает кольцевую адресацию буфера — приём, на котором строятся все бегущие строки.

Задача

Прокручивать изображение по матрице справа налево.

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

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

  • ATmega8
  • кварц 8 МГц + 2×22 пФ
  • матрица 8×8
  • дешифратор 74HC138
  • 8 резисторов 330 Ом

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

ВыводПодключение
PB0…PB7строки матрицы
PD0…PD2адрес столбца на дешифратор

Алгоритм

  1. Хранить в памяти программ шестнадцать столбцов изображения.
  2. Выводить восемь столбцов начиная с текущего смещения.
  3. Показать положение несколько десятков кадров.
  4. Увеличить смещение и повторить.

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

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

;=======================================================
; Проект 18. Бегущая строка на матрице 8x8
; ATmega8, 8 МГц. PB0..PB7 — строки, PD0..PD2 — адрес столбца
; Буфер из 16 столбцов, кольцевая адресация
;=======================================================
.include "m8def.inc"
.def    temp   = r16
.def    col    = r17
.def    shift  = r18
.def    frames = r19
.def    idx    = r20
.def    d1     = r21

.cseg
.org    0x0000
        rjmp    RESET

IMG:    .db 0b01111110, 0b00010001, 0b00010001, 0b01111110
        .db 0b00000000, 0b01111111, 0b01001001, 0b01001001
        .db 0b00000000, 0b00111110, 0b01000001, 0b01000001
        .db 0b00100010, 0b00000000, 0b00000000, 0b00000000

RESET:
        ldi     temp, low(RAMEND)
        out     SPL, temp
        ldi     temp, high(RAMEND)
        out     SPH, temp
        ldi     temp, 0xFF
        out     DDRB, temp
        ldi     temp, 0x07
        out     DDRD, temp
        clr     shift

MAIN:
        ldi     frames, 30              ; сколько кадров держать положение
FRAME:
        clr     col
SCAN:
        mov     idx, col                ; столбец экрана
        add     idx, shift              ; плюс текущее смещение
        andi    idx, 0x0F               ; кольцо из 16 столбцов
        ldi     ZL, low(IMG<<1)
        ldi     ZH, high(IMG<<1)
        add     ZL, idx
        clr     temp
        adc     ZH, temp
        lpm     temp, Z
        out     PORTB, temp
        out     PORTD, col
        rcall   DELAY1MS
        clr     temp
        out     PORTB, temp
        inc     col
        cpi     col, 8
        brne    SCAN
        dec     frames
        brne    FRAME

        inc     shift                   ; сдвигаем строку
        andi    shift, 0x0F
        rjmp    MAIN

DELAY1MS:
        ldi     d1, 250
A1:     nop
        nop
        nop
        nop
        nop
        nop
        dec     d1
        brne    A1
        ret

Пояснения

  • Кольцевая адресация делается маской andi idx, 0x0F — индекс остаётся в пределах 0…15, и буфер замыкается сам на себя.
  • Скорость задаётся числом кадров на положение: больше кадров — медленнее бег.
  • Экран работает как «окно» в длинный буфер: индекс равен сумме номера столбца и смещения.

Что дальше

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