Alfanümerik LCD

Bu projede HD44780 uyumlu bir karakter LCD'nin ATmega8'e nasıl bağlandığını göreceğiz. Ana programımızın çok basit olduğunu fark etmişsinizdir, bunun sebebi RS232 projesinde işlediğimiz üzere bir stream nesnesi yaratıp bu nesneye lcd_putchar fonksiyonunu çıkış fonksiyonu olarak bağlayarak, bundan sonra LCD'ye yazmak için printf fonksiyonunu kullanmamızdır. Tabii bunun bu kadar basit olmasının arkasında, WinAVR'nin geliştiricilerinden Jörg Wünsch'ün hazırlayıp bizlere bedavadan (aslında tam bedava sayılmaz çünkü Jörg programlarını BEERWARE (Bira Lisansı) altında sunuyor, eğer bir gün karşılaşırsanız, kendisine bira ısmarlamanız gerekiyor) sunduğu iki adet C ve iki adet de başlık (header) dosyası var. Bu dosyalar HD44780 uyumlu bir LCD'ye kontrol eden fonksiyonları içeriyor bize de sadece lcd.h dosyasını programımıza eklemek kalıyor ( #include "lcd.h"). Bu arada make dosyamızdaki kaynak (source) kısmına ilgili C dosyalarını eklediğimizi unutmayın (SRC+=ldc.c ve SRC+=hd44780.c).

#include <stdio.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "lcd.h"

//Bu satir ile bir stream objesi yaratilip lcd_put_char fonksiyonuna
//yönlendiriliyor. Printf ve türevleri için gerekli
FILE lcd_str = FDEV_SETUP_STREAM(lcd_putchar, NULL, _FDEV_SETUP_WRITE);
//Ana Program Fonksiyonu
int main(void){
lcd_init(); //lcd'yi hazirla

//standart giris ve cikis lcd_str olsun
stdout = stdin = &lcd_str;

lcd_goto(1,4); //satir 1, sutun 4e git
fprintf_P(stdout,PSTR("LCD Test"));

lcd_goto(2,1); //satir 2, sutun 1e git
fprintf_P(stdout,PSTR("www.berik.net"));

while(1){ //sonsuz dongu
}
}

Bağlantılar ile ilgili olarak dikkat etmeniz gereken önemli bir kaç nokta var. Piyasada bolca bulabileceğiniz HD44780 uyumlu LCD'lerin bacak bağlantıları genellikle şu şekildedir:

Pin
Sembol
İşlev
1
Vss
Power supply (GND)
2
Vdd/Vcc
Power supply (+5V)
3
Vee/Vo
Contrast adjust
4
RS
0 = Instruction input / 1 = Data input
5
R/W
0 = Write to LCD module / 1 = Read from LCD module
6
E
Enable signal
7
DB0
Data pin 0
8
DB1
Data pin 1
9
DB2
Data pin 2
10
DB3
Data pin 3
11
DB4
Data pin 4
12
DB5
Data pin 5
13
DB6
Data pin 6
14
DB7
Data pin 7

Bağlantı

DB0, DB1, DB2 ve DB3 bacakları kullanılmaz. Hangi bacağı işlemcinin hangi portuna bağlayacağımızı derleyiciye bildimemiz gereklidir, bunu defines.h dosyasında yapacağız. Bizim örneğimizde display D portuna bağlanmıştır.

/* HD44780 LCD port connections */
#define HD44780_PORT D
#define HD44780_RS PORT6
#define HD44780_RW PORT4
#define HD44780_E PORT5

/* The data bits have to be in ascending order. */
#define HD44780_D4 PORT0
#define HD44780_D5 PORT1
#define HD44780_D6 PORT2
#define HD44780_D7 PORT3

Buna göre, bağlantılar şu şekilde yapılmalıdır.

LCD Pin 1 ---------------------------> GND
LCD Pin 2 ---------------------------> +5V
LCD Pin 3 ---------------------------> Ayarlı Dirence
LCD Pin 4 ---------------------------> Atmega PD6 (Bacak 12)
LCD Pin 5 ---------------------------> Atmega PD4 (Bacak 6)
LCD Pin 6 ---------------------------> Atmega PD5 (Bacak 11)
LCD Pin 7 ---------------------------> Boş
LCD Pin 8 ---------------------------> Boş
LCD Pin 9 ---------------------------> Boş
LCD Pin 10 ---------------------------> Boş
LCD Pin 11 ---------------------------> Atmega PD0 (Bacak 2)
LCD Pin 12 ---------------------------> Atmega PD1 (Bacak 3)
LCD Pin 13 ---------------------------> Atmega PD2 (Bacak 4)
LCD Pin 14 ---------------------------> Atmega PD3 (Bacak 5)

Eğer siz kendi devrenizde ekranı başka bir porta bağlayacaksanız defines.h dosyasındaki bağlantı tanımlarını değiştirmelisiniz, bunu yaparken 4,5,6, ve 7 numaralı data pinlerinin sırasal olması gerektiğini unutmayın. Bu kısıtlama WinAVR ile gelen LCD kütüphanesi için geçerlidir, Peter Fleury'nin sayfasındaki LCD kütüphanesi bu açıdan daha esnektir, isterseniz projenizde bu kütüphaneyi de kullanabilirsiniz. Peter Fleury'nin web sitesine Download ve Linkler sayfasından ulaşabilirsiniz.

Programda printf yerine fprintf_P fonsiyonun kullanıldığı dikkatinizi çekmiştir. fprintf fonksiyonu printf fonksiyonunun bir türevidir ve çıktının hangi çıktı nesnesine yönlendirileceğini belirten fazladan bir parametre alır. Örneğin programınızda hem LCD ve hem de RS232 bağlantısını girdi ve çıktı olarak birlikte kullanacaksanız, fprintf fonksiyonu işlerinizi kolaylaştıracaktır.

fprintf_P fonksiyonuna gelince, eğer AVR LibC kütüphanesi el kitabını incelediyseniz, pek çok fonksiyonun _P versiyonunun olduğunu görmüşsünüzdür. Bu fonksiyonlar pgmspace.h başlığında tanımlanmış olup, bize sabitleri, değişkenleri ve karakter katarlarını RAM alanında değil flash ROM alanında saklamak ve işlemek imkanını sağlarlar. Böylece çok değerli ve kısıtlı olan RAM alanını daha etkin kullanmamız mümkün olur. PSTR() makrosu bir karakter katarının RAM yerine program belleğinde (flash ROM) saklanmasını sağlar.

Proje Dosyaları

Proje Dosyaları