.include "C:\AVR\Avrasm\APPNOTES\2313def.inc" .def Temp=R16 .def Temp1=R17 .def Temp2=R18 .def Temp3=R19 .def Temp4=R20 .cseg .org 0 rjmp Reset ;вектора прерываний rjmp INT_0 rjmp INT_1 rjmp Timer1_capt1 rjmp Timer1_OVF1 rjmp Timer0_OVF0 rjmp UART_RX rjmp UART_UDRE rjmp UART_TX rjmp ANA_COMP ;Reset: INT_0: INT_1: Timer1_capt1: ;Timer1_comp1: Timer1_OVF1: Timer0_OVF0: UART_RX: UART_UDRE: UART_TX: ANA_COMP: reti ;**************************************************** ; ИНИЦИАЛИЗАЦИЯ ;**************************************************** Reset: ldi Temp,0b11111111 ; настройка портов out DDRB,Temp out DDRD,Temp ldi Temp,0 out PortD,Temp ldi Temp,RamEnd ; установка указателя стека out SPL,Temp ;********************* ;Работа с LCD rcall Delay40mks ; Пауза перед включением rcall Init_LCD16s2d ; Инициализация дисплея ldi Temp,0b10000000 rcall WriteCmd ; Установка курсора ldi ZL,Low(Text01*2) ldi ZH,High(Text01*2) rcall WriteLn ; Вывод строки ldi Temp,0b11000001 rcall WriteCmd ; Установка курсора ldi ZL,Low(Text02*2) ldi ZH,High(Text02*2) rcall WriteLn ; Вывод строки ;**************************************************** ; ОСНОВНОЙ ЦИКЛ ;**************************************************** Inf: rjmp Inf ;бесконечный цикл ;**************************************************** ; Пауза ;**************************************************** Delay40mks: push Temp ldi Temp,0 Loop: dec Temp brne Loop pop Temp ret ;**************************************************** ; Пауза ;**************************************************** Delay1500mks: push Temp push Temp1 ldi Temp,0 ldi Temp1,20 Loop3: dec Temp brne Loop3 dec Temp1 brne Loop3 pop Temp1 pop Temp ret ;**************************************************** ; Инициализация LCD ;**************************************************** ;команды sbi, cbi - установка/сброс бита INIT_LCD16S2D: ldi R16,0 out PortD,R16 rcall Delay40mks ldi Temp1,16 ldi ZL,Low(LCD_INIT_DATA*2) ldi ZH,High(LCD_INIT_DATA*2) Init_next0: lpm out PortD,r0;Temp adiw ZL,1 ; AddImmedaiate to Word. Инкрементится слово. nop ;Не менее 40нс nop sbi PortD,4 nop ;Не менее 230нс nop nop nop nop nop cbi PortD,4 rcall Delay40mks dec Temp1 brne Init_next0 rcall Delay1500mks ; ldi Temp,0 ; out PortD,Temp ret LCD_INIT_DATA: ; ;8bit .db 0b00100100,0b00100100 ; 30h Установка разрядности .db 0b00100100,0b00100000 ; 20h Установка разрядности ;4bit .db 0b00100000,0b00010000 ; 28h Установка разрядности .db 0b00000000,0b00010000 ; 0Ch Выглючение дисплея .db 0b00000000,0b00101000 ; 06h Установка направления и разрешения сдвига .db 0b00000000,0b00111100 ; 0Fh Включить индикатор и мигающий курсор .db 0b00010000,0b00000000 ; Курсор домой .db 0b00000000,0b00000100 ; 01h Очистка, курсор домой ;**************************************************** ; Установка адреса для последующих операции и ; выбор оласти DDRAM. ; Входные данные: R16(Temp) - адрес DDRAM + 0x80. ; Изменяется регистр R16(Temp). ;**************************************************** WriteCmd: push Temp ;Swap Temp lsr Temp lsr Temp lsr Temp lsr Temp ;andi Temp,0b00001111 andi Temp,0b00111100 ;MAIN out PortD,Temp nop ;Не менее 40нс nop sbi PortD,4 nop ;Не менее 230нс nop nop nop nop nop cbi PortD,4 nop ;Не менее 270нс nop nop nop nop nop nop pop Temp ;andi Temp,0b00001111 andi Temp,0b00111100 ;MAIN out PortD,Temp nop ;Не менее 40нс nop sbi PortD,4 nop ;Не менее 230нс nop nop nop nop nop cbi PortD,4 rcall Delay40mks ret ;**************************************************** ; Вывод текстовой строки на дисплей. ; Входные данные: регистр Z - адрес строки в ; программной памяти. '$' - конец строки. ; Изменяется регистр R16(Temp), Z. ;**************************************************** WriteLn: lpm mov Temp,r0 cpi Temp,'$' breq WriteLnEnd adiw ZL,1 push Temp Swap Temp ;andi Temp,0b00001111 andi Temp,0b00111100 ;MAIN ;ori Temp,0b01000000 ori Temp,0b00000001 ;MAIN out PortD,Temp nop ;Не менее 40нс nop sbi PortD,4 nop ;Не менее 230нс nop nop nop nop nop cbi PortD,4 nop ;Не менее 270нс nop nop nop nop nop nop pop Temp ;andi Temp,0b00001111 andi Temp,0b00111100 ;MAIN ;ori Temp,0b01000000 ori Temp,0b00000001 ;MAIN out PortD,Temp nop ;Не менее 40нс nop sbi PortD,4 nop ;Не менее 230нс nop nop nop nop nop cbi PortD,4 rcall Delay40mks rjmp WriteLn WriteLnEnd: ret ;**************************************************** ; Всякие тексты, чтоб выводить ;**************************************************** Text01: ;.db 'I',0,0x4b,0x50,0xA5,0x43,0x54,0xB0,0xAC,0x41,0x20,0x26,'$' .db "radiokot.ru1 :)$" Text02: .db "radiokot.ru2 :)$" ;------------------------------------------------------------- .EXIT