lcd sorunu

Başlatan ozay34, 23 Şubat 2014, 19:59:44

ozay34

arkadaşlar pic ile LCD ye yazı yazdırmaya çalışıyorum. ama LCD ekranında iki satır siyah kutucuk çıkıyor.
datasheetine göre bağlantı yaptım.bağlantılarda yanlışlık yok.pic ile led çalıştırıyorum.lcdye gelince problem çıkarıyor.

#include "16F877A.h"
#fuses XT, NOWDT, NOPROTECT, NOLVP, NOPUT,

#use delay(clock=4000000)
#use fast_io(b)
#define use_portb_lcd TRUE
#include <lcd.c>

void main()
{

set_tris_b(0x00);
lcd_init();

printf(lcd_putc,"\fabc");
delay_ms(100);
}

xfrieyt

sendeki sorun set_tris komutu. küçük basit bi örnek atayım incele . lcd ye komut gönderirken \f \n \a \b komutlarını unutma. (Sırayla ekranı temizle. ikinci satıra geç. Birinci satır da yaz . geri dönüş) Kolay gelsin. Proteusta simülasyon da çok işe yarayıcıdır .





#include <16f877A.h>     
#device ADC=10  // 10 bitlik ADC

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)

#define LCD_ENABLE_PIN  PIN_E2         //LCD E pini RE2 de                                 
#define LCD_RS_PIN      PIN_E0         //LCD RS pini RE0 da                           
#define LCD_RW_PIN      PIN_E1         //LCD RW pini RE1 de                         
#define LCD_DATA4       PIN_D4         //LCD data pinleri                           
#define LCD_DATA5       PIN_D5         //..                           
#define LCD_DATA6       PIN_D6         //..                         
#define LCD_DATA7       PIN_D7         //..                           
#include <lcd.c>                       // lcd.c dosyasi tanıtılıyor

unsigned long int bilgi;         // isaretsiz 16 bitlik tam sayi degiskeni 10 bit donusturme
float voltaj;                    // ondalikli tipte voltaj isimli degisken




void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   lcd_init();   
   printf(lcd_putc,"\f Analog Giris");
   delay_ms(1000);
   
   setup_adc(adc_clock_div_32);     
   setup_adc_ports(RA0_RA1_RA3_ANALOG );       
   set_adc_channel(1);                     
   delay_us(20);                             
   
   
   while(1) // Sonsuz döngü
   {       
      bilgi = read_adc();                         
      voltaj = 0.0048828125 * bilgi;     
     
      printf(lcd_putc,"\fA=%lu",bilgi);       //donusturme degeri
      printf(lcd_putc,"\nVoj=%fV",voltaj);      //voltaj karsiligi                                 
     
     
      delay_ms(1000);                              // 10-bit donusturme, 5V/1024 = 0.0048828125
   }
}

Recep METE

Arkadaşım benim denediğim şu kodları kullan ben denedim çalıştı.Birde siz deneyin.
#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli

#define use_portb_lcd TRUE   // LCD B portuna bağlı

#include <lcd.c>   // lcd.c dosyası tanıtılıyor

int x;      // Tamsayı tipinde değişken tanımlanıyor
float y;    // Ondalıklı tipte değişken tanımlanıyor
char z;     //  Karakter tipinde değişken tanımlanıyor

byte dizi[6]={0x45,0xC6,0xA3,0xE2,0x56};

//********** ANA PROGRAM FONKSİYONU*******

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_b(0x00);   // B portu komple çıkış

   lcd_init();   // LCD hazırlanıyor

   x=10;   // x değişkenine değer veriliyor
   y=32.6; // y değişkenine değer veriliyor
   
   
   
   while(1) // Sonsuz döngü
   {shift_right(dizi,4,1);
      lcd_send_byte(0,0x0d);   // LCD'ye komut gönderiliyor. İmleç yanıp sönsün komutu.
      printf(lcd_putc,"\f     CCS C"); // LCD'ye veri gönderiliyor.
      delay_ms(1000); // 1 sn gecikme
      printf(lcd_putc,"\n  Derleyicisi");
      delay_ms(1000); // 1 sn gecikme
      lcd_gotoxy(1,2);   // Kursör 1.sütun, 2.satıra konumlandırılıyor.
      printf(lcd_putc,"\fX DEGERI=%d",x); // LCD'de tamsayı olarak x değişken değeri görüntüleniyor.
      delay_ms(1000); // 1 sn gecikme
      printf(lcd_putc,"\f\nY DEGERI=%f",y); // LCD'de ondalıklı olarak y değişken değeri görüntüleniyor.
      delay_ms(1000); // 1 sn gecikme
      printf(lcd_putc,"\fDIRENC"); // LCD siliniyor ve "Direnc" stringi yazdırılıyor.
      delay_ms(1000); // 1 sn gecikme
      z=lcd_getc(3,1);  // LCD'de o an 3.Sütun ve 1.Satırda olan karakter alınıyor. Alınan değer z değişkenine aktarılıyor.
      printf(lcd_putc,"\f%c",z);    // z değişkeni LCD'ye aktarılıyor
      delay_ms(2000); // 2 sn gecikme
   }
}



Birde siz 16f877a kullanıyorsunuz onun set up ayarlarına şunu eklemelisiniz.
"setup_comparator(NC_NC_NC_NC);"
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

ozay34

arkadaşlar yanıt için teşekkürler.yayınladığım kodda b yerine d portunu denedim.dün çalıştı.bugün yine aynı şeyi yaptı.anlamadım gitti.verdiğiniz örneklerde de voltaj örneğini denedim.çalıştı.ancak ikinci denememde ???/??o gibi işaretler çıktı.

ozay34

bordda sorun olabilirmi arkadaşlar bunların dışında.çok acil çözmem gerekiyor sorunu.

ozay34

sorun çözüldü arkadaşlar.lcd kütüphanesini yeniledim düzeldi.