C ile AVR Programlama -24- Karakter LCD (HD44780) Kütüphanesi

Arduino’dan AVR’ye geçenlerin en büyük sıkıntısı artık kütüphane olmayışı ve çoğu işi sıfırdan kendimiz yapmamız gerektiği algısıdır. Temel giriş ve çıkış bir şekilde halledilse de geri kalan işimizi kolaylaştıran kütüphaneler elimizin altında yoktur. Fakat ufak bir araştırma yapıldığı zaman aslında AVR için oldukça fazla kütüphane yazıldığının farkına varabilirsiniz. Arduino AVR kütüphanelerinin yazılıp paylaşılmasına bir bakıma engel olmaktadır. Çünkü AVR programcısı olacak kişiler Arduino’yu tercih etmektedir. O yüzden AVR bilenler AVR kütüphanesi yazmak yerine Arduino kütüphanesi yazmayı daha yararlı bulmaktadır. Kütüphane bulmada ilk engelimiz binlerce Arduino kütüphanesi olup AVR kütüphanelerinin arka planda kalmasıdır. Yine de Github’dan arattığımız zaman yeterli miktarda kütüphane bulabiliyoruz. Mevcut olmayan kütüphaneleri ise Arduino kütüphanelerini değiştirerek yazmak mümkündür. Şimdi karakter LCD kullanımı için yazılmış bir kütüphanenin bağlantısını ve referansını açıklayacağız.

Önümüzde yazılacak onlarca ders olduğu için uygulama yapmaya vakit bulamıyoruz. Uygulama eksiği olanlar internette yer alan onlarca Arduino uygulamasına bakabilir. Bu dersler Arduino ile yeterli uygulamayı yapmış, nasıl devre kuracağını anlamış kişiler için yazılmıştır. O yüzden bu konuda eksiği olanlar şimdilik Arduino uygulamalarına bakabilir.

Karakter LCD kütüphanesi aşağıdaki bağlantıdan indirilebilir.
http://homepage.hispeed.ch/peterfleury/lcdlibrary.zip

 

Tanımlar

#define LCD_CONTROLLER_KS0073 0 
Bu tanım LCD üzerinde bulunan kontrolcü entegreyi seçmeye yarar. HD44780 kullanılıyorsa sıfır (0), KS0073 kullanılıyorsa bir (1) yapılmalıdır. Günümüzde genelde HD44780 entegreli LCD ekranlar kullanılmaktadır. Buna dikkat edilmezse ekran çalışmayabilir.

Bu tanımlamalar lcd_definations.h dosyasında bulunmaktadır. Program yazmadan önce muhakkak kullanacağınız ekranın değerlerini bu tanımlardan değiştirmeniz gereklidir. Eğer değiştirmezseniz programınız çalışmayabilir.

LCD EKRAN AYARLARI

#define LCD_LINES 2
Bu tanım LCD ekranın kaç satır olacağını belirler. Genellikle 2 veya 4 satır olmaktadır. Buradan kaç satır olacağını belirleyebilirsiniz.

#define LCD_DISP_LENGTH 16

Bu tanım LCD ekranının kaç sütün olacağını belirler. Eğer elimizde 16×2 LCD varsa burası 16 olmalıdır. Eğer 20×4 gibi bir ekran varsa burayı 20 yapmalıyız.

#define LCD_LINE_LENGTH 0x40

Bu tanım LCD’nin satırındaki veri uzunluğunu belirlemeye yarar.

#define LCD_START_LINE1 0x00

LCD’nin birinci satırındaki DRAM adresini belirlemeye yarar.

#define LCD_START_LINE2 0x40

LCD’nin ikinci satırındaki DRAM adresini belirlemeye yarar.

#define LCD_START_LINE3 0x14

LCD’nin üçüncü satırındaki DRAM adresini belirlemeye yarar.

#define LCD_START_LINE4 0x54

LCD’nin dördüncü satırındaki DRAM adresini belirlemeye yarar.

#define LCD_WRAP_LINES 0

LCD’de satırları döndürmeye yarar. Görünen satırın sonunu döndürür.

LCD AYAK AYARLARI

#define LCD_IO_MODE 1
0: Hafıza haritalantırma modu, 1: IO Port Modu

#define LCD_PORT PORTA

LCD ayakları için port seçimi

#define LCD_DATA0_PORT LCD_PORT

4-bit verinin 0. biti için port seçimi

#define LCD_DATA1_PORT LCD_PORT

4-bit verinin 1. biti için port seçimi

#define LCD_DATA2_PORT LCD_PORT

4-bit verinin 2. biti için port seçimi

#define LCD_DATA3_PORT LCD_PORT

4-bit verinin 3. biti için port seçimi

#define LCD_DATA0_PIN 0

4-bit verinin 0. biti için ayak seçimi

#define LCD_DATA1_PIN 1

4-bit verinin 1 . biti için ayak seçimi

#define LCD_DATA2_PIN 2

4-bit verinin 2. biti için ayak seçimi

#define LCD_DATA3_PIN 3

4-bit verinin 3. biti için ayak seçimi

#define LCD_RS_PORT LCD_PORT

RS ayağı için port seçimi. Buraya başka port adı da girilebilir.

#define LCD_RS_PIN 4

RS ayağı için ayak seçimi.

 #define LCD_RW_PORT LCD_PORT

RW ayağı için port seçimi.

#define LCD_RW_PIN 5

RW ayağı için pin seçimi

#define LCD_E_PORT LCD_PORT

Enable ayağı için port seçimi

#define LCD_E_PIN 6

Enable ayağı için ayak seçimi

#define LCD_DELAY_BOOTUP 16000

Açılışta kaç mikrosaniye bekleneceği belirlenir.

#define LCD_DELAY_INIT 5000

Yükleme komutu gönderildikten sonra kaç mikrosaniye bekleneceği belirlenir.

#define LCD_DELAY_INIT_REP 64

Yükleme komutu tekrarlandıktan sonra kaç mikrosaniye bekleneceği belirlenir.

#define LCD_DELAY_INIT_4BIT 64

4-bit modunu seçtikten sonraki beklemeyi belirler. (mikrosaniye)

#define LCD_DELAY_BUSY_FLAG 4 

Meşgul bayrağı temizlenip adres satırı güncellendikten sonraki mikrosaniye beklemenin ne kadar olacağını kararlaştırır.

#define LCD_DELAY_ENABLE_PULSE 1

Enable ayağının sinyal genişliğini mikrosaniye olarak ayarlar.

LCD KOMUT AÇIKLAMALARI

Bu komutlar lcd_command() fonksiyonu ile kullanılabilir.

LCD Fonksiyonları

void lcd_init(uint8_t dispAttr)

Ekranı tanımlar ve imleci belirler.

Parametreler
dispAttr:
LCD_DISP_OFF  : Ekran Kapalı
LCD_DISP_ON    : Ekran Açık, İmleç Kapalı
LCD_DISP_ON_CURSOR : Ekran açık, imleç açık
LCD_DISP_ON_CURSOR_BLINK : Ekran açık, Yanan imleç

Örneğin ekranımız açık olsun ve imlecimiz sabit olsun bunun için şöyle bir kod yazacağız,
lcd_init(LCD_DISP_ON_CURSOR);

 

void lcd_clrscr (void)

Ekranı temizler ve imleci başa getirir.  Örnek kullanım:

lcd_clrscr();

 

void lcd_home ( void )

İmleci başa alır. Örnek kullanım:

lcd_home();

void lcd_gotoxy ( uint8_t x, uint8_t y )

İmleci belirlenen bir konuma getirir.

Parametreler 

x: Yatay konum (0 en sol)
y: Dikey konum (0 en üst)

Örnek bir kullanım şöyle olabilir,
lcd_gotoxy(5,1);

void lcd_putc ( char c )

Mevcut imleç konumunda bir karakter gösterir

Parametreler
c : gösterilecek karakter

Örnek bir kullanım şöyle olabilir,
lcd_putc (‘a’);

void lcd_puts ( const char* s)

Otomatik satır beslemesi ile harf dizisini gösterir.
Parametreler
s : Gösterilecek harf dizisi verisi
Örnek bir kullanım şöyle olabilir,
lcd_puts(“Merhaba”);

void lcd_puts_p ( const char* progmem_s)

Program hafızasındaki harf dizisi verisini gösterir.
Parametreler

progmem_s Program hafızasındaki gösterilecek harf dizisi.

void lcd_command ( uint8_t cmd)

LCD’ye işlemci komutu gönderilir.

Parametreler
cmd : LCD gönderilecek işlemci komutu. HD44780 teknik veri kitapçığında bulunabilir.

void lcd_data ( uint8_t data )

LCD’ye bayt verisi gönderir.
Parametreler
data : LCD sürücüye gönderilecek bayt verisi. Hd44780 teknik veri kitapçığına bakın.

LCD’ye Integer Yazdırmak 

Yukarıdan anlaşılacağı üzere LCD’ye sadece karakter ve string yazdırıldığını fark etmişsinizdir. Şimdi sprintf() fonksiyonu ile integer değerini harf dizisine dönüştürüyoruz ve LCD’ye yazdırıyoruz. Aynı zamanda LCD ile örnek bir programı da görebilirsiniz.

LCD’nin çalışma prensibini Gömülü Sistemler kategorisinde, LCD ile örnek uygulamaları ise AVR uygulamalarına başladığımız zaman yazacağız. Şimdilik ihtiyacı olanlar için kütüphaneyi açıklayarak derslerimize devam edelim. Şimdiye kadar anlattığımız bilgilerle bu kütüphaneyi kullanmak mümkün olduğu için bu kadarıyla yetinip bir sonraki konuya geçelim.

Kapak Resmi :https://d3s11pzv7w3h1q.cloudfront.net/wp-content/uploads/IC-ATMEGA8A-PU-2.jpg

UYARI!!

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

10 Responses

  1. İlker Aykut dedi ki:

    #define LCD_DATA1_PORT LCD_PORT hocam burda bu ifade neye eşit?

    • Gökhan Dökmetaş dedi ki:

      LCD_PORT ne olarak tanımlandıysa ona eşitleniyor. PORTA ise PORTA . Oraya LCD_PORT yazmak yerine istediğin portu da yazabilirsin kodun üstünde LCD_PORT diye ayrı bir tanım yapılmış zaten.

      • Anonim dedi ki:

        Hocam lcdnin devamı ne zaman gelir?

        • Gökhan Dökmetaş dedi ki:

          Mikrodenetleyicinin temel konuları datasheet üzerinden bittiğinde artık uygulamalara yer vereceğiz. O zaman lcd’ye de sıra gelecek.

  2. Ali Baransel ORAL dedi ki:

    LCD ye Hello World yazdıran programı atar mısınız ?
    Yapamadım ve örnek yok.

    • #define F_CPU 16000000UL
      #include
      #include “lcd.h”

      int main (void)
      {

      lcd_init(LCD_DISP_ON);
      lcd_clrscr();
      lcd_home();
      lcd_puts(“Hello World”);
      while(1)
      {

      }
      }

      • Ali Baransel ORAL dedi ki:

        Atmel Studio da programı derleyince lcd_clrscr() lcd_home() lcd_puts() undefined yazıyor
        neden tanımlanmamış görüyor?
        2. satırdaki #include da açıklarsanız sevinirim.
        Teşekkürler

        • 2. satır avr/io.h başlık dosyasını alıyor. Burada çıkmamış.
          Kütüphane dosyalarını eklediğinizden emin misiniz ? Kütüphanenin nasıl ekleneceği önceki derslerde var.

  3. cemal dedi ki:

    make file ne işe yarıyor hocam. onu da ekleyecek miyiz projeye?

  4. cemal dedi ki:

    herşeyi yaptım ama bu hatalar çıkıyor;
    Error: undefined reference to `lcd_command(unsigned char)
    Error: recipe for target ‘LCD_deneme’ failed
    Error: ld returned 1 exit status

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.