Code:
.equ DPort=Portb
.equ D4=4
.equ D5=3
.equ D6=2
.equ D7=1
.equ lcdpin=pinb
.equ eport=porta
.equ rsport=portd
.equ rwport=portd
.equ ddrlcd=DDRB
.equ ddre=DDRa
.equ ddrrw=DDRa
.equ RW=1
.equ ddrRS=DDRD
.equ E=0
.equ RS=3
.org 0x170
portinit:
sbi ddrlcd,d4
sbi ddrlcd,d5
sbi ddrlcd,d6
sbi ddrlcd,d7
sbi ddrrs,rs
sbi ddre,e
sbi ddrrw,RW
ret
dataout:
rcall lcdbusy
cbi rwport,rw
nop
swap r16
sbrc r16,0
sbi dport,d4
sbrs r16,0
cbi dport,d4
sbrc r16,1
sbi dport,d5
sbrs r16,1
cbi dport,d5
sbrc r16,2
sbi dport,d6
sbrs r16,2
cbi dport,d6
sbrc r16,3
sbi dport,d7
sbrs r16,3
cbi dport,d7
rcall lcd_enable
ret
lcdinit:
cbi rsport,rs
ldi r16,0b00110000 ;init
rcall dataout
swap r16
rcall dataout
rcall lcdwait
ldi r16,0b00110000 ;init
rcall dataout
swap r16
rcall dataout
rcall lcdwait
ldi r16,0b00110000 ;init
rcall dataout
swap r16
rcall dataout
rcall lcdbusy
ldi r16,0b00101000 ;4bit;2 Zeilen;standart font
rcall dataout
swap r16
rcall dataout
rcall lcdbusy
ldi r16,0b00001111 ;LCD an;Cursor Blinken;Cursor ON
rcall dataout
swap r16
rcall dataout
rcall lcdbusy
ldi r16,0b00000110 ;set Entry Mode
rcall dataout
swap r16
rcall dataout
rcall lcdbusy
ldi r16,0b00000001 ;clear Display
rcall dataout
swap r16
rcall dataout
rcall lcdbusy
ldi r16,0b00000010 ; return Home
rcall dataout
swap r16
rcall dataout
rcall lcdbusy
sbi rsport,rs
ldi r16,'A' ; A anzeigen
rcall dataout
swap r16
rcall dataout
rcall lcdbusy
ret
lcd_enable:
sbi eport, e
nop
nop
nop
nop
nop
cbi eport, e
ret
lcdbusy:
cbi rsport,rs
sbi rwport,rw
cbi ddrlcd,d7
sbic lcdpin,d7
rjmp lcdbusy
sbi ddrlcd,d7
ret
lcdwait: ;wait routine wenn busy abfrage nicht möglich
ldi ZH,high(65535)
ldi ZL,low(65535)
rcall wait
ldi ZH,high(5535)
ldi ZL,low(5535)
rcall wait
ret
wait:
nop
nop
sbiw ZL,1
brne wait
ret
Lesezeichen