Задача
Прокручивать изображение по матрице справа налево.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- матрица 8×8
- дешифратор 74HC138
- 8 резисторов 330 Ом
- ключи столбцов
Схема подключения
| Вывод | Подключение |
|---|---|
| RB0…RB7 | строки матрицы через резисторы |
| RA0…RA2 | адрес столбца на дешифратор |
Алгоритм
- Хранить в таблице шестнадцать столбцов изображения.
- Выводить восемь столбцов начиная с текущего смещения.
- Показать положение несколько десятков кадров.
- Увеличить смещение на единицу и повторить.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p18.asm · p18.hex (готовая прошивка).
;=======================================================
; Проект 18. Бегущая строка на светодиодной матрице 8x8
; PIC16F84A, 4 МГц
; PORTB — строки, RA0..RA2 — адрес столбца (74HC138)
;=======================================================
LIST p=16F84A
#include <p16f84a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
cblock 0x0C
d1, col, shift, frames, tmp
endc
ORG 0x000
goto Start
;--- 16 столбцов бегущего образа ---
Font
addwf PCL,f
retlw b'01111110'
retlw b'00010001'
retlw b'00010001'
retlw b'01111110'
retlw b'00000000'
retlw b'01111111'
retlw b'01001001'
retlw b'01001001'
retlw b'00000000'
retlw b'00111110'
retlw b'01000001'
retlw b'01000001'
retlw b'00100010'
retlw b'00000000'
retlw b'00000000'
retlw b'00000000'
Start
bsf STATUS,RP0
clrf TRISB
clrf TRISA
bcf STATUS,RP0
clrf PORTB
clrf shift
Main
movlw .30 ; сколько кадров держать положение
movwf frames
Frame
clrf col
Scan
movf col,w ; столбец экрана
addwf shift,w ; + текущее смещение
andlw 0x0F ; кольцевой проход по 16 столбцам
call Font
movwf PORTB
movf col,w
movwf PORTA
call Delay1ms
clrf PORTB
incf col,f
movf col,w
xorlw .8
btfss STATUS,Z
goto Scan
decfsz frames,f
goto Frame
incf shift,f ; сдвигаем строку
movf shift,w
andlw 0x0F
movwf shift
goto Main
Delay1ms
movlw .200
movwf d1
D1 nop
decfsz d1,f
goto D1
return
END
Пояснения
- Кольцевая адресация делается маской:
andlw 0x0Fоставляет индекс в пределах 0…15, и буфер замыкается сам на себя. - Скорость задаётся числом кадров на одно положение: больше кадров — медленнее бег.
- Индекс столбца в таблице — это сумма номера столбца экрана и смещения; экран как бы «окно» в длинный буфер.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.