Fel position på 4 raders lcd
Fel position på 4 raders lcd
Sitter och knåpar med en 4x16 alfanumrerisk lcd. Allt fungerar bra..förrutom att när jag försöker att skriva på rad 3 & 4 så hoppar texten automatiskt in och startar på segment 5.
Kan det vara för att jag kör den i 4 bitars läge kanske?
Det är en HD44780 LCD
Så det blir ca så här..
Test test test
Test test test
Test test
Test test
Jag har kollat koden hundra gånger men kan inte hitta att det skulle vara något fel i den då de två första raderna fungerar fint.
Kan det vara för att jag kör den i 4 bitars läge kanske?
Det är en HD44780 LCD
Så det blir ca så här..
Test test test
Test test test
Test test
Test test
Jag har kollat koden hundra gånger men kan inte hitta att det skulle vara något fel i den då de två första raderna fungerar fint.
Hm, Textformateringen blev fel.
Koden är skriven i microC, tyckte att det var enklast då jag har förträngt all assembler.
Det visar sig att problemet verkar ligga i microC, Sökte runt på nätet igår och såg att flera som använder microC har samma problem med 4 raders lcd.
Kommandot ser ut så här
Lcd_Out(1,3, "Texten");, Texten skriv ut på rad 1, kolum 3
men om jag kör
Lcd_Out(3,1, "Texten");, skall texten hamna på rad 3, kolum 1, men istället så hamnar texten automatiskt på rad 3 och kolum 5.
Men som du sa Sodjan, adresserna.. De blev fel vi kompileringen, Lite knep och knåp fixade till det...
Och Wisp'en gör det hela mycket enklare att sitta och labba...Den är helt enkelt underbar...
Koden är skriven i microC, tyckte att det var enklast då jag har förträngt all assembler.
Det visar sig att problemet verkar ligga i microC, Sökte runt på nätet igår och såg att flera som använder microC har samma problem med 4 raders lcd.
Kommandot ser ut så här
Lcd_Out(1,3, "Texten");, Texten skriv ut på rad 1, kolum 3
men om jag kör
Lcd_Out(3,1, "Texten");, skall texten hamna på rad 3, kolum 1, men istället så hamnar texten automatiskt på rad 3 och kolum 5.
Men som du sa Sodjan, adresserna.. De blev fel vi kompileringen, Lite knep och knåp fixade till det...
Och Wisp'en gör det hela mycket enklare att sitta och labba...Den är helt enkelt underbar...
Om jag inte minns helt fel rakt ur huvet, så är adresseringen helt annorlunda på rad 3-4 jämfört med 1-2 på en vanlig HD44780-kontrolller. Det är kanske så att MikroBasic-funktionen egentligen bara är gjord för och testad på LCD med max två rader. Då skulle man kunna få lustiga fenomen när man kör tre eller fyra rader.
> så är adresseringen helt annorlunda på rad 3-4 jämfört med 1-2 på en vanlig HD44780-kontrolller.
Annorlunda vet jag inte, det är bara att hålla reda på start-adresser för pos 1 på varje rad.
Och sedan addera positionen på raden så får man rätt teckenadress.
> Det är kanske så att MikroBasic-funktionen egentligen bara är gjord för och testad på LCD med max två rader.
Då ska den inte acceptera syntaxen "Lcd_Out(3,x, "xxx");" utan ge ett felmeddelande istället.
*Om* den accepterar 3 eller 4 som "rad-parameter", så ska den också hantera det rätt...
Väldigt osannolikt att de inte skulle ha testat på en 4-raders LCD.
Annorlunda vet jag inte, det är bara att hålla reda på start-adresser för pos 1 på varje rad.
Och sedan addera positionen på raden så får man rätt teckenadress.
> Det är kanske så att MikroBasic-funktionen egentligen bara är gjord för och testad på LCD med max två rader.
Då ska den inte acceptera syntaxen "Lcd_Out(3,x, "xxx");" utan ge ett felmeddelande istället.
*Om* den accepterar 3 eller 4 som "rad-parameter", så ska den också hantera det rätt...
Väldigt osannolikt att de inte skulle ha testat på en 4-raders LCD.
Vad jag menade var just att adresseringen skiljer sig åt. Rad 3-4 hanteras som en förlängning av rad 1-2 och rad 3 kommer före rad 2 i displayminnet. Det gör att det inte går att hantera raderna som en enkel multiplikation för att få displayadressen. Så länge man har två rader så funkar det utmärkt.
4-radiga displayer var inte så vanliga tidigare även om det fanns. Så om rutinerna inte är uppdaterade så _skulle_ det kunna vara så. Sedan håller jag med om att det egentligen inte skall acceptera parametern isåfall. Å andra sidan skulle massor av saker vara inkompatibla med framtida varianter på produkter isåfall.
Vad jag menar är att om man t.ex skrev en LCD-drivrutin när det bara fanns 1/2-radiga displayer. För att hantera framtida kommande så "chansar" man lite och hanterar rad 3 på samma sätt som rad 2, d.v.s det som känns mest sannolikt för en kommande produkt. Då skulle den automatisk bli kompatibel även med fler rader. Därför tror jag det är ofta det inte läggs in den typen av spärrar. I det här fallet hade det ju då ändå inte fungerat eftersom man adresserar rad 3/4 annorlunda.
Vad är det för modell på LCD:n?
Tittar man i databladet för några 4x20 eller 4x16 LCD:er så ser man att rad 3 börjar på adress 20. Frågan är om det kan tänkas finnas 16x4 LCD:er där rad 3 börjar direkt efter rad 1 istället, d.v.s på adress 16. Om displayen är gjord på detta sättet och drivrutinerna förväntar sig adress 20, så får man precis det här resultatet. Kollas lämpligen i databladet.
4-radiga displayer var inte så vanliga tidigare även om det fanns. Så om rutinerna inte är uppdaterade så _skulle_ det kunna vara så. Sedan håller jag med om att det egentligen inte skall acceptera parametern isåfall. Å andra sidan skulle massor av saker vara inkompatibla med framtida varianter på produkter isåfall.
Vad jag menar är att om man t.ex skrev en LCD-drivrutin när det bara fanns 1/2-radiga displayer. För att hantera framtida kommande så "chansar" man lite och hanterar rad 3 på samma sätt som rad 2, d.v.s det som känns mest sannolikt för en kommande produkt. Då skulle den automatisk bli kompatibel även med fler rader. Därför tror jag det är ofta det inte läggs in den typen av spärrar. I det här fallet hade det ju då ändå inte fungerat eftersom man adresserar rad 3/4 annorlunda.
Vad är det för modell på LCD:n?
Tittar man i databladet för några 4x20 eller 4x16 LCD:er så ser man att rad 3 börjar på adress 20. Frågan är om det kan tänkas finnas 16x4 LCD:er där rad 3 börjar direkt efter rad 1 istället, d.v.s på adress 16. Om displayen är gjord på detta sättet och drivrutinerna förväntar sig adress 20, så får man precis det här resultatet. Kollas lämpligen i databladet.
**4x40** !!??
Det skulle du ha kunnat sagt lite tidigare...
En HD44780 controler har max *80* teckenpositioner.
En 4 x 40 display (som alltså har *160* tecken) har *dubbla*
HD44780 controlers. Alltså i princip två sammanbyggda 2x40
LCD'er.
Jag skulle förvänta mig en adressering som en 2x40 LCD på
rad 3 och 4. Men databladet har naturligtsvis svaret på det.
Eller så testar man helt enkelt...
Det skulle du ha kunnat sagt lite tidigare...

En HD44780 controler har max *80* teckenpositioner.
En 4 x 40 display (som alltså har *160* tecken) har *dubbla*
HD44780 controlers. Alltså i princip två sammanbyggda 2x40
LCD'er.
Jag skulle förvänta mig en adressering som en 2x40 LCD på
rad 3 och 4. Men databladet har naturligtsvis svaret på det.
Eller så testar man helt enkelt...