Merhabalar, bu yazımda sizlere karakter LCD’ler için hazırlamış olduğum LCD bar kütüphanesinden bahsedeceğim.
Bar ingilizce de çizgi, çubuk gibi anlamlara gelmektedir. Bizim uygulamamızda ise LCD’ler üzerinde çubuklar şeklinde gösterilen piksellerdir. Uygulamalarda yoğun kullanımı olan bar göstergeler uygulamaya görsellik katarak daha güzel görünmesini sağlar. Örneğin uygulamanızda bir ses seviyesini LCD ekranda göstermek istiyorsanız, ses değerini sayısal olarak göstermek yerine sayısal değerin yanında barlar şeklinde göstermek(Tv’ler de vs. olduğu gibi) daha iyi olacaktır şüphesiz. Bu gibi örnekler çoğaltılabilir.
Piksel bazında müdahale edebildiğimiz için bar gösterimi gibi uygulamaları grafik tabanlı LCD’ler ile daha kolay yapabiliriz. Fakat grafik LCD’ler hem karakter LCD’lere göre daha pahalı hemde kullanımı daha zordur. Uygulamalarınızda karakter LCD kullanıp sayısal değerlerin yanında bar şeklinde seviye değerleri göstermek isterseniz yazılımsal olarak biraz uğraşmanız gerekecektir.
Daha önceleri burada bar gösterim uygulamaları ile ilgili bir yazı yayınlamıştım. Yazıda C ve Basic dili ile hazırlanmış yatay bar gösterim kütüphaneleri paylaşmıştım. Burada da bar gösterimi kullandığım karakter LCD’li ses ton kontrol uygulaması yayınlamıştım. Fakat önceki paylaştığım kütüphanede barlar yatay olarak gösterildiği için fazla sayıda seviye gösterilemiyordu. Ayrıca dikey olarak gösterilmesi gereken değerlerin gösterimi mümkün değildi.
Şekil 2
Piyasada en yaygın kullanılan karakter LCD’ler 2 sutun 16 satırdan oluşan HD44780 entegreli 2×16 karakter LCD’lerdir. Bu LCD’lerde her katakter 7×5 matris şeklinde pikseller ile ifade edilir. Ayrıca bu LCD’lerin 8 adet özel karakter tanımlama bölgeleri vardır. Yani 8 adet 7×5 piksel boyutunda kendi karakterlerinizi tanımlayabilirsiniz. Karakter LCD’ler Türkçe karakterleri desteklemediği için genel olarak Türkçe karakterler yada özel semboller bu özel karakterler ile ekranda yazdırılır. Ayrıca şekil 2’de görüldüğü gibi bu özel karakterleri kullanarak bar uygulamaları gerçekleştirebilirsiniz. Örneğin 0 ile 7 arasında değişen bir değerimiz olsun ve bunu ekranda dikey bar şeklinde göstermek isteyelim. Bunun için şekil 2’de ki gibi özel karakterlerimizi tanımlayıp kullanabiliriz. Örneğin 3 değerini bar olarak göstermek için sadece ilk 3 satırında ki piksellerin aktif olduğu karakteri kullanabiliriz. Benzer şekilde 7 değeri için tüm satırların dolu olduğu karakteri kullanabiliriz. 0 değeri için ise hiç bir satırın aktif olmadığı boşluk karakterini kullanabiliriz. Bu şekilde sayısal değerimize göre bar değerimizi gösterebiliriz.
Şekil 2’de dikkat ederseniz karakterler yan yana gelince yatay olarak artan bir bar şeklini almaktadır. Aynı şekilde karakterleri yatay olarak ekrana yazdırarak yatay şekilde artan görsel olarak hoş bir bar gösterimi elde edebiliriz. Ayrıca özel karakterlerin pikselleri ile oynayıp bar desenlerini değiştirebilirsiniz. Örneğin satırları bir dolu bir boş şeklinde düzenleyip daha farklı bir bar görüntüsü elde edebilirsiniz. Bar gösterimi ucu açık bir konu olmakla birlikte hayal gücünüze göre çok çeşitli bar desenleri oluşturabilirsiniz. Bar gösteriminin kötü bir tarafı ise karakter LCD’nin özel karakter alanının bar gösterimi için kullanılmasıdır.
Hazırladığım uygulamada 2×16 karakter LCD ile 16 adet dikey barın aynı anda ekranda gösterimi mümkündür. Dikey bar sayısı karakter LCD’nin sütun sayısı ile ilgilidir. Ayrıca 4 adet yatay bar aynı anda ekranda gösterilebilir. Aynı şekilde yatay bar sayısı LCD ekranın boyutu ile ilgilidir. Kütüphanede LCD’nin tüm özel karakterleri bar gösterimi için kullanıldığından başka özel karakter tanımlaması yapılamaz.
Şekil 3
Şekil 3’te LCD bar kütüphanesini kullanarak hazırladığım örnek uygulamaya ait resim görülmektedir. Görüldüğü gibi LCD ekranın sol alt köşesine 7 birimden oluşan yatay bar yerleştirilmiştir. Benzer şekilde 9-16 sütunları arasında 8 adet dikey bar yerleştirilmiştir. Her bir dikey bar 14 seviyeye sahip olup 0-14 arası 15 değer alabilir. Dikey barlar çizdirilir iken ilgili sütunun 2 satırı da kullanılır. Böylelikle 14 seviyeye sahip bar oluşturulabilir. Aynı şekilde yatay bar ise 0-7 arası 8 değer alabilir. Uygulamada 4 adet buton bulunmaktadır. Butonlar sırası ile menu+, menu-, Arttır, Azalt şeklindedir. Ayrıca ekranın sol üst köşesinde o an değeri değiştirilen barın değer görülmektedir. Uygulamada hangi barın seçili olduğunu belirtmek için LCD ekranın kursöründen faydalanılmıştır. Kursör çalışma anında seçili olan dikey barın altına getirilerek hangi barın değerinin ayarlandığı görülebilir.
Kütüphane kodlarını geliştirme kartı üzerinde denediğim için devre şeması mevcut değildir. Uygulama temel olarak 4 adet buton ve 2×16 karakter LCD ve MSP430G2553 denetleyicisinden oluşmaktadır. Uygulamaya ait C kodları aşağıdadır.
/******************************************************** * Yazar: Erhan YILMAZ * * İsim: LCD Bar Uygulaması * * Tarih: 08-11-2014 * * **************************************************** */ // Kullanılan kütüphaneler #include <msp430.h> // MSP430 başlık dosyası #include "LCD.h" // LCD başlık dosyası #include "LCD_Bar.h" // LCD_Bar kütüphanesini ekle // Kullanılan makrolar #define Kursor_Ac LCD_Komut_Yaz(0x0e) #define Kursor_Kapat LCD_Komut_Yaz(0x0c) void Goster(); // Fonksiyon prototipi // Kullanılan değişkenler unsigned short wSayac; unsigned char i,j,menu=0; unsigned char Degerler[9]={3,5,7,9,9,7,5,3,10}; //Barların başlangıç değerleri void main(void) { // Başlangıç ayarları WDTCTL = WDTPW | WDTHOLD; // Watchdog timeri durdur. BCSCTL1 = CALBC1_1MHZ; // Dahili osilatörü 1MHz'e ayarla. DCOCTL = CALDCO_1MHZ; // Dahili osilatörü 1MHz'e ayarla. // Port tanımlamaları P1DIR &= ~(BIT0 + BIT1 + BIT2 + BIT3); P1REN |= BIT0 + BIT1 + BIT2 + BIT3; P1OUT |= BIT0 + BIT1 + BIT2 + BIT3; LCD_Ayarla(); // Başlangıçta LCD ayarlarını yap. LCD_Bar_Hazirla(); // Özel bar karakterlerini yükle. // Başlangıç mesajı LCD_Git_XY(1,1); LCD_Yazi_Yaz("ERHAN YILMAZ LCD"); LCD_Git_XY(2,1); LCD_Yazi_Yaz(" BAR UYGULAMASI "); for(i=0;i<200;i++) _delay_cycles(10000); LCD_Temizle(); // Bar animasyon for(i=0;i<16;i+=2){ for(j=0;j<15;j++){ Bar_Goster_Dikey(i,j); _delay_cycles(10000); } } for(i=1;i<16;i+=2){ for(j=0;j<15;j++){ Bar_Goster_Dikey(i,j); _delay_cycles(10000); } } for(i=0;i<16;i+=2){ for(j=15;j>0;j--){ Bar_Goster_Dikey(i,j); _delay_cycles(10000); } } for(i=1;i<16;i+=2){ for(j=15;j>0;j--){ Bar_Goster_Dikey(i,j); _delay_cycles(10000); } } LCD_Temizle(); // Barların başlangıç değerlerini yükle for(i=0;i<8;i++) Bar_Goster_Dikey(i+8,Degerler[i]); Bar_Goster_Yatay(1,0,Degerler[8]/2); Goster(); while(1){ if(!(P1IN & BIT0)){ // Butona basıldı mı? for(wSayac=0;wSayac<1000;wSayac++); // Buton arkını önlemek için bekle while(!(P1IN & BIT0)); // Butonun bırakılmasını bekle if(++menu>8)menu=0; // Menu değerini arttır Goster(); // Menu değerini ekranda güncelle } if(!(P1IN & BIT1)){ // Butona basıldı mı? for(wSayac=0;wSayac<1000;wSayac++); // Buton arkını önlemek için bekle while(!(P1IN & BIT1)); // Butonun bırakılmasını bekle if(menu==0)menu=8;else menu--; // Menu değerini azalt Goster(); // Menu değerini ekranda güncelle } if(!(P1IN & BIT2)){ // Butona basıldı mı? for(wSayac=0;wSayac<1000;wSayac++); // Buton arkını önlemek için bekle while(!(P1IN & BIT2)); // Butonun bırakılmasını bekle if(Degerler[menu]<14)Degerler[menu]++; // Bar değerini arttır Kursor_Kapat; // LCD kursorü kapat if(menu<8) // Dikey bar mı? Bar_Goster_Dikey(menu+8,Degerler[menu]); // İlgili dikey barı göster else // Değilse Bar_Goster_Yatay(1,0,Degerler[8]/2); // Yatay barı göster Goster(); } if(!(P1IN & BIT3)){ // Butona basıldı mı? for(wSayac=0;wSayac<1000;wSayac++); // Buton arkını önlemek için bekle while(!(P1IN & BIT3)); // Butonun bırakılmasını bekle if(Degerler[menu]>0)Degerler[menu]--; // Bar değerini azalat Kursor_Kapat; // LCD kursorü kapat if(menu<8) // Dikey bar mı? Bar_Goster_Dikey(menu+8,Degerler[menu]); // İlgili dikey barı gösster else // Değilse Bar_Goster_Yatay(1,0,Degerler[8]/2); // Yatay barı göster Goster(); } // Dikey barlar için kursorü aç if(menu<8){ Kursor_Ac; LCD_Git_XY(2,9+menu); } else Kursor_Kapat; } } // Bar değerlerini sayısal olarak ">Barx=y" şeklinde ekranda gösteren fonksiyon void Goster(){ Kursor_Kapat; LCD_Git_XY(1,1); LCD_Yazi_Yaz(">Bar"); LCD_Karakter_Yaz(menu+0x30); LCD_Karakter_Yaz('='); LCD_Karakter_Yaz(Degerler[menu]/10+0x30); LCD_Karakter_Yaz(Degerler[menu]%10+0x30); }
Uygulamanın kodları MSP430G2553 denetleyicisi için Code Composer Studio 5.5.0 geliştirme ortamında C dili ile yazılmıştır. Uygulama çalışınca başlangıçta uygulama ismi vs. yazdırıldıktan sonra barlar ile yapılmış animasyon görüntülenir. Sonrasında ana programa geçilir. Ana programda 8 dikey ve bir yatay bar olmak üzere 9 bar bulunmaktadır. Uygulamada bulunan 4 adet buton ile barların değerleri istenildiği gibi değiştirilebilir. Ben kütüphanemde kullandığım LCD 2 satır olduğu için her bir dikey barı 2×7=14 seviye olacak şekilde oluşturdum.
Örneğin 4 satırlık bir LCD ile 4×7=28 seviyeli dikey barlar oluşturulabilir. Kütüphane dosyasında kullanılacak LCD’nin satır ve sütün sayısı belirtilmelidir. Varsayılan olarak bu değer 2 satır 16 sütun şeklindedir. Uygulama ve kütüphane kodlarına buradan ulaşabilirsiniz. Kütüphane kodları açık olduğu için farklı şekilde, daha fazla değer alabilen, daha optimize barlar geliştirebilirsiniz. Denemelerde MSP430 denetleyicisi kullanılmıştır. Bir kaç değişiklik ile kütüphaneyi diğer denetleyiciler içinde kullanabilirsiniz. Dediğim gibi bar konusu ucu açık bir konu olduğu için çok çeşitli bar uygulamaları gerçekleştirilebilir. Şuanda bu yazıyı yazarken bile aklıma farklı bar şekilleri geliyor. 🙂
Sonuç olarak karakter LCD’ler ile çok çeşitli bar gösterimleri yapabilir, karakter LCD’li uygulamalarınıza görsellik katabilirsiniz. Uygulama ile ilgili hata, görüş, önerilerinizi bildirirseniz elimden geldiğince gerekeni yapmaya çalışırım. Bir sonraki yazıda görüşmek üzere inşaallah, iyi çalışmalar…
Yayım tarihi: 2015/01/19 Etiketler: lcd bar, MSP430 örnekleri, msp430 projeleri, msp430g2553