Sida 1 av 1
ÅÄÖ i C
Postat: 1 april 2011, 00:28:27
av SeniorLemuren
Har lyckats att få till ett programi C som skriver till en 16 x 2 teckens LCD, kopplad till en PIC16F877A. Problemet är att den skriver fel tecken för svenska tecken. Hur fixar man det på rätt sätt.
Kod: Markera allt
void
lcd_write(unsigned char c)
{
__delay_us(40);
LCD_DATA = ( ( c >> 4 ) & 0x0F );
LCD_STROBE();
LCD_DATA = ( c & 0x0F );
LCD_STROBE();
}
Re: ÅÄÖ i C
Postat: 1 april 2011, 00:31:48
av ahlsten
Du får nog kolla upp teckenuppsättningen för LCD:n.
Om tecknen saknas i teckenuppsättningen och inte bara finns på annan plats än du förväntar dig så brukar det gå att lagra nya tecken.
Re: ÅÄÖ i C
Postat: 1 april 2011, 00:41:29
av jesse
Dessa tecken gäller i alla fall på min display som är en EA-DOGM 16-3 från Electronic Assembly:
Kod: Markera allt
void
lcd_write(unsigned char c)
{
if (c > 127) { // ÅÄÖ åäö é \ $¤£$~ñ
if (c == 'å') c = 0x83; // å
else if (c == 'ä') c = 0x84; // ä
else if (c == 'ö') c = 0x94; // ö
else if (c == 'Å') c = 0x8f; // Å
else if (c == 'Ä') c = 0x8e; // Ä
else if (c == 'Ö') c = 0x99; // Ö
else if (c == 'ü') c = 0x81;
else if (c == 'Ü') c = 0x9a;
else if (c == 'é') c = 0x82;
else if (c == 'É') c = 0x90;
else if (c == '£') c = 0xe5;
else if (c == '~') c = 0xf8; // (divisionsc ./.)
else if (c == '§') c = 0x12;
else if (c == 'ñ') c = 0x9b;
else if (c == 'Ñ') c = 0x9c;
}
__delay_us(40);
LCD_DATA = ( ( c >> 4 ) & 0x0F );
LCD_STROBE();
LCD_DATA = ( c & 0x0F );
LCD_STROBE();
}
Det går givetvis bra att även göra detta i en switch-case sats om man gillar det bättre.
if (c > 127) lade jag till bara för att den ska slippa gå igenom hela raden med ifsatser om det är ett 'vanligt' tecken.
Jag antar att du har nån slags ascii-lista i databladet till din display? Har du otur så har du den 'japanska' varianten, då finns nog inte alla svenska tecken med. Den västerländska tabellen för HD44780 ser ut så här: (jag ser nu att den tabellen inte stämmer med min: Min display har t.ex. 'ä' på 0x84, men denna har 'ä' på 0xe4 (1110 0100):

Re: ÅÄÖ i C
Postat: 1 april 2011, 00:57:13
av SeniorLemuren
Tecknen finns i displayen, Ö har till exempel ascii-koden 239 och tecknet som skrivs ut som Ö har ascii-koden 246. Blir väl att göra en lista på dom Svenska tecknen då.

Re: ÅÄÖ i C
Postat: 1 april 2011, 00:58:45
av jesse
(ändrade 'tecken' till 'c' i koden ovan så det stämmer med din variabel.)
Re: ÅÄÖ i C
Postat: 1 april 2011, 01:04:53
av jesse
Jo, då stämmer nog den nedre tabellen med din display: 246 = 0xf6 hexadecimalt (översatte med 'kalkylatorn' i windows XP

vilket är detsamma som 0b11110110 binärt (kan också översättas i 'kalkylatorn'

) och letar man upp den positionen så ser man ett 'Ö' där.
Man kan ju också roa sig med de andra grafiska tecknen om man vill:
Kod: Markera allt
#define HEART 0x9d
#define BOLL 0x16
#define PI 0x93
#define OHM 0x9a
lcd_write(OHM);
lcd_write(HEART);
Re: ÅÄÖ i C
Postat: 1 april 2011, 13:42:13
av SeniorLemuren
Tittade i fel teckentabell. Endast gemenerna ö och ä fanns inprogrammerade i min LCD. Men det var inga problem för det fanns ett programmerbart RAM-minne med plats för 8 st egna teckenmatriser, så det var bara att programmera in de tecken som fattades, så nu finns åäöÅÄÖ också

Re: ÅÄÖ i C
Postat: 1 april 2011, 14:12:45
av Glenn
Ja, finns olika versioner av teckenuppsättning i dom displayerna, men nästan alla man köper har den asiatiska varianten så man får slöjda själv
Det är lite synd, efterssom man kan göra mycket anant skoj med dom där programmerbara tecknen.