Наш магазин на eBay Наш магазин на AliExpress Наш канал в telegram

Световые эффекты для светодиодной матрицы. Эффект 1 — движущиеся строки и столбцы

светодиодная матрица

Ниже описана простейшая программа (для PIC16F628A), реализующая световой эффект поочередно загорающихся строк и столбцов для самодельной светодиодной матрицы 5х5.

Напомню, как устроена наша светодиодная матрица:

Контроллер управляет драйверами строк и столбцов светодиодной матрицы, в качестве которых выступают обычные биполярные транзисторы.

Чтобы подключить строки 1, 2, 3, 4, 5 к шине питания — нужно подать "1" на выходы контроллера RA2, RA3, RA1, RA7, RA6 соответственно, а для того, чтобы подключить столбцы 1, 2, 3, 4, 5 к нулевой шине (к земле) — нужно подать "0" на выходы контроллера RB3, RB4, RB5, RB6, RB7 соответственно.

Светодиод загорается в том случае, если он подключен и к питанию и к земле (то есть если строка, в которой он находится, подключена к питанию, а столбец, в котором он находится, подключен к земле).

Алгоритм:

Блок-схема алгоритма управления светодиодной матрицей

Текст программы под катом

 list    p = 16f628a
 __config 03F30h
;*** Переменные ******************************************
   CBLOCK 0x20   ; Начальный адрес блока пользовательской памяти
      T_ext      ;таймер внешнего цикла
      T_int      ;таймер внутреннего цикла
      Strok      ;байт строки
      Stolb      ;байт столбца
   ENDC
;**** Константы / Адреса регистров ************************
Cr1    equ  .200      ; длительность 1-й задержки 200 мкс
Cr2    equ  .150      ; длительность 2-й задержки 150х200 мкс
Status equ  03h       ; выбор банка
TrisA  equ  05h       ; выбор направления работы выводов порта А
TrisB  equ  06h       ; выбор направления работы выводов порта В
PortA  equ  05h       ; управление защелками порта А
PortB  equ  06h       ; управление защелками порта В
Cmcon  equ  1Fh       ; вкл/выкл компараторов
F      equ  1         ; результат направить в регистр
;*********************************************************
 
          org 0
;*********************************************************
;*** RA7, RA6 - выходы, RA5, RA4, RA0 - входы, RA3, RA2, RA1 - выходы
;*** RB7, RB6, RB5, RB4, RB3 - выходы, RB2, RB1, RB0 - входы
start movlw  .7
      movwf  Cmcon    ; выключить компараторы
      clrf   PortA    ; инициализация защелок порта А
      movlw  .248     ; 11111000
      movwf  PortB    ; инициализация защелок порта В
      bsf    Status,5 ; перейти в 1-й банк
      movlw  .49      ; конфигурация порта A: .49=00110001
      movwf  TrisA    ; загрузить конфигурацию порта А
      movlw  .7       ; конфигурация порта В: .7=00000111
      movwf  TrisB    ; загрузить конфигурацию порта B
      bcf    Status,5 ; перейти в 0-й банк
;*** ЭФФЕКТ 1 ********************************************
eff1  movlw  b'00011111' ; включаем все строки
      movwf  Strok
      movlw  b'00000001' ; и первый столбец
      movwf  Stolb
;--- Включаем светодиоды ---
cikl_stolb1
      call   in_ports
      call   pause
      rlf    Stolb,1  ; переходим на следующий столбец
      btfss  Stolb,5  ; если 5 бит stolb = 1 - пропускаем команду
      goto   cikl_stolb1
;---------------------------
      movlw  b'00000001' ; включаем первую строку
      movwf  Strok
      movlw  b'00011111' ; и все столбцы
      movwf  Stolb
;--- Включаем светодиоды ---
cikl_strok1
      call   in_ports
      call   pause
      rlf    Strok,1        ; переходим на следующую строку
      btfss  Strok,5        ; если 5 бит stolb = 1 - пропускаем команду
      goto   cikl_strok1
      goto   eff1
;*********************************************************
;*** Процедура включения строк и столбцов
in_ports
      btfsc  Stolb,0     ; если 0-й бит stolb = 0 - пропускаем команду
      bcf    PortB,3     ; RB3=0 - вкл.1 столбец
      btfss  Stolb,0     ; если 0-й бит stolb =1 - пропускаем команду
      bsf    PortB,3     ; RB3=1 - выкл. 1 столбец
;---------------------------
      btfsc  Stolb,1     ; если 1-й бит stolb = 0 - пропускаем команду
      bcf    PortB,4     ; RB4=0 - вкл. 2 столбец
      btfss  Stolb,1     ; если 1-й бит stolb =1 - пропускаем команду
      bsf    PortB,4     ; RB4=1 - выкл. 2 столбец
;---------------------------
      btfsc  Stolb,2     ; если 2-й бит stolb = 0 - пропускаем команду
      bcf    PortB,5     ; RB5=0 - вкл. 3 столбец
      btfss  Stolb,2     ; если 2-й бит stolb =1 - пропускаем команду
      bsf    PortB,5     ; RB5=1 - выкл. 3 столбец
;---------------------------
      btfsc  Stolb,3     ; если 3-й бит stolb = 0 - пропускаем команду
      bcf    PortB,6     ; RB6=0 - вкл. 4 столбец
      btfss  Stolb,3     ; если 3-й бит stolb =1 - пропускаем команду
      bsf    PortB,6     ; RB6=1 - выкл. 4 столбец
;---------------------------
      btfsc  Stolb,4     ; если 4-й бит stolb = 0 - пропускаем команду
      bcf    PortB,7     ; RB7=0 - вкл. 5 столбец
      btfss  Stolb,4     ; если 4-й бит stolb =1 - пропускаем команду
      bsf    PortB,7     ; RB7=1 - выкл. 5 столбец
;--- Строки -----------
      btfsc  Strok,0     ; если 0-й бит strok = 0 - пропускаем команду
      bsf    PortA,2     ; RA2=1 - вкл.1 строку
      btfss  Strok,0     ; если 0-й бит strok =1 - пропускаем команду
      bcf    PortA,2     ; RA2=0 - выкл.1 строку
;---------------------------
      btfsc  Strok,1     ; если 1-й бит strok = 0 - пропускаем команду
      bsf    PortA,3     ; RA3=1 - вкл.2 строку
      btfss  Strok,1     ; если 1-й бит strok =1 - пропускаем команду
      bcf    PortA,3     ; RA3=0 - выкл.2 строку
;---------------------------
      btfsc  Strok,2     ; если 2-й бит strok = 0 - пропускаем команду
      bsf    PortA,1     ; RA1=1 - вкл.3 строку
      btfss  Strok,2     ; если 2-й бит strok =1 - пропускаем команду
      bcf    PortA,1     ; RA1=0 - выкл.3 строку
;---------------------------
      btfsc  Strok,3     ; если 3-й бит strok = 0 - пропускаем команду
      bsf    PortA,7     ; RA7=1 - вкл.4 строку
      btfss  Strok,3     ; если 3-й бит strok =1 - пропускаем команду
      bcf    PortA,7     ; RA7=0 - выкл.4 столбец
;---------------------------
      btfsc  Strok,4     ; если 4-й бит strok = 0 - пропускаем команду
      bsf    PortA,6     ; RA6=1 - вкл.5 строку
      btfss  Strok,4     ; если 4-й бит strok =1 - пропускаем команду
      bcf    PortA,6     ; RA6=0 - выкл.5 строку
      return
;*********************************************************
;*** Процедура Паузы *************************************
pause movlw  Cr2
      movwf  T_ext       ; загрузить значение для внешнего цикла
cikl2 movlw  Cr1
      movwf  T_int       ; загрузить значение для внутреннего цикла
cikl3 decfsz T_int,1     ; если T_int = 0 - следующ. команда пропуск-ся
      goto   cikl3       ; внутренний цикл
      decfsz T_ext,1     ; если T_ext = 0 - следующ. команда пропуск-ся
      goto   cikl2       ; внешний цикл
      return
 end

[свернуть]

Скачать готовую прошивку и asm-файл

Добавить комментарий