Picproje Elektronik Sitesi

TEKNİK SERVİS => Genel Bilgi, Notlar, E-Kitap, İp uçları => Konuyu başlatan: AST - 10 Ağustos 2012, 16:41:16

Başlık: Karakter LCD de karakter tanımlama
Gönderen: AST - 10 Ağustos 2012, 16:41:16
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ı?
Başlık: Ynt: Karakter LCD de karakter tanımlama
Gönderen: mehmet - 10 Ağustos 2012, 17:18:57
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...
Başlık: Ynt: Karakter LCD de karakter tanımlama
Gönderen: esensoy - 10 Ağustos 2012, 17:30:27
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.
Başlık: Ynt: Karakter LCD de karakter tanımlama
Gönderen: AST - 10 Ağustos 2012, 18:24:26
İ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.
Başlık: Ynt: Karakter LCD de karakter tanımlama
Gönderen: bocek - 10 Ağustos 2012, 21:04:39
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.