Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
.MACRO LDIZ ; Загрузка двойного значения в регистр Z
ldi r30, low (@0)
ldi r31, high (@0)
.ENDMACRO
;--------------------------------------------------------
; описываем переменные и связанные с ними регистры
; Касаемо ЛСД дисплея
;--------------------------------------------------------
.equ LCD_A0 = PA3; данные/команда управления
.equ LCD_E1 = PA2; строб данных - первый кристалл
.equ LCD_E2 = PA1; строб данных - второй кристалл
.equ LCD_RW = PA0; запись/чтение на ЛСД
; .equ LCD_RES = PA4; сброс ЛСД дисплея - ОПЦИОНАЛЬНО - его нет в наличии !!!!
.equ LCD_COMMAND_PORT = PORTA; порт команд
.equ LCD_PORT = PORTB; вывод данных - на порт ЛСД
.equ LCD_LED = PD0; включение подсветки ЛСД
.equ LCD_LED_P = PORTD; порт подсветки ЛСД
;--------------------------------------------------------
;====================================================================================== ;********************************************************************************* ;***************************************************************************************************** ;*****************************************************************************************************
; установка порта А
clr a;
out PORTA,a;
ldi a, (1<
; установка порта B
clr a;
out PORTB,a;
ldi a, 0xFF;
out DDRB,a; порт B - на вывод!!!!!
;*********************************************************************************
; программа инициализации LCD
;======================================================================================
INIT_LCD:
push a;
push b;
;Комментарии из-за отсутствия физического ресета у дисплея
; in b, PORTA;
; cbr b,(1<
; ldi a, 10;
; rcall PAUSE_1mksXa; ждем 10 мкс
; sbr b,(1<
; ldi a, 2;
; rcall PAUSE_10msXa; ждем 20 мс
; подаем процессору ЖК команду RMW
ldi a, 0b11100000;
RCALL VIVOD_LCD;
; подаем процессору ЖК команду режима работы
ldi a, 0b10100100; обычное управление
RCALL VIVOD_LCD;
; подаем процессору ЖК команду выбора мультиплекса
ldi a, 0b10101001; модуль МТ-12232В
RCALL VIVOD_LCD;
; подаем процессору ЖК команду включения дисплея
ldi a, 0b10101111; включаем дисплей
RCALL VIVOD_LCD;
; подаем процессору ЖК команду установки верхней строки дисплея
ldi a, 0b11000000; да самая нулевая и есть нулевая
RCALL VIVOD_LCD;
; подаем процессору ЖК команду установки столбца SET ADRESS
ldi a, 0b00000000; столбец - нулевой (X)
RCALL VIVOD_LCD;
; подаем процессору ЖК команду установки столбца SET PAGE
ldi a, 0b10111010; столбец - 0 (Y)
RCALL VIVOD_LCD;
pop b;
pop a;
ret;
;подпрограмма вывода на порт В содержащегося в регистре b и паузы
;======================================================================================
VIVOD_LCD:
push b;
out PORTB, a;
in b, porta;
cbr b, (1<
nop;
nop;
sbr b, (1<
nop;
nop;
nop;
nop;
cbr b, (1<
pop b;
RET;
;======================================================================================
; программа регенерации из ОЗУ в ЛСД дисплей
;*********************************************************************************
REFRESH_LCD:
push a;
in a, SREG
push a; запомнили значение регистра состояния
push b;
push c;
push d;
push yl;
push yh;
push zl;
push zh;
ldi c, 03; четыре строки, но с указателем....
refr1:
; подаем процессору ЖК команду снятие флага RMW END
ldi a, 0b11101110;
RCALL VIVOD_LCD;
; подаем процессору ЖК команду установки столбца SET ADRESS
ldi a, 0b00000000; столбец - нулевой (X)
RCALL VIVOD_LCD;
; подаем процессору ЖК команду установки столбца SET PAGE
ldi a, 0b10111000; столбец
or a,c;
RCALL VIVOD_LCD;
; выводим побайтно
ldi b, 60;
refr2:
LDIZ LCD_data;
add zl,b;
brcc prop_refr1; если переноса не было, то старш не увеличиваем
inc zh;
prop_refr1:
ldi a, 3;
sub a,c; надо получить увеличение на строку - 128 байт
ror a; если флаг с - то устанавливаем 7 бит
brcc prop_refr2; если переноса не было, то старш не увеличиваем
sbr ZL,128;
prop_refr2:
ror a;
brcc prop_refr3; если переноса не было, то старш не увеличиваем
inc zh;
prop_refr3:
; итак, имеем адрес ОЗУ и установленную позицию дисплея
push b;
LD a, Z;
out PORTB, a; вывели на кристалл 2
in b, porta;
sbr b, (1<
nop
nop
sbr b, (1<
nop
nop
nop
nop
cbr b, (1<
nop
nop
adiw ZL, 61;
LD a,Z;
out PORTB, a; вывели на кристалл 1
sbr b, (1<
nop
nop
nop
nop
cbr b, (1<
pop b;
dec b;
brmi prop_per_refr_1;
jmp refr2; отрабатываем 61 байт
prop_per_refr_1:
dec c;
brmi prop_per_refr_2;
jmp refr1; отрабатываем 4 строки
prop_per_refr_2:
pop zh;
pop zl;
pop yh;
pop yl;
pop d;
pop c;
pop b;
pop a;
out SREG,a; восстановили значение регистра состояния
pop a;
ret;
;*********************************************************************************
PAUSE_10msXa:
push zh;
push zl;
push a;
pause_1_sec_m2:
ldi Zl, low (Quartz/400); задаем время задержки
ldi Zh, high (Quartz/400);
pause_1_sec_metka:
sbiw Zl,1; 2 такта
brne pause_1_sec_metka; 2 такта
dec a;
wdr;
brne pause_1_sec_m2;
pop a;
pop zl;
pop zh;
ret;
;*****************************************************************************************************
; Временная задержка 1 мkсек умноженная на а
;*****************************************************************************************************
PAUSE_1mksXa:
push a;
pause_1_sec_m4:
dec a; 1
nop;1
nop;1
nop;1
nop;1
nop;1
brne pause_1_sec_m4;2
pop a;
ret;
;*****************************************************************************************************
Ответы