Sample-kod till LCD-display

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Sample-kod till LCD-display

Inlägg av PaNiC »

Skulle uppskatta lite kod i AVR Assembler för att skriva på LCD-display. Fick inte rätt på det när jag provade att skriva egen enligt instruktionerna i word-dokumentet i LCD-forumet.

Det får gärna vara 4bits-mode och med kommentarer så jag ser vad varje rad gör.
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg av Melker »

Jag har gjort ett för 8bitars interface i assambler för ett antal månader sedan, dock så är väl inte koden den bästa och inte heller kommentarerna. Kan nog lägga upp den i fall du vill ha den.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Allt är intressant :).
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg av Melker »

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
Skriv svar