Elektronik / Elektronik Kaynakları/

MikroC Dersleri 6

Sponsorlu Bağlantılar

Merhaba elektronik Severler…

Bir önceki dersimizde Tarama yöntemini ve Button yapısını ugulamalarda kullandık programcılığımızı biraz daha geliştirdik.

Bugün Dersimizde 2×16 LDC göstergeler üzerinde durup dersimizi sonlandıracağız.
Dersimize başlamadan önce işimize yarayabilecek kısa ip uçları vereyim.

  • PICler içerisinde yüklü olan yazılımı çalıştıran çevresel bilgisayarlardır. Her nekadar çok hızlı çalışsalar da biz programlarımızı yazarken PIC yazılımını pıc i gereksiz yere çalıştırmayacak şekilde oluşturulmalıdır.
  • Bir Projenin baskı devre uygulamasını yapmak için bize kolaylık sağlayacak ilk akla gelecek program PROTEUS ares programıdır.

Çok katmanlı çizimler yapmamıza imkan sunar. Alternatif programlar olarak akla gelen Eagle,diptrace boardmarker gibi programlardır.

Arkadaşlar bu dersimizde LCD ekran kullanarak geçen haftalarda olduğu gibi sayaclar oluşturup değerleri ekran da görmemiz mümkün olur. LCD ile sistem tasarlamak siz usta programcılardan çok ikinci kullanıcılar (müşteriler ) için çok önemlidir. Sisteminiz kullanıcısına belli bilgileri sunabildiği ölçüde ve bu sunduğu bilgileri kontrol etme imkanı sunduğu zaman kaliteli bir sistem olarak niteleyebiliriz.

Bu sebeple Pıc ile kontrolü oldukça kolay olan LCD ekranları işlemeden geçemeyeceğim.
Ancak programlasını anlatmadan önce LCD ler hakkında kısa bilgiler vereyim.

LCDler 8Pin yada 4 pin ile kontrolü mümkündür.(PARALEL LCDlerde) Biz pic pinlerinden en fazla yararlanmak için 4pin kullanacağız.

Burada bahsi geçen 4pin LCDye bilginin gönderildiği pinlerdir. Haricen görüntüleme işlemi için tarama . data clock sinyalleri içinde haricen 3 pin kullanacağız yani buda demek oluyorki bize bir tane PORT yeterli oluyor. Hatta bir pinde boş kalıyor bu pinide LCD arka plan ışığını otomatik yakıp söndürmede kullanılabilir. Böylece bütün bir PORT LCD için kullanılmış olur.
LCD displayler 5volt ile çalışırlar.

LCD gerilim seviyesi 4,5 – 5volt seviyesinde tutulmalı ve lcd çalıştırıldığında kontrast ayarı yapılmalıdır. Bu ayar için LCD ekranın 3numaralı pinine bağlanacak bir potansiyometre ile gerilimi ayarlanarak yapılır.

LCD ekranlar içine yüklenen veriler LCD ekran hafızasında tutulur ve yeni veri ile değiştirilmediği sürece bu bilgileri görüntüler. Bu hafıza 2*16 karakteri tutar ve son veriyi saklar.

Evet artık bu bilgiler ışığında LCD kütüphanesine giriş yapabiliriz.

Şimdi bu kütüphanede kullanılan deyimlere bir göz atalım.

LCD8_OUT: Bu komut LCD ekrana, göndermek istediğimiz bilgiyi yollar. Lcd8_Out(1, 3, “HOSGELDIN”); Dersek 1. satır ve 3. haneden itibaren HOSGELDIN Yazısını göstermiş oluruz.

Lcd8_Out_Cp:Kursör’ün bulunduğu yerden itibaren yazıyı ekrana basar.
Lcd8_Out_Cp(“Kursör”); Kursor o onda nerdeyse oradan itibaren burada! yazısını görürüz.

Lcd8_Chr: istediğimiz satır ve sütuna tek bir karakter yazdırmak içindir:
Lcd8_Chr(2, 3, ‘X’); Komutu 2.satır 3.haneye bir X harfi LCD data hafızasına gönderilecektir.

Lcd8_Chr_Cp:Kursorun olduğu noktaya bir karakter basar.
Lcd8_Chr_Cp(‘k’); dediğimizde o anda işaretçi nerdeyse oraya bir k basacaktır.

LCD8_COMMAND: Lcd ekrana ait bazı özellikler bulunmaktadır.Bu komutları LCDye anlatmak istediğimizde bunu kullanılırız. Örnek verirsek ekranı sildirmek için, Lcd_clear komutunu parantez içinde yazarız: Lcd8_Cmd(Lcd_Clear);

Parantez içine yazabileceğimiz Diğer komutlar ve anlamları:

LCD_SECOND_ROW: İşaretçiyi 2.satıra taşır

LCD_THIRD_ROW: İşaretçiyi 3.satıra taşır (3.satır varsa)

LCD_FOURTH_ROW: İşaretçiyi 3.satıra taşır (3.satır varsa)

LCD_CURSOR_OFF: İşaretçiyi kapatır

LCD_BLINK_CURSOR_ON: İşaretçinin yanıp sönmesini sağlar

LCD_MOVE_CURSOR_LEFT: display data RAM değişmeden kursor sola taşınır

LCD_MOVE_CURSOR_RIGHT: display data RAM değişmeden kursor sağa taşınır

LCD_TURN_ON: LCD açılır

LCD_TURN_OFF: LCD kapanır

LCD_SHIFT_LEFT: display data RAM değişmeden ekran sola kayar

LCD_SHIFT_RIGHT: display data RAM değişmeden ekran sola kayar

LCD_UNDERLINE_ON: İşaretçiyi _ haline getirir

LCD_CLEAR: Ekranı temizler

LCD_FIRST_ROW: İşaretçiyi 1.satıra taşır

LCD_RETURN_HOME: İşaretçiyi varsayılan yerine getirir.

Lcd_init(): Bu komutla LCDyi Handi portta Kullanacağımızı belirleriz. Bu komut Aşağıda anlatılmaktadır.

4 bitlik çıkış kullanacağımıza göre önceki gibi ikinci bir porta gerek duyamayacağız. Yukarıda bahsettiğim komutlardaki 8i kaldırmamız 4 bitlik için kullanıma yeterli olmaktadır.

Eğer bizim donanıma uygun tasarımımız söz konusu değilse burada Lcd_init(&PORTB);//(Lcd_init ile PORTB LCD için hazırlandı.) Komutunu kullanırız. Tabiki burada bazı varsayılan değerler sözkonusudur. Bizlerse varsayılan değerleri kullanmak için bu komutun yerine 4 bitlik akış için Lcd_init(&PORTB); ifadesini kullanırsak,

PORTB’nin 0.biti R/W için
PORTB’nin 2.biti RS için
PORTB’nin 3.biti E için ayrılmış olacak
PORTB’nin 4.biti,
PORTB’nin 5.biti,

PORTB’nin 7.biti, data için ayrılmış olacak.

Yani kısaca

LCD_INIT(&PORTB) komutunu yazdığımızda:

D7 → pin.7
D6 → pin.6
D5 → pin.5
D4 → pin.4
E → pin.3
RS → pin.2
RW → pin.0

Olarak kendiliğinden atanacaktır.

Fakat bu varsayılan kontrol pinleri bizim istediğimiz gibi olması gereken durumlarda olabilir.Burada tasarlayacağımız sistemin baskı devresini bile düşünmek zorundayız eğer sade ve atlamasız baskı devreler kuracaksak bu bağlantıların birbirini kesmeyecek şekilde olmalıdır. Bu durumda Lcd_init(); komutu kullanılmadan önce

sbit LCD_RS at RB4_bit; pin atama işlemleri yapılıyor.
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB4_bit; Burada ilgili pinlerin giriş çıkış yönlendirmesi
sbit LCD_EN_Direction at TRISB5_bit; Yapılıyor
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

şeklideki tanımlamalarla istediğimiz kontrol ucunu istediğimiz bir portun pinine aktarabiliriz. Bu yönüyle esnek bir kullanımda söz konusu.

NOT:Proteusun kütüphanesindeki 2×16 lcd ekran için lm 16l anahtar kelimesi ile aranarak inceleme yapabilirsiniz.

NOT: LCD_INIT(&PORTB) fonksiyonunun kullanımım mikroCnin yeni sürümlerinde kaldırılmıştır. Hemen üstteki kullanımı uygulamak gerekmektedir.

**(birde Bu kontrolü assembly kullanarak yapmak var ama bu iş buğday ambarında pire aramaya benzer)

Sanıyorum burada anlatılanları bir uygulama programı ile pekiştirirsek daha kalıcı olacaktır.

Aşağıdaki yazılımın uygulama dosyası hex kodu c kodu ektedir. Sizler üzerinde değişiklik yaparak istediğinizi yazabilirsiniz.

Not:Bu program Yazı kaydırma efekti uygulamasıdır ve ekranda yazı kaydırma ve sabit yazı ile ilgili bilgiler içermektedir.LCD de KAYAN YAZI Uygulamasına güzel bir örnektir.


C yazılımı:

ornitogturunsigned int i,a,l,x;
char *text1; /*karakter tipinde işaretçi tanımlanıyor.İşaretçiler oldukça geniş konudur.sadece * la gösterildiğini bilmek yeterlidir*/
char *isim ;

sbit LCD_RS at RB2_bit; /*LCD bağlantıları ayarlanıyor*/
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

/**************************************************************/
/*************************************************************/

void ayarlar(){
PORTB=0;
TRISB=0x00;
INTCON = 0; // Tüm kesmeler iptal edildi
Lcd_Init(); // Lcd_Init PORTB LCD için hazırlandı
LCD_Cmd(_LCD_CURSOR_OFF); // LCD kursör kapatıldı
LCD_Cmd(_LCD_CLEAR); // LCD de radtgele karekter oluşmaması için silindi
ADCON1 =6; // ADC pinleri Dijitale ayarlandır
CMCON=0x07; // karşılaştırıcı modülleri dijitale ayarlandı
}
/**************************************************************/

void main() {
ayarlar();
for(;;){

text1=” 320VOLT.COM MERHABA ELEKTRONIK SEVERLER “; /*58karekterlik bilgi satırı*/
for(i=0; i<56; i++) /*burada 0 56 arası 57lik döngü kuruldu ve her seferinde bilgi bir artırılarak ekranda gösterilir.*/
{ /*deger 0 iken bilgi sıfır 15 arası ekranda gösterilirdeğer bir artırılır 1 17 arası 2 18 arası*/
text1++; /*bu şekilde yazıya kayma efektri verilir bu yapı aşağıdaki bilgimetni içinde kullanıldı. */
Lcd_out(1,1,text1);
delay_ms(100);
}
LCD_Cmd(_LCD_CLEAR);
delay_ms(50);

isim = ” AYTAC DURGEN mikroC LCD Kutuphanesi Anlatimi “;/*62 karakterlik bilgi satırı*/

for(i=0; i<61; i++)
{
isim++;
Lcd_out(2,1,isim);
delay_ms(100);
}
LCD_Cmd(_LCD_CLEAR);
i=0;
Delay_ms(200);
for(i=0;i<3;i++){

text1= “BURASI 1.SATIR”;
LCD_Cmd(_LCD_CLEAR);
Lcd_out(2,1,text1); /*ekranın 2.satırına sabit yazı 1 karakterden itibaran basılıyor*/

delay_ms(800);
text1= “BURASI 2.SATIR”;
LCD_Cmd(_LCD_CLEAR);
Lcd_out(1,1,text1); /*ekranın 1.satırına sabit yazı 1 karakterden itibaran basılıyor*/

delay_ms(800);
LCD_Cmd(_LCD_CLEAR); /*lcd Ram hafızası siliniyor LCD görüntüsü temizleniyor.*/
}
}
}

MikroC Dersleri 6 uygulama dosyaları: MikroC Dersleri 6

Dosya indirme LINK listesi (TXT formatında) link-14334.zip şifre-pass: 320volt.com

Arkadaşlar haftayaca lcd uygulamalarına devam edeceğiz. Sizlerde ilgili uygulama geliştirmeye çalışın. İyi dersler kolay gelsin.

Aytaç Dürgen

  • aytac dürgen

    Arkadaşlar elimde3n geldiğince programda açıklayıcı ifadeler kullanmaya çalıştım.
    Dersleri yayınlama sıklığım uzayabilir. Malum dönem sonu yaklaşıyor öğrenci sınavları karne işleri biraz zaman alıyor.
    Uğraşan arkadaşlara kolay gelsin

  • SERCAN

    gerçekten microc dersini güzel anlatmışsınız. benim bir projem var. bu projede 2 sıcaklık sensörü kullancağım. bu ds18b20 olabilir. ve işlemci olarak 16f877a kullanacağım. işlemci değişebilir farketmez. bu iki sensörü karşılaştırıp birinci sensör ikinci sensörün değerinden büyük olunca fan çalışacak. sıcaklık dengelenince fan duracak. bana bu konuda yardımcı olursanız sevinirim. şimdiden teşekkürler

  • Aytaç DÜRGEN

    SERCAN: Bahsettiğin uygulama sensörü okumaktan ibaret.
    MikroC de onewire iletişim desteği mevcut sensörü okuyuk değerleri bir değişkene aldığın taktirde programın Gerisi if else if ile yapılacak.
    onewire için mikroC help inden veya mikroelektronika.com sitesindeki projects linkinden faydalanabilirsin.

  • alican kahveci

    hocam çalışırmı daha doğrusu port a 3.bite elektrik gittiğinde yazı yazarmı not:proteusu kuramıyorum lisans alamadığım için biraz pahalı

    sbit LCD_RS at RB2_bit; /*LCD bağlantıları ayarlanıyor*/
    sbit LCD_EN at RB3_bit;
    sbit LCD_D4 at RB4_bit;
    sbit LCD_D5 at RB5_bit;
    sbit LCD_D6 at RB6_bit;
    sbit LCD_D7 at RB7_bit;

    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    void main(){
    if(porta.b3==1){
    lcd_out(1,5,”skd”);
    }
    }

  • aytacdurgen

    Çalışır kodlarda yanlışlık yok programdaki bağlantıya uygun devreyi kurabilirsin.
    Proteusu Bulabilirsin sanıyorum. proteus olmadan gelişim sağlanamaz

  • alican kahveci .

    Çok teşekkür ederim

  • selahaddin

    bu derslerin burada yayınlanmasında emeği olan tüm arkadaşlara teşekürler. bu kadar zamandan sonra umarım bu soruma cevap veren birileri çıkar.. text içindeki deyişkeni lcd de yazdıramıyorum yardım lütfen mesela int sayac=0; diyeceğim ve bu sayac değerini bir butun yardımı ile arttırıp azaltıkca lcd de görünecek şimdiden yardımlar için teşekürler.
    benim yazdığım program aşağıda çalışmıyor mikroc pro

    // Lcd pinout settings
    sbit LCD_RS at RB0_bit;
    sbit LCD_EN at RB1_bit;
    sbit LCD_D4 at RB2_bit;
    sbit LCD_D5 at RB3_bit;
    sbit LCD_D6 at RB4_bit;
    sbit LCD_D7 at RB5_bit;

    // Pin direction
    sbit LCD_RS_Direction at TRISB0_bit;
    sbit LCD_EN_Direction at TRISB1_bit;
    sbit LCD_D4_Direction at TRISB2_bit;
    sbit LCD_D5_Direction at TRISB3_bit;
    sbit LCD_D6_Direction at TRISB4_bit;
    sbit LCD_D7_Direction at TRISB5_bit;

    void main()

    {
    int sayac=12;
    Lcd_Init ();
    Lcd_Cmd(_LCD_CURSOR_OFF);
    Lcd_out(1,1,(text) ) ;
    delay_ms(3000) ;
    Lcd_Cmd(_LCD_CLEAR);

    }

  • evliya

    bende yazdıramadım ne yaptıysam olmadı

    int sayac=20; char SayacSTR[2]; IntToStr(Sayac,SayacSTR);
    Lcd_Out(1,1,SayacSTR);

    nerede yanlış yapıyoruz arkadaşlar bilen varmı

  • mehmet çiçek

    Hocam elinize sağlık

    eğer değişken bir sayıyı lcdde görmek istiyor isek ne yapmalı
    //////////////
    akım=20;
    lcd_out(1,1,akım);
    //////////////////
    akım değiştikçe yansımasını istiyorum. bulamadım yapmam gerekeni.

  • Ruzgar

    arkadaşlar lcd de değişken değeri göstermeyi bende çok aradım en sonun da buldum. Altaş yayıncılığın yeni başlayanlar için mikroc pıc programlama kitabında buldum kitap 16f628a ile uygulamalar yapıyor daha bir sürü şeyler var içinde her neyse direk kodları vereyim;

    void main(){

    char txt[6]; // buradaki sayı 6 olmak zorunda

    unsigned int i=0; // i tanımlandı.

    ayarlar(); // yukarıdaki ayarlar fonksiyonu çağırıldı.

    lcd_init(); // LCD’yi hazırla.

    lcd_cmd(_lcd_clear); // İlk açılışta LCD’de rasgele karaterler oluşmaması için temizlendi.

    lcd_cmd(_lcd_cursor_off); // LCD imleci kapatıldı.

    i=48;

    Wordtostr(i,txt); // i değişkeni text e dönüştürüldü.

    Lcd_out(2,9,txt); // 2 . satır 9. sütun 48 sayısı gözükmektedir
    }
    Teşekkürler :)

  • Ruzgar

    char txt[6]; // buradaki sayı 6 olmak zorunda

    unsigned int akim=0; // akim tanımlandı.Türkçe karakter kullanılmamalı !

    lcd_init(); // LCD’yi hazırla.

    lcd_cmd(_lcd_clear); // İlk açılışta LCD’de rasgele karaterler oluşmaması için temizlendi.

    lcd_cmd(_lcd_cursor_off); // LCD imleci kapatıldı.

    akim=20;

    Wordtostr(i,txt); // i değişkeni text e dönüştürüldü.

    Lcd_out(1,1,txt); //1.satır 1. sutun 20 yazıyor.

    }

  • Mustafa Dinç

    LCD_FOURTH_ROW: İşaretçiyi 4.satıra taşır (4.satır varsa) // küçük bir düzeltme : )