![]() Ниже описана простейшая программа (для 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 |