ÅÄÖ i C

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
SeniorLemuren
Inlägg: 8440
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

ÅÄÖ i C

Inlägg 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();
}
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Re: ÅÄÖ i C

Inlägg 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.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ÅÄÖ i C

Inlägg 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):

Bild
Senast redigerad av jesse 1 april 2011, 00:57:58, redigerad totalt 1 gång.
Användarvisningsbild
SeniorLemuren
Inlägg: 8440
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: ÅÄÖ i C

Inlägg 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å. :)
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ÅÄÖ i C

Inlägg av jesse »

(ändrade 'tecken' till 'c' i koden ovan så det stämmer med din variabel.)
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ÅÄÖ i C

Inlägg 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' :D ) 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);
Användarvisningsbild
SeniorLemuren
Inlägg: 8440
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: ÅÄÖ i C

Inlägg 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å :)
Användarvisningsbild
Glenn
Inlägg: 36760
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: ÅÄÖ i C

Inlägg 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.
Skriv svar