Дипломная работа: Разработка светодиодной матрицы
org
0
;********
Установка направл-я работы порта A: RA7, RA6 - выходы, RA5, RA4, RA3 - входы,
RA2, RA1, RA0 - выходы
;********
Установка направл-я работы порта B: RB7, RB6, RB5, RB4, RB3, RB2 - выходы, RB1,
RB0 - входы *********
start
movlw .7 ;
movwf
Cmcon ; выключить компараторы и включить эти пины как цифровые входы/выходы
clrf
PortA ; инициализация защелок порта А
movlw
.248 ; 11111000
movwf
PortB ; инициализация защелок порта В
bsf
Status,5 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status).
movlw
.49 ; Записать конфигурацию порта A в аккумулятор (W). .49=00110001
movwf
TrisA ; Скопировать конфигурацию порта А из W в регистр TrisA
movlw
.7 ; Записать конфигурацию порта В в аккумулятор (W). .3=00000111
movwf
TrisB ; Скопировать конфигурацию порта B из W в регистр TrisB.
bcf
Status,0 ; Сбросить флаг переноса (С) (после старта он может быть любым)
;********
Загрузка данных для фреймов из EEPROM в ОЗУ
*******************************************************
;---------
Сначала прочитаем первый байт - узнаем, сколько фреймов надо считать
------------------
movlw
.0 ; банк менять не надо, мы уже в первом банке
movwf
EEADR ; установить адрес для чтения из EEPROM
bsf
EECON1,0 ; чтение
movf
EEDATA,0 ; запись прочитанного байта в аккумулятор
bcf
Status,5 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
movwf
Fr_kol ; сохранение прочитанного байта в Fr_kol
;--------
Fr_kol*5+1 - узнаем сколько байт надо считать --------------------------
rlf
Fr_kol,0 ; умножаем на 2
movwf
Temp
rlf
Temp,0 ; еще на 2 (после этой команды в аккумуляторе Fr_kol*4)
addwf
Fr_kol,0 ; после этого в аккумуляторе Fr_kol*5
movwf
Temp ; сохраняем это значение в Temp
incf
Temp,1 ; теперь Temp=Fr_kol*5+
;----------
Считываем Fr_kol*5+1 байт ----------------------------------------------
movlw
28h ; считанные данные сохраняем начиная с этого адреса (первый байт в
Fr_cikl_kol и далее...)
movwf
FSR ; адрес для косвенной адресации
movlw
.1 ; начинаем читать EEPR
movwf
Adr ; с адреса 1
zagruzka
bsf Status,5 ; перейти в первый банк
movwf
EEADR ; загружаем из аккумулятора адрес для чтения из EEPROM
bsf
EECON1,0 ; чтение
movf
EEDATA,0 ; запись прочитанного байта в аккумулятор
bcf
Status,5 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
movwf
INDF ; сохраняем считанный байт по адресу, записанному в FSR
incf
FSR,1 ; увеличиваем адрес ОЗУ
incf
Adr,1 ; увеличиваем адрес EEPROM
movf
Adr,0 ; загружаем адрес EEPROM в аккумулятор
decfsz
Temp,1 ; если считали все байты - следующая команда пропускается
goto
zagruzka
;**************************************************************************************************
;********
Основная прога
**************************************************************************
effect
movlw 29h ; загружаем адрес начала первого фрейма в ОЗУ (2h) в переменную Adr
movwf
Adr ;
movf
Fr_kol,0 ; загружаем кол-во фреймов
movwf
Fr_sch ; в счетчик фреймов
show
movf Fr_cikl_kol,0 ; загружаем кол-во показов одного фрейма
movwf
Fr_cikl ; в счетчик показов фрейма
povtor
call show_frame ; показываем один фрейм Fr_cikl кол-во раз
decfsz
Fr_cikl,1
goto
povtor
movlw
.5 ; переходим к следующему фрейму (сдвигаем Adr на 5)
addwf
Adr,1
decfsz
Fr_sch,1 ; уменьшаем счетчик фреймов для показа
goto
show ; если не все наборы показаны, то переходим к следующему
goto
effect ; если все, то начинаем сначала
;*********************************************************************************************
;*********
Процедура показа одного фрейма
****************************************************
show_frame
movf Adr,0 ; загружаем в FSR адрес начала фрейма
movwf
FSR
movlw
b'00000001' ; начинаем с первой строки
movwf
Strok
show_next
movf INDF,0 ; загружаем набор столбцов для выбранной строки
movwf
Stolb ; аккумулятор в stolb
call
in_ports
call
pause
call
erase
incf
FSR,1 ; следующий набор строк
rlf
Strok,1 ; переходим на следующую строку
btfss
Strok,5 ; если 5-й бит strok = 1, то следующая команда пропускается
goto
show_next
return
;********
Процедура включения строк и столбцов в соответствии с байтами Strok и Stolb
************
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 Cr
movwf
T_int ; загрузить кол-во циклов задержки
cikl3
decfsz T_int,1 ; если T_int = 0, следующая комада пропускается
goto
cikl3 ; внутренний цикл
return
;******
Гашение всех светодиодов ***********************************
erase
movf Strok,0
movwf
Temp
movlw
.0
movwf
Stolb
movwf
Strok
call
in_ports
movf
Temp,0
movwf
Strok
return
;*******************************************************************************************************
org
2100h ; EEPROM память
de
.6, .40 ; кол-во фреймов и кол-во показов одного фрейма (скорость)
de
b'00000100', b'00000100', b'00011111', b'00000100', b'00000100' ; первый фрейм
de
b'00001000', b'00000101', b'00001110', b'00010100', b'00000010' ; второй фрейм
de
b'00001000', b'00001011', b'00000100', b'00011010', b'00000010' ; третий фрейм
de
b'00010001', b'00001010', b'00000100', b'00001010', b'00010001' ; четвертый
фрейм
de
b'00000010', b'00011010', b'00000100', b'00001011', b'00001000' ; пятый фрейм
de
b'00000010', b'00010100', b'00001110', b'00000101', b'00001000' ; шестой фрейм
end
;--------------------------------------------------------------------------------------------------------------------------
ПРИЛОЖЕНИЕ
Д
Схема
электрическая принципиальная светодиодной матрицы

|