PIC Assembly - PIC C 16F877A RBO/INT Kesmesi ile LCD Display Uygulaması By Burak Ablay Posted on 14 Şubat 2015 8 min read 1 1 8,460 Paylaş ! Facebook Paylaş ! Twitter Paylaş ! Google+ Paylaş ! Reddit Paylaş ! Pinterest Paylaş ! Linkedin Paylaş ! Tumblr RB0/INT KESMESİ Arkadaşlar kesme ne işe yarar diye başlayalım. Kesme ani bir durum olduğunda normalde çalıştığı kodun üstünden direkt atlayarak kesme fonksiyonuna girer. Yani kesme program çalıştığı sırada altta çalışmaktadır. Komut sırası ona gelmemesine rağmen siz RB0 a basarsanız. Sizi kesme fonksiyonunun içine atacaktır. RB0/INT KESMESİNİN HI-TECH C DİLİNDE KULLANIMI INTCON kaydedicisinde: INTE biti 1 yapılmalıdır(INT kesmesine izin verir ve kesmenin gelmesini bekler.) , GIE biti 1 yapılmalıdır.(GIE biti genel tüm kesmelere izin verir.) OPTION kaydedicisinde: INTEDG biti 1 ise yükselen kenarda(+) kesme oluşur. INTEDG biti 0 ise alçalan kenarda(-) kesme oluşur. NOT: INT kesmesi oluştuğunda INTF bayrağı 1 olur, alt programda kesmeden çıkmak için ve tekrar kesme beklemesini sağlamak için INTF=0 yapılmalıdır. LCD DISPLAY LCD (Liquid Crystal Display) göstergeli mikro denetleyici uygulamaları ile hayatımızın her alanında (cep telefonları, fotokopi makineleri, otomobiller, kameralar, oyuncaklar, güvenlik sistemleri gibi) karşılaşılmaktadır. Karakter tabanlı dot matrix LCD (paralel/seri) ve grafik LCD olmak üzere iki çeşit LCD vardır. LED gösterge ile sadece sayısal değerler ve sınırlı sayıdaki karakterler gösterilebilmektedir. Buna karşılık LCD göstergeler ile her türlü yazı ve sayısal değeri göstermek mümkündür. LCD’ler çeşitli firmalar tarafından üretilmesine rağmen kontrolleri standartlaşmıştır. LCD KONTROL İŞLEMLERİ LCD göstergeye gönderilen veri ya bir komut kodu veya bir karakterdir. Şekil 3. de LCD göstergeye yazma işlemine ait zamanlama diyagramı görülmektedir. RS ucu düşük seviyeye çekilirse yapılacak işlem bir kontrol işlemidir. Eğer yüksek seviyede tutulursa gönderilen bir karakterdir. LCD’ye her 8 bitlik veri, önce yüksek değerlikli 4 – bit, sonra düşük değerlikli 4 – bit olmak üzere iki defada gönderilir. LCD ekrana veriler ASCII karakter kodları gönderilerek gösterilirler. Mesela ekrana 0 göstermek için, sıfırın ASCII kodu olan 48’i göndermek gerekir. RW=0 ise LCD ye yazma, RW=1 ise LCD den okuma işlemi yapılıyordur. LCD ekrana veri yazmak için aşağıdaki adımlar izlenir; •Veri, veri yoluna konulur, •RS ucu lojik 1 yapılarak, yazma işleminin komut olmadığı belirtilir, •RW ucu lojik 0 yapılır, •E ucuna lojik “1–0” şeklinde bir saat (clock) darbesi verilir. LCD ekrana komut yazmak için ise aşağıdaki adımlar izlenir; •Komut, veri yoluna konulur, •RS ucu lojik 0 yapılarak, yazma işleminin komut olduğu bildirilir, •RW ucu lojik 0 yapılır, •E ucuna lojik “1–0” şeklinde bir saat (clock) darbesi verilir. LCD BAĞLANTI ŞEMASI ##15 Cİ BACAK +VDD 16 CI BACAK İSE -VSS DİR.POTANSİYOMETRENİN ORTA BACAĞINI (VEE) YE SOL BACAĞINI -VSS SAĞ BACAĞINI İSE +VDD YE BAĞLANMALIDIR. DEVRENİN ŞEMASI DEVRENİN HI-TECH C KODU [php] #include <htc.h> //Hitech PIC C Yazılımı #include <stdlib.h> __CONFIG(0X3FF1); void bekle(int b) {int i,j; for(i=0;i<b;i++) for(j=0;j<135;j++); } /* RB0 kesme hizmet fonksiyonu (RB0 kesmesi oluşunca çağırılır) */ void interrupt kesme(){ #define RS RC0 #define RW RC1 #define E RC2 void lcdKomut (unsigned char); void lcdVeri (char); if(INTF){ // RB0 kesme bayrağı 1 ise INTF=0; // Bayrağı sıfırla ve TRISD=0; TRISC=0; E=0; bekle(250); lcdKomut(0x38);//2 satır 5*7 matrix bekle(250); lcdKomut(0x0E); //display ve kursor açık bekle(15); lcdKomut(0x01);//Ekranı temizle bekle(15); lcdKomut(0x06);//Kursor sağa kaysın bekle(15); lcdKomut(0x86);//1. satır,6.sıra bekle(15); lcdVeri(‘R’); bekle(15); lcdVeri(‘O’); bekle(15); lcdVeri(‘B’); bekle(15); lcdVeri(‘O’); bekle(15); lcdVeri(‘T’); bekle(15); lcdVeri(‘U’); bekle(15); lcdVeri(‘R’); bekle(15); lcdVeri(‘K’); bekle(15); lcdVeri(‘A’); } } void lcdKomut(unsigned char k) { PORTD=k; RS=0; RW=0; E=1; bekle(1); E=0; } void lcdVeri(char veri) { PORTD=veri; RS=1; RW=0; E=1; bekle(1); E=0; } void main(){ INTF=0; // RB0 kesme bayrağı INTE=1; // RB0 kesme yetkisi INTEDG=0; // Harici tetikleme girişi 1 -> Yükselen, 0->Düşen kenar GIE=1; // Global kesme yetkisi while(1); // Sonsuz döngüde kesme bekle } [/php] DEVRENİN VİDEOSU: Devrenin hex dosyasını buradan bulabilirsiniz…