LPC2104 Mikro Denetleyicisini KEIL İle Programlamak Program yazabilmek için öncelikle komutları tanımamız ve ne işe yaradıklarını bilmemiz gerekir. Komutlar yeri geldikçe çalışma içerisinde anlatılacaktır. Öncelikle basit bir led yak söndür programı yazabilmemiz için gerekli komutları göreceğiz. Uygulamalarımız.. Ders1 = LED yak söndür uygulaması Ders2 = 1 buton 1LED uygulaması Ders3 = Karaşişek uygulaması Ders4 = 7 segment display de butonlar ile arttırıp azaltma uygulaması Ders5 = 7 segment display in keypad ile kontrolü (Keypad.h dosyası oluşturma) Ders6 = 7 segment display ve keypad ile şifreli kilit uygulaması (şifre=3639) Ders7 = LCD uygulaması
IODIR0 Mikro denetleyici pinlerini giriş ya da çıkış olarak yönlendirmek için kullanılır. Burada pic mikro denetleyicilere göre ters bir durum mevcuttur. 1 çıkış 0 giriş yapmak için kullanılır. Örnek: IODIR0 = 0x000000FF; //ilk 8 bit çıkış diğer bitleri giriş olarak ayarla IOSET0 Mikro denetleyici pinlerini 1 yapmak için kullanılır. Sadece seçilen pinler 1 yapılır. Seçilmeyen pinlerin durumunda bir değişiklik olmaz. Örnek: IOSET0 = 0x000000FF; //Sadece ilk 8 bit 1 yap diğer bitlerin durumunu değiştirme IOCLR0 Mikro denetleyici pinlerini 0 yapmak için kullanılır. Sadece seçilen pinler 0 yapılır. Seçilmeyen pinlerin durumunda bir değişiklik olmaz. Örnek: IOCLR0 = 0x000000FF; //Sadece ilk 8 bit 0 yap diğer bitlerin durumunu değiştirme IOPIN0 Mikro denetleyici pinlerini 1 ya da 0 yapmak için kullanılır. Sadece seçilen pinler 1 seçilmeyenler ise 0 yapılır. Örnek: IOPIN0 = 0x000000FF; // ilk 8 bit 1 yap diğer bitleri 0 yap Öncelikle KEIL derleyicisi kurulur ve sırasıyla aşağıdaki resimlerdeki gibi bir proje dosyası oluşturulmaya çalışılır.
DERS1 Pin 0 a bağlanmış bir led i 500 milisaniye boyunca 1, 500 milisaniye boyunca 0 yapan programı yazınız. #include <LPC21xx.H> //islemcinin kaynak dosyasi ekleniyor. /* Gecikme Fonksiyonu */ void Gecikme (long int sure) long int i,k; // 16 bitlik i degiskeni tanimlaniyor. for (i=1;i<=sure;i++) // girilen deger i degiskeninden büyük olana kadar for içerisinde dön for (k=0;k<=12000;k++) /* Ana Fonksiyon */ int main (void) IODIR0 = 0x00000001; while (1) //giris cikis ayarlama komutu 1 cikis 0 giris // 1. biti cikis digerleri giris //sonsuz döngü IOSET0 = 0x00000001; //1. biti 1 yap Gecikme(500); //bekleme yap (yaklasik 500 msn - 12Mhz de) IOCLR0 = 0x00000001; //1. biti 0 yap Gecikme(500); //bekleme yap (yaklasik 500 msn - 12Mhz de)
DERS2 Pin 1 e bağlanmış bir butona basıldığında pin 0 a bağlanmış led i yakan, bırakıldığında söndüren programı yazınız. #include <LPC21xx.H> //islemcinin kaynak dosyasi ekleniyor. /* Ana Fonksiyon */ int main (void) IODIR0 = 0x00000001; while (1) //// 1. biti cikis digerleri giris //sonsuz döngü if (IOPIN0&0x00000002) // İkinci pindeki buton IOCLR0 = 0x01; // Birse else IOSET0 = 0x01; // Sifirsa
DERS3 İlk 8 pine bağlı ledler ile kara şimşek programını yazınız. #include <LPC21xx.H> //islemcinin kaynak dosyasi ekleniyor. unsigned int sayac=0,sayac2=1; /* Gecikme Fonksiyonu */ void Gecikme (long int sure) long int i,k; // 16 bitlik i degiskeni tanimlaniyor. for (i=1;i<=sure;i++) // girilen deger i degiskeninden büyük olana kadar for içerisinde dön for (k=0;k<=12000;k++) /* Ana Fonksiyon */ int main (void) IODIR0 = 0x000000FF; while (1) //giris cikis ayarlama komutu 1 cikis 0 giris // ilk 8. biti cikis digerleri giris //sonsuz döngü
for (sayac=1;sayac<=8;sayac++) // 8 defa ayni islemi yapmak için for döngüsü IOPIN0 = sayac2; // 0. portta sayac2 nin bilgisini gönder sayac2 = sayac2 * 2; // sayac2 nin içerisindeki sayı ile 2 yi çarp Gecikme(10); // 10 msn bekle sayac2=64; // sayac2 ye 64 yükle for (sayac=1;sayac<=8;sayac++) // 8 defa ayni islemi yapmak için for döngüsü IOPIN0 = sayac2; // 0. portta sayac2 nin bilgisini gönder sayac2 = sayac2 / 2; // sayac2 nin içerisindeki sayiyi 2 ye böl Gecikme(10); // 10 msn bekle sayac2=2; // sayac2 ye 2 yükle
DERS4 7 segment display de butonlar ile arttırıp azaltma uygulamasını yapınız. #include <LPC21xx.H> //islemcinin kaynak dosyasi ekleniyor. unsigned char sayac=0,sayac2=1; unsigned char segment[11]=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /* Gecikme Fonksiyonu */ void Gecikme (long int sure) long int i,k; // 16 bitlik i degiskeni tanimlaniyor. for (i=1;i<=sure;i++) // girilen deger i degiskeninden büyük olana kadar for içerisinde dön for (k=0;k<=12000;k++) /* Ana Fonksiyon */ int main (void) IODIR0 = 0x000000FF; while (1) // ilk 8. biti cikis digerleri giris //sonsuz döngü if(iopin0&0x00000100) //P0.8 pini ni kontrol et // Birse sayac++; // Sayacı bir arttır Gecikme(25); // 25 msn bekle if(sayac==10)sayac=0; // Eğer sayac 10 ise sayaca 0 yükle if(iopin0&0x00000200) //P0.9 pini ni kontrol et // Birse sayac--; // Sayacı bir azalt Gecikme(25); // 25 msn bekle if(sayac==255)sayac=9; // Eğer sayac 255 ise sayaca 9 yükle if(sayac2!=sayac) // Eğer sayac sayac2 ye eşit değilse sayac2=sayac; //sayac2 ye sayacın içerisindekini yükle IOPIN0 = segment[sayac]; //7 segment display de değeri göster.
#DEFINE #define ile bir pini tanımlamayı ve kullanmayı göreceğiz. Peki, neden define kullanmalıyız? Program içerisinde birçok yerde aynı pin aynı görevde kullanılacaksa ve bu pin kullanıcı tarafından gerektiğinde değiştirilmesi isteniyorsa, kullanıcıya kolaylık sağlaması için define ı kullanabiliriz. Örnek: #define Led 0x00000001; #define Buton 0x00000002; //0. Pin kullanılmak istendiğinde Led olarak kullanılabilir. //1. Pin kullanılmak istendiğinde Buton olarak kullanılabilir. İf (IOPIN0&Buton) IOSET0=Led; else IOCLR0=Led;
DERS5 7 segment display in keypad ile kontrolünü yapınız. Bu uygulamayı Keypad.h dosyası oluşturarak gerçekleştiriniz. Keypad.h dosyası Ekler bölümünde bulunmaktadır. Main.c dosyası ********************************* #include <LPC21xx.H> //islemcinin kaynak dosyasi ekleniyor. #include "Keypad.h" unsigned unsigned char Keypad; char segment[12]=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39,0x0f; /* Ana Fonksiyon */ int main (void) IODIR0 = 0x0000F0FF; while (1) // ilk 8. biti cikis digerleri giris //sonsuz döngü Keypad = KeypadOku(); if(keypad!=55) // eger tusa basilmissa, basilan tusu göster IOPIN0 = segment[keypad];
DERS6 7 segment display ve keypad ile şifreli kilit uygulamasını yapınız. Gecikme.h ve Keypad.h Ekler sayfasında bulunmaktadır. #include <LPC21xx.H> #include "Keypad.h" #include "Gecikme.h" //islemcinin kaynak dosyasi ekleniyor. unsigned char Sayac=0,Keypad,Alinan[4],Sifre[4]=3,6,3,9; unsigned char Segment[12]=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x39,0x0F; /* Ana Fonksiyon */ int main (void) IODIR0 = 0x0000F8FF; // ilk P0.0 - P0.7 ile P0.11 - P0.15 i cikis digerleri giris while (1) //sonsuz döngü
et Keypad=KeypadOku(); if(keypad!=55) // eger tusa basilmissa, basilan tusu göster IOPIN0 = Segment[Keypad]; // Basili tusu göster Alinan[Sayac] = Keypad; // Basislan tusun degerini kaydet Gecikme(1,50); // 50msn bekle (tusu birakmayi bekle) Alinan[3]==Sifre[3]) if (Sayac==3) // Eger 4 tane rakam girildiyse dogrulugunu kontrol if(alinan[0]==sifre[0] && Alinan[1]==Sifre[1] && Alinan[2]==Sifre[2] && Sayac++; else IOPIN0 = 0x00000089; // P0.7 yi ve displayin alt ve üst ledini yak IOPIN0 = 0x00000840; // P0.11 i ve displayin orta ledini yak // Sayac değişkenini 1 arttir
DERS7 LCD ye yazı ve değişken yazdırma uygulaması. LCD.c Ekler bölümünde bulunmaktadır. #include <LPC21xx.H> #include "Gecikme.h" #include "LCDE.c" //islemcinin kaynak dosyasi ekleniyor. unsigned int Deger=255; /* Ana Fonksiyon */ int main (void) IODIR0 = 0x000000FF; Gecikme(1,50); lcd_baslat(); // ilk P0.0 - P0.7 ile P0.11 - P0.15 i cikis digerleri giris Gecikme(1,200); lcd_yazi(1,1,"emrah BUDAK"); lcd_yazi(2,1,"arm LCD Uygulamasi"); Gecikme(1,200); lcd_temizle(); lcd_yazi(1,1,"emrah BUDAK"); lcd_yazi(2,1,"deger= "); lcd_veri(2,8,3,deger); while (1)
Bir eksikliğimiz varsa affola
Ekler: Gecikme.h dosyası ***************************** /* Gecikme Fonksiyonu */ void Gecikme (char Secim, long int Sure) long int i,k; // 16 bitlik i degiskeni tanimlaniyor. for (i=1;i<=sure;i++) // girilen deger i degiskeninden büyük olana kadar for içerisinde dön if(secim==1) for (k=0;k<=12000;k++) Keypad.h dosyası ************************************* /* Keypad'dan bilgi alma fonksiyonu */ #define Satir1 0x00001000 //P0.12 #define Satir2 0x00002000 //P0.13 #define Satir3 0x00004000 //P0.14 #define Satir4 0x00008000 //P0.15 #define Sutun1 0x00000100 //P0.08 #define Sutun2 0x00000200 //P0.09 #define Sutun3 0x00000400 //P0.10 int KeypadOku () unsigned char Keypad; Keypad=55; // 1. satiri seç IOSET0=Satir1; IOCLR0=Satir2; IOCLR0=Satir3; IOCLR0=Satir4; if(iopin0&sutun1)keypad=1; if(iopin0&sutun2)keypad=2; if(iopin0&sutun3)keypad=3; // 2. satiri seç IOCLR0=Satir1; IOSET0=Satir2; IOCLR0=Satir3; IOCLR0=Satir4; if(iopin0&sutun1)keypad=4; if(iopin0&sutun2)keypad=5; if(iopin0&sutun3)keypad=6; // 3. satiri seç
IOCLR0=Satir1; IOCLR0=Satir2; IOSET0=Satir3; IOCLR0=Satir4; if(iopin0&sutun1)keypad=7; if(iopin0&sutun2)keypad=8; if(iopin0&sutun3)keypad=9; // 4. satiri seç IOCLR0=Satir1; IOCLR0=Satir2; IOCLR0=Satir3; IOSET0=Satir4; if(iopin0&sutun1)keypad=10; if(iopin0&sutun2)keypad=0; if(iopin0&sutun3)keypad=11; return Keypad; LCDE.c dosyası //**********************************************************************// // LCDE.c // // // // Emrah BUDAK // // 16/06/2011 // //**********************************************************************// // Komutlar // // // // lcd_baslat(); // Baslangicta kesinlikle yazilmalidir // // lcd_temizle (); // Lcd yi temizlemek için kulanilir // // lcd_yazi(a,b,"deneme"); // Lcd ye yazi yazdirmak için kullanilir // // lcd_veri(a,b,c,deger); // Lcd ye degisken yazdirmak için kullanilir// // // // a= satir // // b= sutun // // c= kaç basamakli olacakgi (1-6) // // Deger= Maksimum 6 basamakli bir sayi int - char // //**********************************************************************// #define LCD_D4 0x10 //P0.04 #define LCD_D5 0x20 //P0.05 #define LCD_D6 0x40 //P0.06 #define LCD_D7 0x80 //P0.07 #define LCD_EN 0x08 //P0.22 #define LCD_RS 0x04 //P0.23
#define LCD_DATA #define LCD_IOALL (LCD_D4 LCD_D5 LCD_D6 LCD_D7) (LCD_D4 LCD_D5 LCD_D6 LCD_D7 LCD_EN LCD_RS) #define lcd_rs_set() IOSET0 = LCD_RS #define lcd_rs_clr() IOCLR0 = LCD_RS #define lcd_en_set() IOSET0 = LCD_EN #define lcd_en_clr() IOCLR0 = LCD_EN #define lcd_temizle() lcd_komut(0x01) #define lcd_cursor_home() lcd_komut(0x02) #define lcd_display_on() lcd_komut(0x0e) #define lcd_display_off() lcd_komut(0x08) #define lcd_cursor_blink() lcd_komut(0x0f) #define lcd_cursor_on() lcd_komut(0x0e) #define lcd_cursor_off() lcd_komut(0x0c) #define lcd_cursor_left() lcd_komut(0x10) #define lcd_cursor_right() lcd_komut(0x14) #define lcd_display_sleft() lcd_komut(0x18) #define lcd_display_sright() lcd_komut(0x1c) void lcd_baslat(void); void lcd_yaz(unsigned char c); void lcd_komut(unsigned char c); void lcd_4bit_gonder(unsigned char Deger); void lcd_bilgi_yaz(unsigned char Deger); void lcd_4bit_gonder(unsigned char Deger) IOCLR0 = (LCD_DATA); IOSET0 = (Deger<<4); void lcd_bilgi_yaz(unsigned char Deger) lcd_en_set(); lcd_4bit_gonder((deger>>4)&0x0f); lcd_en_clr(); Gecikme(1,1); lcd_en_set(); lcd_4bit_gonder((deger)&0x0f);
lcd_en_clr(); Gecikme(1,1); void lcd_yaz(unsigned char c) lcd_rs_set(); lcd_bilgi_yaz(c); void lcd_komut(unsigned char c) lcd_rs_clr(); lcd_bilgi_yaz(c); void lcd_baslat() //IODIR0 = LCD_IOALL; lcd_rs_clr(); lcd_en_clr(); Gecikme(0,2800); lcd_bilgi_yaz(0x30); lcd_bilgi_yaz(0x30); lcd_bilgi_yaz(0x30); lcd_en_set(); lcd_4bit_gonder(0x02); lcd_en_clr(); Gecikme(1,1); //2 satir 4 bit lcd_komut(0x28); //LCD kapat lcd_komut(0x08); //LCD ac lcd_komut(0x0c); //Clear Display lcd_komut(0x01); //Entry mode //lcd_bilgi_yaz(0x06); void lcd_yazi(unsigned char satir, unsigned char sutun, unsigned char* str)
int i; if (satir==1) lcd_komut(0x80 (sutun-1)); if (satir==2) lcd_komut(0x80 (0x40+(sutun-1))); for (i=0;i<16 && str[i]!=0;i++) lcd_yaz(str[i]); void lcd_veri(unsigned char satir, unsigned char sutun, unsigned char bit, unsigned char str) int a,b; if (satir==1) lcd_komut(0x80 (sutun-1)); if (satir==2) lcd_komut(0x80 (0x40+(sutun-1))); if(bit==6) a=str/100000; a=str/10000; a=str/1000; a=str/100; b=str/10; b=b-(a*10); lcd_yaz(0x30 b); a=str%10; if(bit==5) a=str/10000; a=str/1000; a=str/100;
b=str/10; b=b-(a*10); lcd_yaz(0x30 b); a=str%10; if(bit==4) a=str/1000; a=str/100; b=str/10; b=b-(a*10); lcd_yaz(0x30 b); a=str%10; if(bit==3) a=str/100; b=str/10; b=b-(a*10); lcd_yaz(0x30 b); a=str%10; if(bit==2) a=str/100; b=str/10; b=b-(a*10); lcd_yaz(0x30 b); a=str%10; if(bit==1) a=str%10;