Sadece ilk 8 karakter

Başlatan Salih, 21 Eylül 2005, 13:48:21

Salih

Yazdığım programda normal Lcd.c sürücüsünü kullandım. Elimde 1x16 karakterlik lcd var. Gönderdiğim karakterlerin ilk 8 adedi görülüyor. Nedenini bilen arkadaş varmıdır.

SpeedyX

Selamlar, 2x16 ile 1x16 nın init ayarlarında fark var, yani kullandığınız lcd.c onu desteklemiyor, 2x16 da ilk satır bir blok, 2. satır diğer blok iken, 1x16 da ilk 8 karakter 1 blok, son 8 karakter diğer blok olarak tanımlı, yani adresleri farklı. init kısmında değişiklik yaparak çözebilirsiniz.

Salih

Daha önce LCD_INIT_STRING içindeki değerleri değiştirip denemiştim. Olmamıştı. Herhalde olması gereken değerleri bulamadım.

SpeedyX

C biliyorsunuz diye düşünüyorum;
lcd nin datasheetine bakıp, write nasıl yapılıyor ve hangi adresler görüntüleniyor, öğrenerek programın yaptığı ile karşılaştırabilirsiniz.


Belki şu kısımlarda değişiklik yapmak işinizi görebilir, asm hariç başka dil ile 1x16 lcd kullanmadım.
#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40    // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in

Salih

Herhalde 2. sekiz karakteri yazmak için ikinci satıra geç karakteri kullanmak en kolayı. Diğer türlü iş uzuyor.
Teşekkürler.

SpeedyX

Aynen öyle.
O şekilde çalıştığını bilmiyordum, 2. bölüm reset almaz diye düşünüyorum.
2.bölümde çalışıyor mu? yani reset alıyor mu?
(0b11000000)

Salih

İkinci sekiz karakterde yazmak istadiklerinizin başına \n karakterini koyunca gayet güzel çalışıyor.
örneğin
printf(lcd_putc,"\fX=%u \nIr=%Lu",x,akim_r);

SpeedyX

Hımm, güzel.
Siz bunu \n koymadan yapmak istiyorsunuz fakat başka bir yolu yok yada ayrı bir fonksiyon yazabilirsiniz; göndereceklerinizi o fonksiyona verip, karakter sayarak 8 den sonra \n koymasını sağlayabilirsiniz. Bence hiç gerek yok.

SpeedyX

#define lcd_type 0           // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0xC0    // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x80 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in


ufak değişiklikler yaptım, acaba bu şekilde denermisiniz? yine çalışacak mı?

Salih

Dediğiniz değişiklikleri denedim. Sadece ilk sekiz karakteri yazıyor.
İstediğimiz olmuyor.

SpeedyX

Peki teşekkürler, \n koymakda zor değil, bu şekilde olacak artık.

mobland

lcd.c dosyasının içerisindeki lcd_puctc() fonksiyonu aşağıdaki gibi değiştirildiğinde 1x16 lcd ekran için ilk 8 karakter yazma problemi giderilmiş oluyor bizzat denendi arkadaşlar.
uzun zaman olmuş konu açılalı ama okunmamış bilgi tazedir :)

void lcd_putc( char c) {
   char z=0;
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                   z = 0;
                                           break;
     case '\n'   : lcd_gotoxy(1,2);
                   z = 8;
                                           break;
     case '\b'   : lcd_send_byte(0,0x10);
                   z = z-1;
                                           break;
     default     : if(z==9) {lcd_gotoxy(1,2);}

                   lcd_send_byte(1,c);
                   z++;
                                           break;
   }
}