Här kommer koden! Fördröjningarna stämmer nog inte allt för bra, är nog för långa de flesta av dom, men huvudsaken är att dom inte är för korta. Databussen är ansluten till PortA och övriga pinnar till PortD. För övrigt gick denna kod på en AT90S8515 i 8MHz. Skriv om det är något du undrar över eller om något ser konstigt ut i koden, är möjligt att det finns en del fel här just nu efter lite ingrepp för att koden ska se lite förstårlig ut för andra.
PS. Citera inte direkt ovanstående medelanden, trådarna blir ondögt långa och svåra att läsa.
Koden: skrev:
;LCD-pinnar:
.equ lcd_rs = 1 ;Data eller instruktion
.equ lcd_clk = 2 ;LCD data strobe
;LCD-kommandon
.equ row_1 = 128 ;1st row at LCD
.equ row_2 = 192 ;2nd row at LCD
.equ clr_scrn = 1
lcd_init: ;Initialisera LCD
ldi temp,255
out DDRA,temp
sbi DDRD,lcd_rs
sbi DDRD,lcd_clk
rcall delay_40us
cbi PortD,lcd_rs ;Skriv instruktioner till LCD
ldi temp,0x30 ;Skriv initialiseringsraderna
out PortA,temp
rcall lcd_clock
ldi temp,64 ;5ms fördröjning
mov t2,temp
rcall delay_20ms
ldi temp,0x30
out PortA,temp
rcall lcd_clock
rcall delay_40us ;100us fördröjning
rcall delay_40us
rcall delay_40us
ldi temp,0x30
out PortA,temp
rcall lcd_clock
rcall delay_40us
ldi temp,0x38
out PortA,temp
rcall lcd_clock
rcall delay_40us
ldi temp,0b00001100 ;0x08
out PortA,temp
rcall lcd_clock
rcall delay_40us
ldi temp,0x01 ;0x01
out PortA,temp
rcall lcd_clock
rcall delay_40us
ldi temp,0x06
out PortA,temp
rcall lcd_clock
sbi PortD,lcd_rs
ldi temp,'A'
out PortA,temp
rcall lcd_clock
rcall delay_5ms
ret
lcd_cmd: ;Skriv kommando till LCD
ldi temp,255
out DDRA,temp
sbi DDRD,lcd_rs
sbi DDRD,lcd_clk
cbi PortD,lcd_rs ;Instruktion
rcall delay_40us
out PortA,command
rcall lcd_clock
rcall delay_5ms
ret
;Visa en text på LCD från programminnet
lcd_msg: ;Peka Z på första tecknet. Varje sträng ska sluta med ett #. tex .db "Hejhej!#'
ldi temp,255
out DDRA,temp
sbi PortD,lcd_rs
lcd_msg2:
rcall delay_1ms ;Loopa tills tecken är slut
lpm
mov temp,msg_temp
dec counter
breq lcd_msg_end
cpi temp,'#'
breq lcd_msg_end
adiw ZL,1
out PortA,temp
rcall lcd_clock
rjmp lcd_msg2
;Visa en text på LCD från SRAMet
lcd_msg_ram: ;Peka Z på första tecknet och counter = antalet tecken att visa
ldi temp,255
out DDRA,temp
sbi PortD,lcd_rs
lcd_msg_ram2: ;Loopa tills tecken är slut
rcall delay_1ms
ld temp,Z+
out PortA,temp
rcall lcd_clock
dec counter
breq lcd_msg_end
rjmp lcd_msg_ram2
lcd_msg_end:
rcall delay_1ms
ret
;Visa ett hextal på LCDn
lcd_byte:
ldi temp,255
out DDRA,temp
sbi PortD,lcd_rs
push data
cbr data,0b00001111
ror data
ror data
ror data
ror data
cpi data,0xA
brsh mer_10_1
ldi temp,48
add data,temp
rjmp lcd_byte2
mer_10_1:
ldi temp,55
add data,temp
lcd_byte2:
out PortA,data
rcall lcd_clock
rcall delay_1ms
pop data
cbr data,0b11110000
cpi data,0xA
brsh mer_10_2
ldi temp,48
add data,temp
rjmp tecken_slut
mer_10_2:
ldi temp,55
add data,temp
tecken_slut:
out PortA,data
rcall lcd_clock
rcall delay_5ms
ret
lcd_pointer:
ldi temp,0
out MCUCR,temp
push ZL
push ZH
ldi ZL,LOW(msg_pointer*2)
ldi ZH,HIGH(msg_pointer*2)
rcall lcd_msg
pop ZH
pop ZL
ret
lcd_clock:
nop
sbi PortD,lcd_clk
nop
nop
cbi PortD,lcd_clk
ret