Sida 1 av 3
Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 16:50:20
av PHermansson
Testar lite med PicKit2:s utvecklingskort och har lött på en HD44780-kompatibel LCD. Jag lyckas skriva vad jag vill på rad 1, men inget på rad två? Lite kod:
Kod: Markera allt
movlw 0x0
call LCD_SetLocation
movlw "s"
call LCD_Data
movlw 0x4
call LCD_SetLocation
movlw "2"
call LCD_Data
movlw 0x40
call LCD_SetLocation
movlw "M"
call LCD_Data
Det blir ett "s" till vänster på första raden, en "2" på femte positionen. Men ser inget M, och då har jag ändå provat en massa värden att skicka till LCD_SetLocation? Hmm?
Kod: Markera allt
;--------------------------------------------------------
; LCD Set Location
;--------------------------------------------------------
LCD_SetLocation
iorlw 80H
goto LCD_Cmd
;--------------------------------------------------------
; LCD Send Data
;--------------------------------------------------------
LCD_Data
movwf DispData ; Save Data
swapf DispData, w ; Swap Nibbles
call LCD_OutData ; Output first Nibble
movf DispData, w ; Retreive Data
call LCD_OutData ; Output second Nibble
call LCD_Sleep50u
return
;--------------------------------------------------------
; LCD Send Command
;--------------------------------------------------------
LCD_Cmd
movwf DispData ; Save Data
swapf DispData, w ; Swap Nibbles
call LCD_OutCmd ; Output First Nibble
movf DispData, w ; Retreive Data
call LCD_OutCmd ; Output Second Nibble
call LCD_Sleep
return
LCD_OutCmd
andlw 0x0F ; LCD RS Pin = 0 (Command)
LCD_PulseEnable
movwf PORTC
iorlw 0x20 ; LCD EPin = 1 (Enable Transfer)
movwf PORTC
andlw 0x1F ; LCD EPin = 0 (End Transfer)
movwf PORTC
return
;--------------------------------------------------------
; LCD Sleep 5m
;--------------------------------------------------------
LCD_Sleep
call LCD_Sleep1m
call LCD_Sleep1m
call LCD_Sleep1m
call LCD_Sleep1m
call LCD_Sleep1m
return
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 16:56:02
av sodjan
> och då har jag ändå provat en massa värden
Men tydligen inte tillräckligt många.
Har du något datablad till just din LCD som verifierar att
det är just h'40' som är rätt adress ? Ofta är det det, men...
Fixa koden så att den loopar igenom alla adresser och se vad som händer.
> movlw 0x40
> iorlw 80H
Varför inte ha *ett* sett att ange konstanter ?
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 17:53:30
av PHermansson
Mmm får nog prova en loop. Databladet är svårhittat, beteckningen jag ser på LCD:n är "YJ-802A" och jag tror jag köpt den av dig en gång i tiden.
Jag hittar den omnämnd här;
http://www.mikrocontroller.net/topic/119844, spåren leder till en LCD med beteckningen SD0802A. Den hittar jag några datablad för, men inget som avhandlar mjukvaran...
Varför inte ett sätt att ange konstanter? För att... ja för att jag inte tänkt på det?

Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 18:04:41
av ToPNoTCH
Är den rätt initierad ? (datblad + kod saknas)
Det ser rätt ut annars
Lite långsökt (då du har liv i den) men har du provat att lägga in lite fördröjningar ?
p.s
Personligen tyckte jag det blev lite rörigt med iorlw och andlw i PulseEnable rutinen. Jag tycker defines på RS & E och bsf/bcf blir mer lätt att förstå och portera.
Men det är ju en smaksak.
Ex.
Kod: Markera allt
#define RS PORTB,4
#define E PORTB,6
.
.
.
bcf E
bcf RS
d.s
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 18:12:16
av PHermansson
Ja databladet saknas, jag vet
Initieringskoden:
Kod: Markera allt
;--------------------------------------------------------
; LCD Initialization
;--------------------------------------------------------
LCD_Init
call LCD_Sleep ; Wait
call LCD_Sleep
call LCD_Sleep
movlw 0x03 ; Set 4 bit mode
call LCD_OutCmd
call LCD_Sleep
movlw 0x03 ; Set 4 bit mode
call LCD_OutCmd
call LCD_Sleep
movlw 0x03 ; Set 4 bit mode
call LCD_OutCmd
call LCD_Sleep
movlw 0x2E ; Set 2 Lines and 5x10 Characters
call LCD_Cmd
movlw 0x0C ; Display On off Control (Display on, Cursor off, Blink off)
call LCD_Cmd
movlw 0x06 ; Set Direction: Increment and No Display Shift
call LCD_Cmd
call LCD_Clear
call LCD_Home
return
Bra tips annars, ska snygga till koden när jag fått det att fungera.
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 18:36:55
av ToPNoTCH
Det ser inte rätt ut
Har du tänkt på att det är 4 MSB som används när du initierar mot 4-bit.
(Det funkar ju om du kopplat D7-D4 på displayen till motsv. PORTC.3-PORTC.0 på MCU'n)
Men det känns i övrigt som det saknas kommandon för initiering överlag.
Kolla igenom WIKIN
http://elektronikforumet.com/wiki/index ... le=HD44780 och då särskilt under rubriken "4-bitarsinterface"
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 18:55:53
av PHermansson
Min fina loop ger en rad med nollor på första raden, inget på den andra :/
Kollade lite annan kod och jo det verkar som att det fattas init-kommandon. Men det blir inte bättre när jag använder denna kod (tagen delvis från Wikin):
Kod: Markera allt
LCD_Init
call LCD_Sleep ; Wait
call LCD_Sleep
call LCD_Sleep
movlw 0x03 ; Set 4 bit mode
call LCD_OutCmd
call LCD_Sleep
movlw 0x03 ; Set 4 bit mode
call LCD_OutCmd
call LCD_Sleep
movlw 0x03 ; Set 4 bit mode
call LCD_OutCmd
call LCD_Sleep
movlw b'0010'
call LCD_Cmd
movlw b'0010'
call LCD_Cmd
movlw b'1000'
call LCD_Cmd
movlw b'0000'
call LCD_Cmd
movlw b'1000'
call LCD_Cmd
movlw b'0000'
call LCD_Cmd
movlw b'0001'
call LCD_Cmd
movlw b'0000'
call LCD_Cmd
movlw b'0110'
call LCD_Cmd
call LCD_Home
call LCD_Clear
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 18:57:08
av sodjan
Om *fel* 4-bitar var kopplade så vore det väl lite märkligt (eller tur/otur)
om allt fungerade mot första raden på LCD'n.
Men visst, det hemlighålls ju hur det hela är kopplat, så det
blir mest gissningar...
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 19:01:02
av bearing
Har för mig att en av bitarna i initieringen väljer ifall displayen ska vara en- eller tvåradig, så ifall den biten är fel kommer så klart inte rad 2 fungera.
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 19:14:36
av sodjan
> movlw 0x2E ; Set 2 Lines and 5x10 Characters
Har du någon ref till det ?
Prova annars med 0x28 och se om det blir någon skillnad.
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 19:30:31
av ToPNoTCH
Om vi börjar med din första kod så skickar du ju 0x2E för mot funktionset för att (enligt kommentaren) "Set 2 Lines and 5x10 Characters"
Det blir ju lite svårt att överföra på 4-bitar (och jag hänger inte med hur du kommit fram till det värdet).
Skall se om jag ser något i den andra koden.
EDIT:Sodjan hann emellan (inte helt ovanligt)
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 19:54:30
av sodjan
ToPNoTCH, jag är inte helt med på vad du menar, är det att det
är svårt (eller itne går) att ställa in 4-bit mode med bara 4-bitar anslutna ?
Det går självklart. Man jag kannske missförstog dig.
Det jag menade var att i min HD44780 manual so ska det vara en
"0" i kommendot där PHermansson har en "1". vet inte om det är avgöande,
det var därför jag skrev "testa med"...
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 20:21:43
av ToPNoTCH
Nja det är klart det går.
Men att skicka 0x2E med 4-bitar och ett kommando går inte.
EDIT: Jag gör en pudel här. Observerade inte att han två olika rutiner för att skicka kommandon i både 8 och 4 bit. My misstake.
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 5 oktober 2010, 20:35:28
av ToPNoTCH
Här är en initiering som jag använder med framgång på tre olika fabrikat av 2X16 diplayer.
Här är ju då PORTC7-4 ansultet till displayens D7-D4, så om TS skall tillämpa den (med den misstänkta kopplingen C3-C0 till diplayen D7-D4) så får denne tänka bort 4 MSB i varje kommando.
(Tabbarna blir lite konstiga i CODE sektioner)
Kod: Markera allt
bcf E
bcf RS
call Delay15ms
movlw b'00110000'
movwf PORTC
bsf E
call Delay1ms
bcf E
bsf E
call Delay1ms
bcf E
bsf E
call Delay1ms
bcf E
movlw b'00100000'
call send_command
movlw b'00100000'
call send_command
movlw b'10000000'
call send_command
movlw b'00000000'
call send_command
movlw b'11000000'
call send_command
movlw b'00000000'
call send_command
movlw b'00010000'
call send_command
movlw b'00000000'
call send_command
movlw b'01100000'
call send_command
Re: Lyckas inte skriva på rad 2 på min LCD...
Postat: 6 oktober 2010, 08:45:48
av PHermansson
Displayen är kopplad enligt detta schema:
http://www.nldv.com/2010/02/pic-16f690- ... r-lcd-8x2/
'28' eller '2E' gör inget skillnad.