HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av PopUnoNkoK »

Ber om ursäkt för rubriken, ville få med mycket info i den och jag hade svårt att komma på nåt bra att skriva.

Jag kör nu en PIC 16f690 och har kopplat en HD44780 LCD disp till den.
Efter lite modifiering av Sodjans exempelkod (http://www.jescab.se/HD44780.html) så funkar allt nu precis som förväntat.

MEN som jag har skrivit förut så HATAR jag att ha kod som jag inte förstår hur det fungerar, trots att den gör det jag vill. =)

Så till min fråga.

Hur kommer det sig att processorn vet vad den ska skicka för information till displayen när Sodjan har skrivit så här:

Kod: Markera allt

;**********************************************************************
LCD_texts   CODE
; Fasta texter för LCDn.
; Två första värderna i varje text är rad (1,2,3 eller 4)
; och position (1-40). Resten är text fram till h'00'.
;
lcd_text1   data    d'1', d'1', 'L', 'C', 'D', ' ', 'D', 'E', 'M', 'O', h'00'
lcd_text2   data    d'1', d'10', '1', '6', 'F', '8', '8', '6', h'00'
lcd_text3   data    d'2', d'4', 'W','W','W','.','J','E','S','C','A','B','.','S','E', h'00'
lcd_text4   data    d'2', d'1', '(', 'C', ')', h'00'
;
;**********************************************************************
Alltså det finns juh inget LookUpTable eller liknande som visar vad ett "L" eller ett "E" ska vara för binärt tal som motsvarar teckentabellen för hd44780.
Samma gäller Adresseringen, i Sodjans exempel är det helt enkelt d'2' för rad två. I all dokumentation som jag läst är det adress 40 som pekar på rad två. (Två raders HD44780)
Jag antar att det är ganska lätt (har inte provat än) att ändra i koden så att man skickar binära tal i stället som motsvarar rätt tecken i HD44780 tabellen men det vore juh bättre om man kunde lära sig förstå detta sätt eftersom det är visuellt väldigt enkelt i koden.
Finns det någon bra dokumentation om detta sätt att skriva koden?

Tacksam för svar.

MVH Peter F
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av bearing »

ASCII-koden för 'L' på en dator är samma kod som L har i det du kallar binärkoden i displayen. De flesta tecken stämmer överens med ASCII-tabellen, rätt fiffit va? =)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av sodjan »

> som visar vad ett "L" eller ett "E" ska vara för binärt tal som motsvarar teckentabellen för hd44780.

Googla på "ASCII" och kolla lite...

> i Sodjans exempel är det helt enkelt d'2' för rad två. I all dokumentation som jag läst är det
> adress 40 som pekar på rad två. (Två raders HD44780)

Kolla i koden där det står "; Justering av rad/pos väden".

> Finns det någon bra dokumentation om detta sätt att skriva koden?

Manualerna för MPASM t.ex.
Koden är inte skriven efter något speciellt "sätt"...

Du verkar bara inte ha kollat exempelkoden ordentligt.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av jesse »

Det kan väl inte bli bekvämare än att bara behöva skriva

Att skriva 'A' i programspråket C betyder exakt samma sak som att skriva 65 eller 0x41. Det är bara olika sätt att skriva ett "char".

Så när Sodjan skickar ett 'A' till displayen så skickas egentligen talet 65. Så länge man håller sig till standardtecknen '0'-'9' och 'A'-'Z' samt 'a'-'z' så är koden samma för C-kompilatorn (som tolkar 'A' som 65) och displayen (som tolkar 65 som 'A'). Däremot kan det hända att alla tecken inte är desamma. T.ex. om du försöker använda ÅÄÖ. Då är det antagligen inte samma siffra som genereras som displayen vill ha. Då får man specifikt kolla varje tecken om de är någon av dessa specialtecken och byta ut dessa mot rätt siffra.

Antag att 'ö' på displayen motsvaras av hexcode 0x91 (påhittat exemel)... då kan du skriva i koden:
if (data == 'ö') data = 0x91;

Sen att sodjan använder d'2' för att ange rad 2 är ju också väldigt fiffigt. Adressen 0x40 kan du ju inte skicka till displayen som vanlig data, då kommer ju en bokstav att skrivas ( 'É'?). Men Sodjan har löst det så att du skickar en speciell kod som progrmmet tolkar som "rad 2". På så vis slipper du anropa en separat funktion bara för att byta rad - det kan ingå som en del i dataflödet. Kan knappast bli mer bekvämt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av sodjan »

> Att skriva 'A' i programspråket C

Sannolikt är det så, men det har inte mycket med frågan/tråden att göra.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av jesse »

Det var denna meningen jag syftade på:
Alltså det finns juh inget LookUpTable eller liknande som visar vad ett "L" eller ett "E" ska vara för binärt tal som motsvarar teckentabellen för hd44780.
Som jag uppfatade frågan så förstod inte TS hur 'L' eller 'E' kunde omvandlas till rätt kod för att visas på displayen. Jag förklarade bara att när man anger ett tecken så, så ÄR det koden. Det behövs alltså ingen lookup-tabell för dessa tecken.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av bearing »

Språket här är en assembler, inte C. Det är väl mest det Sodjan syftar på.

I C omvandlas ett tecken till sin ASCII-kod ifall man sätter '-tecken runt. I assemblern skulle det kunna varit annorlunda, men det är ju faktiskt samma i den här assemblern.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av jesse »

Jaja... mitt fel.... :roll:

rättelse: byt C-kompilator mot assemblator så är ju poängen densamma ... Det är ju ascii-kod i vilket fall.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av sodjan »

> ...i programspråket C

Sannolikt är det så, men det har inte mycket med frågan/tråden att göra.
Nerre
Inlägg: 27237
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av Nerre »

Precis, det är ju samma sak om man skriver det i en ren textfil. Tittar man på textfilen med en hex-editor så ser man att bokstaven A motsvaras av det binära talet 65. Datorer vet inte vad en bokstav är, de jobbar enbart med binära tal. Sen är det vår användning av talen som kan göra om dem till bokstäver.

Fast det vete f-n om man ens kan säga så... de görs inte om till bokstäver, vi säger åt datorn att presentera dem på ett sätt som vi tolkar som bokstäver. För datorn är det fortfarande ett tal, eller ett bitmapsmönster (som ju i sin tur bara är ett gäng binära tal) eller möjligen en pekare till ett tecken i en font (men för datorn är det ju bara en referens till vad den skall göra: följa koden i fonten). Sen att det som händer när datorn följer koden i fonten är att vi ser ett tecken vet den ju inte om...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av sodjan »

Nej, det är ju LCD'n som gör om det till "bokstäver"... :-)
Nerre
Inlägg: 27237
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av Nerre »

Ja men det sitter väl å andra sidan en liten processor på den också? :)

En "dator" idag innehåller ju säkert närmare ett dussin olika processorer av olika slag. Grafikkort, ljudkort, USB-hub:ar etc. Jag vet inte om det som sitter i möss och tangentbord går att klassa som processor också, men skulle nästa tro det.
Användarvisningsbild
Icecap
Inlägg: 26655
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av Icecap »

Egentligen gör LCD-modulen bara en visning av de bit-mönster som motsvaras av de data som skickas till det. Att de sedan råkar likna bokstäver är bara ganska bra och förenklar användandet avsevärd.

Men jag tror att det hela beror på att det kanske inte är klart för TS vad t.ex. d'1' egentligen betyder.
d står för Decimal (alltså 10-tal systemet) och '1' betyder 1, detta tolkar assemblern till "värdet 1" och i detta exempel sparar den detta värde i minnet.
h'00' betyder hexadecimalt (16-tal systemet), värdet 00 vilket tolkas till "värdet noll".

'A' (alltså utan något bokstav omedelbart före eller ett a) betyder "det värde som motsvarar ASCII-värdet för tecknet 'A'"
Senast redigerad av Icecap 3 oktober 2011, 14:25:24, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av sodjan »

Min kod är inte helt pedagogisk. För tydlighets skull borde jag ha skrivit :

Kod: Markera allt

lcd_text1   data    d'1', d'1', a'L', a'C', a'D', a' ', a'D', a'E', a'M', a'O', h'00'
lcd_text2   data    d'1', d'10', a'1', a'6', a'F', a'8', a'8', a'6', h'00'
lcd_text3   data    d'2', d'4', a'W', a'W', a'W', a'.', a'J', a'E', a'S', a'C', a'A', a'B', a'.', a'S', a'E', h'00'
lcd_text4   data    d'2', d'1', a'(', a'C', a')', h'00'
Användarvisningsbild
Icecap
Inlägg: 26655
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: HD44780, Bokstäver istf binär kod, Sodjans exempelkod.

Inlägg av Icecap »

Fy på dig sodjan, ställer till det sådär! ;-)

Men allvar, är man inte styv på programmering är det riktigt många saker man behöver slå upp hela tiden innan man blir förtrolig med dom och deras betydelse.

Ett exempel är i C. Där kan man skriva en konstant sträng ganska enkelt:
const char "This is a string";
Detta betyder att ASCII-värde av varje bokstav sparas i minnet, helst i ROM. Men när man sedan ska göra grejer med det och kanske ska använda funktionen sizeof() (betyder "ge mig ett värde på hur många bytes det fyller") får man fel värde! Värdet man från från sizeof() räknar ju med den avslutande nolla som sparas automatisk! Vet man inte om detta kan det bli ganska fel!

Och för de oinvigda: i C avslutas texter med en nolla, detta betyder att ska man definiera en buffer som kan hålla upp till 20 tecken ska man reservera 21 platser, detta för att få plats med 20 tecken + EOL... (EOL = End Of Line = slut på text).

Bara man vet det är det enkelt...
Skriv svar