;====================================================================

.device ATmega8
.nolist
.include "m8def.inc"
.list

.def temp=r16
.equ baud=103

;====================================================================

Init:
;инициализация стека
ldi r16,low(RAMEND) 
out SPL,r16
ldi r16,high(RAMEND) 
out SPH,r16
;настройка входов/выходов
ldi r16,0b11111111
out DDRB,r16
ldi r16,0b00000000
out DDRC,r16
ldi r16,0b11110010
out DDRD,r16
;конфигурация портов
ldi r16,0b00000000
out PORTB,r16
ldi r16,0b00000000
out PORTC,r16
ldi r16,0b00001101
out PORTD,r16
;настройка АЦП
ldi r16,0b01100000
out ADMUX,r16
ldi r16,0b10000111
out ADCSRA,r16
;выключение компаратора
sbi ACSR,ACD
;настройка УАРТ
ldi r16,0b00000000
out UCSRC,r16
ldi r16,high(baud)
out UBRRH,r16
ldi r16,low(baud)
out UBRRL,r16
ldi r16,0b00001100           ;[RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8]
out UCSRB,r16
ldi r16,0b10100110           ;9 бит, бит четности, 1 стоп бит
out UCSRC,r16
;инициализация ЖКИ
ldi r25,$33                  ;lcd_com(0x33);
rcall lcdc
ldi r16,250                  ;pause(25000);
rcall pause
ldi r25,$32                  ;lcd_com(0x32);
rcall lcdc
ldi r25,$28                  ;lcd_com(0x28);
rcall lcdc
ldi r25,$08                  ;lcd_com(0x08);
rcall lcdc
ldi r25,$01                  ;lcd_com(0x01);
rcall lcdc
ldi r16,250                  ;pause(50000);
rcall pause
ldi r16,250
rcall pause
ldi r25,$06                  ;lcd_com(0x06);
rcall lcdc
ldi r25,$0c                  ;lcd_com(0x0C);
rcall lcdc
;основная программа
rjmp Main

;====================================================================
  
Main:
ldi r25,$FF
rcall lcdd
rjmp Main

;====================================================================

pause:                       ;входные данные в регистре r16
ldi r18,241
ldi r17,52
dec r18
brne PC-1
dec r17
brne PC-3
dec r16
brne PC-9
ret

lcd:
in r16,PORTB                 ;PORTB &= 0x03;
ori r16,$03
out PORTB,r16
mov r16,r25                  ;PORTB |= ((p & 0XF0)>>2);
andi r16,$f0
lsr r16
lsr r16
in r15,PORTB
or r15,r16
out PORTB,r15
ldi r16,5                    ;pause(50);
rcall pause
cbi PORTB,1                  ;PORTB &= ~_BV(EN); 
ldi r16,5                    ;pause(50);
rcall pause
sbi PORTB,1                  ;PORTB |= _BV(EN);
in r16,PORTB                 ;PORTB &= 0x03;
andi r16,$03
out PORTB,r16
mov r16,r25                  ;PORTB |= (p << 2);
lsl r16
lsl r16
in r15,PORTB
or r15,r16
out PORTB,r15 
ldi r16,5					 ;pause(50);
rcall pause
cbi PORTB,1                  ;PORTB &= ~_BV(EN);
ldi r16,25                   ;pause(250);
rcall pause
ret

lcdc:
cbi PORTB,0                  ;RS = 0
nop
nop
nop
sbi PORTB,1                  ;EN = 1
rcall lcd                    ;lcd(p);
ret

lcdd:
sbi PORTB,0                  ;RS = 1
nop
nop
nop
sbi PORTB,1                  ;EN = 1
rcall lcd                    ;lcd(p);
ret

;====================================================================
