Lcd üzerindeKİ cursor izleri

Başlatan oyhan, 02 Ağustos 2006, 22:23:01

oyhan

Merhaba
Aşağıdaki kod ile çalışan lcd de cursor izleri belli oluyor. Acaba taramada mı hata yapıyorum. Yani lcd ye sadece 1 defa mı veri göndermeli yada belirli periyodlar ilemi yapmalı bunu. Lcd ye veri yollamanın standardı varmı . Koddan göreceğiniz üzere döngü içerisinde sürekli lcd ye veri yollanıyor. Taki başka bir menuye geçilesiye kadar. Lcd biraz kalitesiz başka bir lcd ile denemedim. Fakat bilemiyorum bundan dolayı olablirmi? Tecrübelerinizi aktarmanız temennisi ile... (kod ccs ile yazıldı)

while (MenuYasak==0)
           { if(!input(PIN_A6)) {Bip(bIO); delay_ms(10); anamenuFLAG++; while(!input(PIN_A6)){} }
             if (anamenuFLAG>=7) {anamenuFLAG=0;}
             if ((anamenuFLAG>=1) && (anamenuFLAG<=6)) {if(!input(PIN_A7)) {Bip(bIO); delay_ms(10); MenuYasak=1;   while(!input(PIN_A7)){} } }
             lcd_gotoxy(1,1);
             if (anamenuFLAG==0)
                {
                  printf(lcd_putc," deger=%04Lu ",deger);sat2_BOS();
                  if (deger>=Pos1) {output_low(led1);} else {output_high(led1);}                 
                  if (deger>=Pos2) {output_low(led2);} else {output_high(led2);}                 
                  if (deger>=Pos3) {output_low(led3);} else {output_high(led3);} 
                }
             if (anamenuFLAG==1) {lcd_putc("(1) SECENEK1"); LcdBut_IS();}
             if (anamenuFLAG==2) {lcd_putc("(2) SECENEK2"); LcdBut_IS();}
             if (anamenuFLAG==3) {lcd_putc("(3) SECENEK3"); LcdBut_IS();}
             if (anamenuFLAG==4) {lcd_putc("(4) SECENEK4"); LcdBut_IS();}
             if (anamenuFLAG==5) {lcd_putc("(5) SECENEK5"); LcdBut_IS();}
             if (anamenuFLAG==6) {lcd_putc("(6) SECENEK6"); LcdBut_IS();}
           }
BİRLİKTEN KUVVET DOĞAR:

birumher

LCD ye sadece bir kere veri gönder. Sadece değiştiğinde göndermen yeterli.
Ayrıca bir de önerim olacak. Kod yazarken her komutu ayrı satırlara yaz. { leri ayır kodun okunabilirliğini arttıracaktır.
Birkan.Herguner

Ersin

calismayi etkilemeyecekse 100ms lik bir gecikme ekle

oyhan

Merhaba
Teşekkürler bilgiler için. Kodu biraz budadım aslında beklemeler var. Birde kodu yazarken çalışaya kadar alt altayazıyorum. Biten her rutini daha sonra yan yana yazıyorum. Nedenide kodu aynı anda görebilme imkanım artsın. Hakimiyetim artsın diye. Yani değişiklikleri takip edelim o vakitlerde lcd sürelim. Tamam anlaşıldı.
BİRLİKTEN KUVVET DOĞAR:

kurumahmut

Alıntı yapılan: "oyhan"Merhaba
Aşağıdaki kod ile çalışan lcd de cursor izleri belli oluyor.
[/code]

Bu cümle ile kastını pek anlayamadım. Biraz daha açabilir misin? LCD ye kursorun disable olmasını mı istiyorsun.Yani o anda kursörun bulunduğu yerin bi kararıp bi açık olmamasını mı istiyorsun?

oyhan

Merhaba
Evet cursorü on yapmam gerekiyor kodun diğer bölümlerinde. Ama genel olarak ekran mesajlarında cursor hep on tanımlı  olduğu için iz belli oluyor sanırım. Ama burada sürekli ekrana veri gidiyor. Siz böyle söyleyince cusor aklıma geldi. Ama lcd sürücüsünün içerisinde değerler atanıyor cursor için. Bunu istediğimiz vakit on yada off dinamik olarak nasıl yapabiliriz.
int8 const LCD_INIT_STRING[4] =
{
 0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
 0x0f,//0xc,                    // Display on
 1,                      // Clear display
 6                       // Increment cursor
 };

/*
byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xC, 1,6};

Value   Cursor  Blink
0x0C     Off      Off
0x0D     Off      On
0x0E     On       Off
0x0F     On       On

*/
BİRLİKTEN KUVVET DOĞAR:

birumher

Alıntı yapılan: "oyhan"Ama lcd sürücüsünün içerisinde değerler atanıyor cursor için. Bunu istediğimiz vakit on yada off dinamik olarak nasıl yapabiliriz.

void lcd_setcursor_vb(short visible, short blink) {
  lcd_send_byte(0, 0xC|(visible<<1)|blink);
}

lcd.c nin içine veya kendi programına yukarıdaki kodu ekle.
Birkan.Herguner

oyhan

Merhaba birumher
Tam olarak yazmış olduğun rutini anlatabilirmisin. Nasıl çalışır?
BİRLİKTEN KUVVET DOĞAR:

kurumahmut

Kursoru kapatabilirsin, açabilirsin hatta blink yapmasını sağlayabilirsin. Bunun için LCD ne komut yollamalısın.

Display On/Off control denen bir komut (HD44780 uyumlu LCD)
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0   0     0      0     0      0     1     D     C     B
Sets On/Off of all display (D),
cursor On/Off (C)
and blink of cursor position character (B).

İstediğin bir anda bu komutu yollayabilirsin. Arkadaşın yazdığı kodda bu amaç için hazırlanmış olmalı. Visible ve blink değerleri 1 yaparsan kursor açık ve blink yapar. Bit düzeyinde veya işlemi yapılmış...

birumher

Alıntı yapılan: "oyhan"Merhaba birumher
Tam olarak yazmış olduğun rutini anlatabilirmisin. Nasıl çalışır?

lcd_send_byte(0, 0xC|(visible<<1)|blink);

bu kod lcd nin 0. adresine 1 byte veri gönderiyor.

visible değerini 1 sola kaydırıyor yani 2lik sistemde gösterirsek
1 ise 00000010 yapıyor
blink de 1 ise 00000001 olarak kalıyor. Sonra bu değerleri veya operatörüğnden geçiriyor (or)
yani

00001100  0xc
or
00000010
or
00000001

yapıp lcd ye gönderiyor. Bu şekilde cursor ve blink olaylarını LCD bu komutlara göre ayarlıyor...
Birkan.Herguner

oyhan

Tamam kullandım bu yapıyı. Tanımladığım flagler ilede lcd ye veriyi birkez gönderiyorum. İz miz kalmadı. Cursorude programın dilediğim tarafında aktfleştirebiliyorum iyi oldu bu.. Teşekkürler.
BİRLİKTEN KUVVET DOĞAR: