- PIC projeleri -
15 Haziran 2018 Cuma
PIC adc uygulaması-1
12voltl'a çalışır ve 7805 regüle entegresiyle gerilim 5volt'a düşürülerek pıc16F877 entegresini ve lcd'yi besler.16f877 ile yapılmış adc uygulamasıdır. PIC'in ADC uçları olan E0,E1,E2 pinleri (AN5,AN6,AN7) kullanılmıştır. C5 pini ise kesme ucu olarak kullanılmıştır. Kesme bir programın çalışması sırasında başka bir işlemi de yapmasına denir burayı isterseniz program da ve devre bağlantısında silip iptal edebilirsiniz.
DEVRE ŞEMASI:
CCSC KODU:
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device ADC=10 // 10 bitlik ADC kullanılacağı belirtiliyor.
// 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(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(e) //Port yönlendirme komutları E 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_AD // ADC çevrimi bitti kesmesi
void ADC_Kesmesi ( )
{
output_high(pin_c5); // RC5 çıkışı 1
delay_ms(200);
output_low(pin_c5); // RC5 çıkışı 0
}
unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
float voltaj; // ondalıklı tipte voltaj isminde değişken tanıtılıyor
//********** 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_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
set_tris_c(0x00); // C portu komple çıkış
set_tris_e(0x0F); // E portu komple giriş
output_c(0x00); // C portu çıkışını sıfırla
setup_adc(adc_clock_div_32); // ADC clock frekansı fosc/32
setup_adc_ports(ALL_ANALOG); // Tüm AN girişleri analog
enable_interrupts(INT_AD); // AD çevrimi bitti kesmesi tanıtılıyor
enable_interrupts(GLOBAL); // Tüm kesmeler aktif
lcd_init(); // LCD hazır hale getiriliyor
printf(lcd_putc,"\f ADC UYGULAMASI "); // LCD'ye yazı yazdırılıyor
delay_ms(1500);
while(1) // sonsuz döngü
{
set_adc_channel(5); // RE0/AN5 ucundaki sinyal A/D işlemine tabi tutulacak
delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
voltaj=0.0048828125*bilgi; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
printf(lcd_putc,"\fAN5 Kanali");
delay_ms(1500);
printf(lcd_putc,"\fDijital=%lu",bilgi); // AN5 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN5 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
delay_ms(2500);
set_adc_channel(6); // RE1/AN6 ucundaki sinyal A/D işlemine tabi tutulacak
delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
voltaj=0.0048828125*bilgi; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
printf(lcd_putc,"\fAN6 Kanali");
delay_ms(1500);
printf(lcd_putc,"\fDijital=%lu",bilgi); // AN6 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN6 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
delay_ms(2500);
set_adc_channel(7); // RE2/AN7 ucundaki sinyal A/D işlemine tabi tutulacak
delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
voltaj=0.0048828125*bilgi; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
printf(lcd_putc,"\fAN7 Kanali");
delay_ms(1500);
printf(lcd_putc,"\fDijital=%lu",bilgi); // AN7 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN7 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
delay_ms(2500);
}
}
MALΖEME LİSTESİ:
1-7805
2-4MHz kristal
3-2adet 22pf
4-100nf
5-4k7
6-330ohm
7-2x16 LCD
8-16F877
9-3adet 100ohm
1-7805
2-4MHz kristal
3-2adet 22pf
4-100nf
5-4k7
6-330ohm
7-2x16 LCD
8-16F877
9-3adet 100ohm
10-4adet 10K pot
11-LED
DEVRE ŞEMASI:
CCSC KODU:
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device ADC=10 // 10 bitlik ADC kullanılacağı belirtiliyor.
// 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(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(e) //Port yönlendirme komutları E 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_AD // ADC çevrimi bitti kesmesi
void ADC_Kesmesi ( )
{
output_high(pin_c5); // RC5 çıkışı 1
delay_ms(200);
output_low(pin_c5); // RC5 çıkışı 0
}
unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
float voltaj; // ondalıklı tipte voltaj isminde değişken tanıtılıyor
//********** 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_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
set_tris_c(0x00); // C portu komple çıkış
set_tris_e(0x0F); // E portu komple giriş
output_c(0x00); // C portu çıkışını sıfırla
setup_adc(adc_clock_div_32); // ADC clock frekansı fosc/32
setup_adc_ports(ALL_ANALOG); // Tüm AN girişleri analog
enable_interrupts(INT_AD); // AD çevrimi bitti kesmesi tanıtılıyor
enable_interrupts(GLOBAL); // Tüm kesmeler aktif
lcd_init(); // LCD hazır hale getiriliyor
printf(lcd_putc,"\f ADC UYGULAMASI "); // LCD'ye yazı yazdırılıyor
delay_ms(1500);
while(1) // sonsuz döngü
{
set_adc_channel(5); // RE0/AN5 ucundaki sinyal A/D işlemine tabi tutulacak
delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
voltaj=0.0048828125*bilgi; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
printf(lcd_putc,"\fAN5 Kanali");
delay_ms(1500);
printf(lcd_putc,"\fDijital=%lu",bilgi); // AN5 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN5 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
delay_ms(2500);
set_adc_channel(6); // RE1/AN6 ucundaki sinyal A/D işlemine tabi tutulacak
delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
voltaj=0.0048828125*bilgi; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
printf(lcd_putc,"\fAN6 Kanali");
delay_ms(1500);
printf(lcd_putc,"\fDijital=%lu",bilgi); // AN6 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN6 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
delay_ms(2500);
set_adc_channel(7); // RE2/AN7 ucundaki sinyal A/D işlemine tabi tutulacak
delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
voltaj=0.0048828125*bilgi; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
printf(lcd_putc,"\fAN7 Kanali");
delay_ms(1500);
printf(lcd_putc,"\fDijital=%lu",bilgi); // AN7 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN7 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
delay_ms(2500);
}
}
PIC LM35 LCD termometre
12voltl'a çalışır ve 7805 regüle entegresiyle gerilim 5volt'a düşürülerek pıc16F877 entegresini ve lcd'yi ve LM35 sensörünü besler. 16f877 ile yapılmış termometre uygulamasıdır. PIC'in ADC uçları olan A0 pini (AN0) kullanılmıştır. C5 pini ise lcd çin kullanılmıştır. LM35 ise analog ısı ölçme sensörüdür ve transistöre benzer ortam ısısını +150°c ve -55°c ye kadar ölçerler. LM35 sensörleri her bir derecede 10mv gerilim çıkışı verir.
LM35 BAĞLANTI UÇLARI:
#device ADC=10 // 10 bitlik ADC kullanılacağı belirtiliyor.
// 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(a) //Port yönlendirme komutları A 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
unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
float voltaj,sicaklik; // ondalıklı tipte değişkenler tanıtılıyor
//********** 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_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
set_tris_a(0x01); // RA0 Giriş olarak yönlendiriliyor
setup_adc(adc_clock_div_32); // ADC clock frekansı fosc/32
setup_adc_ports(AN0); //RA0/AN0 girişi analog
lcd_init(); // LCD hazır hale getiriliyor
set_adc_channel(0); // RA0/AN0 ucundaki sinyal A/D işlemine tabi tutulacak
delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
printf(lcd_putc,"\fSicaklik="); // LCD'ye yazı yazdırılıyor
while(1) // sonsuz döngü
{
bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
voltaj=(0.0048828125*bilgi)*1000; // Dijitale çevirme işlemine uğrayan sinyalin mV olarak gerilimi hesaplanıyor
sicaklik=(voltaj/10)+2; // Her 10mV'ta 1 derece artma
lcd_gotoxy(10,1); // İmleç 1. satır 10.sütunda
printf(lcd_putc,"%5.1f'C",sicaklik); // LCD'ye sıcaklık değeri yazdırılıyor
// Gösterilecek ondalıklı değerin toplam basamak sayısı 5 olacak.
// Gösterilecek değerin ondalıklı kısmı ise 1 basamak olacak. %5.1f
// komutu ile bu işlemler yaptırılmıştır.
delay_ms(100); // 100 msn gecikme
}
}
LM35 BAĞLANTI UÇLARI:
MALΖEME LİSTESİ:
1-7805
2-4MHz kristal
3-2adet 22pf
4-100nf
5-4k7
6-2x16 LCD
7-16F877
8-LM35
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.1-7805
2-4MHz kristal
3-2adet 22pf
4-100nf
5-4k7
6-2x16 LCD
7-16F877
8-LM35
#device ADC=10 // 10 bitlik ADC kullanılacağı belirtiliyor.
// 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(a) //Port yönlendirme komutları A 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
unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
float voltaj,sicaklik; // ondalıklı tipte değişkenler tanıtılıyor
//********** 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_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
set_tris_a(0x01); // RA0 Giriş olarak yönlendiriliyor
setup_adc(adc_clock_div_32); // ADC clock frekansı fosc/32
setup_adc_ports(AN0); //RA0/AN0 girişi analog
lcd_init(); // LCD hazır hale getiriliyor
set_adc_channel(0); // RA0/AN0 ucundaki sinyal A/D işlemine tabi tutulacak
delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
printf(lcd_putc,"\fSicaklik="); // LCD'ye yazı yazdırılıyor
while(1) // sonsuz döngü
{
bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
voltaj=(0.0048828125*bilgi)*1000; // Dijitale çevirme işlemine uğrayan sinyalin mV olarak gerilimi hesaplanıyor
sicaklik=(voltaj/10)+2; // Her 10mV'ta 1 derece artma
lcd_gotoxy(10,1); // İmleç 1. satır 10.sütunda
printf(lcd_putc,"%5.1f'C",sicaklik); // LCD'ye sıcaklık değeri yazdırılıyor
// Gösterilecek ondalıklı değerin toplam basamak sayısı 5 olacak.
// Gösterilecek değerin ondalıklı kısmı ise 1 basamak olacak. %5.1f
// komutu ile bu işlemler yaptırılmıştır.
delay_ms(100); // 100 msn gecikme
}
}
PIC LM35 displey termometre
12voltl'a çalışır ve 7805 regüle entegresiyle gerilim 5volt'a düşürülerek pıc16F877 entegresini ve lcd'yi besler. 16f877 ile yapılmış termometre uygulamasıdır. PIC'in ADC uçları olan A0 pini (AN0) kullanılmıştır. C5 pini ise lcd çin kullanılmıştır. LM35 ise analog ısı ölçme sensörüdür ve transistöre benzer ortam ısısını +150°c ve -55°c ye kadar ölçerler. LM35 sensörleri her bir derecede 10mv gerilim çıkışı verir.
LM35:
LM35:
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.
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.
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
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.
Kaydol:
Kayıtlar (Atom)