.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