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):

Bild

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' :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);

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.