15 Haziran 2018 Cuma

PIC lcd uygulaması

12voltl'a çalışır ve 7805 regüle entegresiyle gerilim 5volt'a düşürülerek pıc16F877 entegresini ve lcd'yi besler.10k pot ile lcd parlaklık(çözünürlük) ayarını yapmak için kullanılır. 2x16 grafik displey lcd kullanılmıştır. Farklı lcd kullanarak kodları değiştirip istediğiniz yazım şeklini yapa bilirsiniz. PIC'in B portu lcd için kullanılmaktadır.Farklı lcd
kütüphaneleri ile pıc'in farklı portları da kullanıla bilir.


MALΖEME LİSTESİ:
1-7805
2-4MHz kristal
3-2adet 22pf
4-100nf
5-4k7
6-2x16 LCD
7-16F877
8-10K pot

DEVRE ŞEMASI:












CCSC KODU:
#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#include <benim_LCD.c> // benim_LCD.c dosyası programa ekleniyor
/********* ANA PROGRAM FONKSİYONU********/
void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP 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_hazirla(); // LCD başlangıç ayarları yaptırılıyor

   while(1) // Sonsuz döngü
   {
      imlec(1,1); // İmlec 1.satır 1.sütunda
      printf(lcd_veri,"Kendi LCD  Dosya"); // LCD'ye veri yazdırılıyor
      delay_ms(1000);
      imlec(2,4); // İmlec 2.satır 4.sütunda
      printf(lcd_veri,"Denememiz"); // LCD'ye veri yazdırılıyor
      delay_ms(1000);

      lcd_komut(0x01); // LCD sıfırlanıyor

      lcd_komut(0x0E); // İmleç alt çizgi modunda
      imlec(1,6); // İmlec 1.satır 6.sütunda
      printf(lcd_veri,"C"); delay_ms(1000);
      printf(lcd_veri,"C"); delay_ms(1000);
      printf(lcd_veri,"S"); delay_ms(1000);
      printf(lcd_veri," C"); delay_ms(1000);

       lcd_komut(0x01); // LCD sıfırlanıyor

   }
}

LCD KÜTÜPHANESİ:
//////////////////////////////////////////////////////////////
//                    benim_LCD.c                           // 
// Bu LCD sürücü dosyası 2x16 HD44780 uyumlu LCD’ler        //
// için yazılmıştır. LCD’ye sadece yazma yapılacağı için    //
// R/W ucu şaseye bağlanmalıdır. LCD bağlantısı aşağıdadır. //
//////////////////////////////////////////////////////////////
// RB0 -> LCD’nin D4 ucuna
// RB1 -> LCD’nin D5 ucuna
// RB2 -> LCD’nin D6 ucuna
// RB3 -> LCD’nin D7 ucuna
// RB4 -> LCD’nin RS ucuna
// RB5 -> LCD’nin E  ucuna
// R/W ucu direkt şaseye bağlanacak

#define e   pin_b5 // LCD'nin E ucu RB5 pinine bağlı
#define rs  pin_b4 // LCD'nin RS ucu RB4 pinine bağlı

//****** LCD'ye Komut Gönderme Fonksiyonu **********
void lcd_komut(byte komut)
{   
   output_b(komut>>4);   // Komutun yüksek değerli 4 bitini gönder
   output_low(rs);       // LCD komut almak için ayarlandı
   delay_cycles(1);      // 1 komut saykılı bekle   
   output_high(e);       // E ucu lojik-1'den lojik-0'a çekiliyor
   delay_cycles(1);      // 1 komut saykılı bekle
   output_low(e);
   delay_ms(2);          // 2 msn gecikme veriliyor

   output_b(komut&0x0F); // Komutun düşük değerli 4 bitini gönder
   output_low(rs);      // LCD veri almak için ayarlandı  
   delay_cycles(1);      // 1 komut saykılı bekle      
   output_high(e);       // E ucu lojik-1'den lojik-0'a çekiliyor
   delay_cycles(1);      // 1 komut saykılı bekle
   output_low(e);
   delay_ms(2);          // 2 msn gecikme veriliyor
}

//******* LCD'ye Veri Gönderme Fonksiyonu **********
void lcd_veri(byte veri)

   output_b(veri>>4);    // Verinin yüksek değerli 4 bitini gönder
   output_high(rs);      // LCD veri almak için ayarlandı
   delay_cycles(1);      // 1 komut saykılı bekle    
   output_high(e);       // E ucu lojik-1'den lojik-0'a çekiliyor
   delay_cycles(1);      // 1 komut saykılı bekle
   output_low(e);
   delay_ms(2);          // 2 msn gecikme veriliyor

   output_b(veri&0x0F); // Verinin düşük değerli 4 bitini gönder
   output_high(rs);      // LCD veri almak için ayarlandı
   delay_cycles(1);      // 1 komut saykılı bekle    
   output_high(e);      // E ucu lojik-1'den lojik-0'a çekiliyor
   delay_cycles(1);     // 1 komut saykılı bekle
   output_low(e);
   delay_ms(2);         // 2 msn gecikme veriliyor
}

//******* LCD'de İmlec Konumlandırma Fonksiyonu ********
void imlec(byte satir, byte sutun)
{
   if (satir==1)      // Eğer satır değişkeni "1" ise
      lcd_komut(0x80|(sutun-1));

   if (satir==2)      // Eğer satır değişkeni "2" ise
      lcd_komut(0x80|(0x40+(sutun-1)));
}

//********* LCD Başlangıç Ayarları Fonksiyonu ******
void lcd_hazirla()
{
   int i=0;
   output_low(rs); // RS ucu lojik-0
   output_low(e);  // E ucu lojik-0
   delay_ms(30);   // LCD enerjlendiğinde LCD'nin hazır olması için beklenen süre
   
   for(i=0;i<=3;i++)    // LCD'ye 3 kez 0x03 komutu gönderiliyor
   {
      lcd_komut(0x03);
      delay_ms(5);      // 5msn gecikme veriliyor
   }
   lcd_komut(0x02); // LCD'ye 4 bit iletişim komutu gönderiliyor
   lcd_komut(0x28); // 4 bit iletişim, 2 satır, 5x8 dot matris seçildi
   lcd_komut(0x08); // Display Kapalı
   lcd_komut(0x0C); // Display açık,imleç alt çizgi ve yanıp sönme yok
   lcd_komut(0x06); // Her veri yazıldığında imleç bir sağa gitsin
   lcd_komut(0x01); // Display sil. İmleç 1.satır 1.sütunda

}

NOT: LCD kütüphane dosyasının adı benim_LCD olarak mutlaka yazılmalıdır.

Hiç yorum yok:

Yorum Gönder