;4MHz

.def  tmp 	 =r16
.def  tmp1 	 =r17
.def lcddata     =r21
.def data	 =r22

.equ e=1
.equ rs=2

;PC0..PC3 - D0..D3
;PB1 - e 
;PB2 - rs




lcdinit:
	push tmp1
	push lcddata
	ldi tmp1, 0
        ldi r30,low(InitData*2)
	ldi r31, high(InitData*2)
init:	
        lpm lcddata, Z+
	ldi tmp1, '$'
	cpse lcddata, tmp1
	rcall  WrCMD
	cpi lcddata, 0b00010000
	breq d1500
	rcall delay40mks
naz:
        ldi tmp1, '$'
	cpse tmp1, lcddata
	rjmp init
   	pop lcddata
   	pop tmp1
	ret


d1500:
 	rcall delay1500mks
 	rcall delay40mks
	rjmp naz



InitData:
.db 0b11000000, 0b00100000
.db 0b11000000, 0b00000000
.db 0b11000000, 0b00000000
.db 0b00010000, 0b00000000, '$'

WrCMD:
	push lcddata
	swap lcddata
	sbi portB, e
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	out portc, lcddata
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	cbi PortB, e
	pop lcddata
	ret

write:
	push lcddata
	swap lcddata
	sbi portB, e
	sbi portB, rs
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	out portc, lcddata
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	cbi PortB, e
	cbi portB, rs
	pop lcddata
	ret

WriteLn:
	push lcddata
	push tmp1
Ln:
	rcall delay40mks	
	rcall delay40mks
	lpm lcddata, Z+
	ldi tmp1, '$'
	cpse lcddata, tmp1
	rjmp wr
re:
	cpse lcddata, tmp1
	rjmp Ln
	pop tmp1
	pop lcddata
        ret
wr:
	rcall  write
	swap lcddata
	rcall  write
	rjmp re

longDelay:
	ldi tmp, 255
	
d11:
	ldi tmp1, 0xff
	dec tmp
	cpi tmp, 0
	brne d12
	ret
d12:
	dec tmp1
	cpi tmp1, 0
	breq d11
	brne d12
	ret

Delay40mks:
	push Tmp
   	ldi Tmp,0
Loop:
	dec Tmp
	brne Loop
      	pop Tmp
      	ret


Delay1500mks:
	push Tmp
	push Tmp1
      	ldi Tmp,0
	ldi Tmp1,20
Loop3:
	dec Tmp
	brne Loop3
	dec Tmp1
	brne Loop3
      	pop Tmp1
	pop Tmp
      	ret
