Karakter LCD de karakter tanımlama

Başlatan AST, 10 Ağustos 2012, 16:41:16

AST

Selamlar,

Karakter LCD de en fazla 8 karakter tanımlayabilliyoruz.8 den fazla karakter tanımlamak için herhangi bir yöntem, teknik var mı?

mehmet

Sanıyorum aynı ekranda görünecek karakter
adedi 8, başka ekran için yeni karakter
düzeni yapılabilir. Ancak ekran değişmeden
karakter dizisi değişmemesi gerekli...

Saygılar...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

esensoy

zaman probleminiz yok ise yeni bir karakter yükleyip onu bastırabilirsiniz,
Yani lcd içine max 8 tane koyabiliyoruz, fakat program içinde lazım olan özel karakteri  o 8 li register a istediğimiz zaman atabiliriz.
En tehlikeli an "zafer" anıdır.

AST

İlk 8 karakteri tanımlayıp ekrana yazdırıyorum.
2. 8'liyi tanımladığım zaman ekranda son tanımladığım karakterler ilk 8'linin üstüne yazılıyor.
Yani en son ne tanımlıysa o ekrana yazılıyor.
Fakat istediğim hepsini yan yana yazdırabilmek.

bocek

avr'ler için yazılmış procyon-avr-lib'de lcd kütüphanesinde 16 adet karakter tanımlanmış
// custom LCD characters
unsigned char __attribute__ ((progmem)) LcdCustomChar[] =
{
	0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, // 0. 0/5 full progress block
	0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, // 1. 1/5 full progress block
	0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, // 2. 2/5 full progress block
	0x00, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x00, // 3. 3/5 full progress block
	0x00, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, 0x00, // 4. 4/5 full progress block
	0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, // 5. 5/5 full progress block
	0x03, 0x07, 0x0F, 0x1F, 0x0F, 0x07, 0x03, 0x00, // 6. rewind arrow
	0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, // 7. stop block
	0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, // 8. pause bars
	0x18, 0x1C, 0x1E, 0x1F, 0x1E, 0x1C, 0x18, 0x00, // 9. fast-forward arrow
	0x00, 0x04, 0x04, 0x0E, 0x0E, 0x1F, 0x1F, 0x00, // 10. scroll up arrow
	0x00, 0x1F, 0x1F, 0x0E, 0x0E, 0x04, 0x04, 0x00, // 11. scroll down arrow
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 12. blank character
	0x00, 0x0E, 0x19, 0x15, 0x13, 0x0E, 0x00, 0x00,	// 13. animated play icon frame 0
	0x00, 0x0E, 0x15, 0x15, 0x15, 0x0E, 0x00, 0x00,	// 14. animated play icon frame 1
	0x00, 0x0E, 0x13, 0x15, 0x19, 0x0E, 0x00, 0x00,	// 15. animated play icon frame 2
	0x00, 0x0E, 0x11, 0x1F, 0x11, 0x0E, 0x00, 0x00,	// 16. animated play icon frame 3
};

karakterleri çağırmak için de aşağıdaki fonksiyon yazılmış
void lcdLoadCustomChar(u08* lcdCustomCharArray, u08 romCharNum, u08 lcdCharNum)
{
	register u08 i;
	u08 saveDDRAMAddr;

	// backup the current cursor position
	saveDDRAMAddr = lcdControlRead() & 0x7F;

	// multiply the character index by 8
	lcdCharNum = (lcdCharNum<<3);	// each character occupies 8 bytes
	romCharNum = (romCharNum<<3);	// each character occupies 8 bytes

	// copy the 8 bytes into CG (character generator) RAM
	for(i=0; i<8; i++)
	{
		// set CG RAM address
		lcdControlWrite((1<<LCD_CGRAM) | (lcdCharNum+i));
		// write character data
		lcdDataWrite( pgm_read_byte(lcdCustomCharArray+romCharNum+i) );
	}

	// restore the previous cursor position
	lcdControlWrite(1<<LCD_DDRAM | saveDDRAMAddr);

}

fonksiyonda geçen LCD_DDRAM ve LCD_CGRAM da şu şekilde tanımlanmış
#define LCD_CGRAM           6      // DB6: set CG RAM address
#define LCD_DDRAM           7      // DB7: set DD RAM address


görüleceği gibi yeni tanımlanan karakterleri ekrana basmadan önce o anki kursor pozisyonunu saklıyor.
// backup the current cursor position
	saveDDRAMAddr = lcdControlRead() & 0x7F;

sonra istenen karakteri yükleyip kursoru eski yerine koyuyor.

bunlar belki senin sorununu çözmende yardımcı olur.
1 ya da 0. işte 'bit'ün mesele..