För det första så lyckas jag bara initera de första 8 tecknen (det är en 1x16 teckens display) enligt databladet hanteras LCDn logiskt som en 2x8 teckens display, så jag initierar den som en två raders display, men lyckas ändå inte få igång de 8 sista tecknen, vad kan vara fel?
För det andra skriver den inte ut de tecknen som jag vill, när jag försöker skriva AB skriver den istället 00 och om jag försöker skriva ett "-tecken skriver den istället ett /-tecken. Vad kan detta bero på?
Jag kör LCDn i 4-bit mode och den är HD44780 kompatibel. LCDn jag använder är en Sharp LM161556
Jag hoppas att nån av er kan komma på en lösning, för det känns som om jag har testat allt nu....
EDIT: Desutom hoppar markören alltid två steg framåt varje gång jag initierar LCDn även fast jag försöker, förgäves, att skicka hem markören till första tecknet.
EDIT2: Här är databladet om det kanske hjälper nån att komma på en lösning
EDIT3: Jag har mixtrat runt massor nu och kommit fram till att den lyckas skriva de första 4-bitarna rätt när jag försöker skriva ett tecken, men de sista 4-bitarna blir alltid 0b1111 av nån anledning. Därav att tecknen alltid blir fel. Vad kan detta bero på?
EDIT4: Jag flyttade tråden hit till Microprocessor forumet istället för LCD forumet därför frågan kanske passar bättre här, och i hopp om att det ska finnas folk här som kan hjälpa mig.
och här följer min asm kod om nån kanske hittar nått fel där, den är lite stökig, men som sagt jag är fortfarande ganska ny på detta.
Kod: Markera allt
.include "m16def.inc"
.def temp = R16
.def temp_1 = R17
.def Delay1 = R18
.def Delay2 = R19
.def loader = R23
.equ controllport = PORTB
.equ dataport = PORTC
.equ DDRdataport = DDRC
.equ DDRcontrollport = DDRB
.equ PINdataport = PINC
.equ E = 2
.equ RS = 0
.equ RW = 1
.equ busy = 3
.org 0x0000
rjmp Reset
Reset:
ldi temp,LOW(RAMEND) ;init stack
out SPL,temp
ldi temp,HIGH(RAMEND)
out SPH,temp
ldi R20, 0xFF
ldi R21, 0xFF
ldi R22, 0x04
ldi temp_1, 0xFF
out DDRC, temp_1
out DDRD, temp_1
out DDRB, temp_1
rjmp START
.macro enablePulse
nop
sbi controllport,E
push loader
pop loader
nop
nop
cbi controllport,E
.endmacro
START:
rcall LCDinit
ldi temp,0b01101001 ;A
rcall SendChartoLCD
; ldi temp,0x02 ;B
; rcall SendCMDtoLCD
rjmp loop
loop:
sbi PORTD, 4
rjmp loop
SendCMDtoLCD:
mov temp_1,temp ; Copy data to temp_1
swap temp_1 ; get lower 4 bits
andi temp_1, 0b00001111 ;mask off lower 4 bits
out PORTC,temp_1 ; write lower 4 bits to LCD
enablePulse
andi temp, 0b00001111 ;mask off lower 4 bits
out PORTC,temp ; write upper 4 bits to display
enablePulse
rcall busyflag
ret ; return
SendChartoLCD:
sbi controllport,RS
rcall SendCMDtoLCD
cbi controllport,RS
ret
WAIT_2msec:
;ldi Delay1,0x10
ldi Delay1, 0xFF
D24002:
ldi Delay2,0xFF
D24001: dec Delay2
brne D24001
dec Delay1
brne D24002
ret
warte5ms :
;ldi Delay1,0x10
ldi Delay1, 0xFF
D240022:
ldi Delay2,0xFF
D240011: dec Delay2
brne D240011
dec Delay1
brne D240022
ret
;*********************************************
;** LCD init **
;*********************************************
LCDinit:
clr loader
out dataport,loader
out controllport,loader
ser loader
out DDRdataport,loader
out DDRcontrollport,loader
rcall warte5ms
rcall warte5ms
rcall warte5ms
rcall warte5ms
ldi loader,0x03 ;initiering
out dataport,loader
enablePulse
rcall warte5ms
rcall warte5ms
ldi loader,0x03 ;initiering
out dataport,loader
enablePulse
rcall warte5ms
rcall warte5ms
ldi loader,0x03 ;initiering
out dataport,loader
enablePulse
rcall warte5ms
rcall busyflag
ldi temp, 0x02 ;enable 4-bit mode
out dataport,loader
enablePulse
rcall busyflag
ldi loader,0x0c ;set interface length (4-bit mode) first nibble
out dataport,loader
enablePulse
ldi temp, 0x08 ;set interface length (2 row, 5x7 size font) second nibble
out dataport,loader
enablePulse
rcall busyflag
ldi loader,0x01 ;turn of LCD first nibble
out dataport,loader
enablePulse
rcall busyflag
ldi loader,0x00 ;turn of LCD second nibble
out dataport,loader
enablePulse
rcall busyflag
ldi loader,0x00 ;clear the LCD first nibble
out dataport,loader
enablePulse
rcall busyflag
ldi loader,0x01 ;clear the LCD second nibble
out dataport,loader
enablePulse
rcall busyflag
ldi loader,0x00 ;Set Cursor Move Direction first nibble
out dataport,loader
enablePulse
rcall busyflag
ldi loader,0x06 ;Set Cursor Move Direction second nibble
out dataport,loader
enablePulse
rcall busyflag
ldi loader,0x00 ;Enable Display/Cursor first nibble
out dataport,loader
enablePulse
rcall busyflag
ldi loader,0x0F ;Enable Display/Cursor second nibble
out dataport,loader
enablePulse
rcall busyflag
in loader,controllport
andi loader,0xf8
out controllport,loader
clr loader
out dataport,loader
sbi PORTD, 3
ret
busyflag:
clr loader
out DDRdataport,loader
sbi dataport, 3
nop
cbi controllport,RS
sbi controllport,RW
nop
nop
sbi controllport,E
push loader
pop loader
nop
nop
in loader,PINdataport
cbi controllport,E
nop
sbrs loader,busy
rjmp busyende
rjmp busyflag
busyende:
clr loader
out controllport,loader
ser loader
out DDRdataport,loader
ret
Daniel