CCS C LCD
LCD NEDİR?
LCD, Liquid Crystal Display yani Sıvı Kristal Ekran elektrikle kutuplanan sıvının ışığı tek fazlı geçirmesi ve önüne eklenen bir kutuplanma filtresi ile gözle görülebilmesi ilkesine dayanan bir görüntü teknolojisidir.
LCD lerde bulunan sıvı kristaller sıcaklığa ve madde yapısına göre termotropik ve liyotropik fazlarda bulunabilirler. Termotropik fazlı sıvı kristallerin bir alt grubu olan nematik likit kristallerin, kıvrık nematikler (twisted nematics - TN) adı verilen çeşidi uygulanan akımın gerilimine bağlı olarak düz konuma yani kıvrık olmayan nematikler haline gelir. Nematik sıvı kristaller, LCD lerin yapılmasını mümkün kılan sıvı kristal fazıdır. LCD lerin yapılabilmesi için ışık polarize edilebilmeli, sıvı kristaller polarize edilmiş ışığı geçirebilmeli, sıvı kristallerin molekül dizilimi elektrik akımı ile değiştirilebilmeli ve elektriği ileten bir yapıya sahip olunmalıdır.
LCD Yapısı ve Çalışma Prensibi
LCD 'lerin yapısı yukarıdaki resimde görüldüğü gibi farklı katmanlardan oluşmaktadır.
LCD katmanları bir araya geldiklerinde paneller meydana gelir. Panellerin çalışma mantığı en basit haliyle, üzerindeki özelleşmiş hücrelerin iyon katmanı tarafından şekillendirilmesi ve elektrik akımıyla görüntü oluşturulması şeklindedir.
Herhangi bir elektrik alan uygulanmadan önce sıvı kristaller kıvrık nematikler (TN) denilen 90 derece kıvrık olacak şekilde sıralanmışlardır. Böylece kristaller arasından geçen ışığın kutuplanmasının yön değiştirmesi sağlanır ve ekran gri görünür. Yeterince yüksek bir voltaj uygulandığında sıvı kristaller kıvrık olmayacak şekilde (untwisted) sıralanırlar ve sıvı kristal katmanından geçişi sırasında ışığın kutuplanma yönü değişmez. Bu durumda ışık ikinci filtreye dik biçimde polarlanır ve katmanı geçemediği için o piksel siyah görünür.
LCD Kullanımı
LCD panelleri robot projelerinde ya da otomasyon projelerinde kullanmak için bilgisayarınızın seri ya da parelel portundan veya bir PIC mikrodenetleyici kullanarak kontrol edebilirsiniz. LCD paneller piyasada satır ve sütun sayılarına göre 1x8, 2x8, 1x16, 2x16, 1x20, 2x20, 1x40 ve 2x40 gibi farklı boyutlarda bulunmaktadır. Bunlar arasında robot projelerinde yaygınlıkla 2x16 boyutlarındaki LCD paneller kullanılmaktadır.
Günümüzde üretilen LCD panellerin çoğunda tek sıra halinde 16 pin bulunur. Bu pinlerden ilk 14 tanesi kontrol için son iki tanesi ise eğer varsa arka ışık için kullanılır. Bazı LCD 'lerde kontrol için kullanılan 14 pin 2 adet 7 li sıra halinde de bulunabilir.
LCD Pinleri--Fonksiyonları
1) Vss---
Toprak (Ground)
2) Vcc---
+5 V
3) VEE---
Kontrast
4) RS---
Register Select
5) RW---
Read / Write
6) E---
Enable
7 D0 - D7---
Data girişleri
15) BL+ ---
Arka panel ışığı pozitif ucu
16) BL- ---
Arka panel ışığı negatif ucu
VEE : Kontrast girişine bağlanan direnç ile LCD panelin kontrastı ayarlanabilir. Direnç değeri yükseldikçe kontrast düşer, azaldıkça ise kontrast yükselir.
RS : Lcd ye komut mu yoksa data mı gönderileceğini belirler. RS girişi "0" (ground) durumundayken komut saklayıcısı, +5V oldugundaysa veri saklayıcısı seçilmiş olur.
RW : Lcd den okuma mı yoksa lcd ye yazma yapılacağını belirler. RW girişi toprağa bağlandığında yani "0" durumundayken LCD yazma modundadır.
E : Enable ucu LCD ve pinler arasındaki gerçek veri alışverişini sağlayan bacaktır. Bu girişi mikrodenetleyiciye program aracılığıyla tanıttıktan sonra PIC kendisi veri gönderileceği zaman bu bacaga enable pulsu gönderir.
D0 - D7 : Data hattı olan bu pinler doğrudan mikrodenetleyicinin bir portuna bağlanır. Veri 4 ya da 8 bitlik veri yolu ile gönderilebilir.
(Yukarıda Yer Alan Anlatıp robotiksistem.com Tarafından Hazırlanmıştır)
printf (
string )
veya
printf (cstring,
values ...)
veya
printf (fname, cstring, values...)
veya
fprintf (
stream , cstring, values...)
String Dize sabit bir dize veya sona karakter boş bir dizidir.
Values Değerler virgülle ayrılmış değişken listesi
Stream bir akış tanımlayıcı (sabit bayt)
Ya standart RS-232 işaretçilerine (ilk iki form) ya da belirli bir fonksiyona karakter dizesi verir. Biçimlendirme dize bağımsız değişkeni uygundur. Değişkenleri kullanıldığında bu dize bir sabit olmalıdır.% Karakteri bir değişken biçimlendirilmiş olması değerdir ve çıkış göstermek için dize içinde kullanılır.Printf uzun ürünler 16 veya 32 bit olabilir. Bir%% tek bir% çıktı.% Için biçimlendirme kuralları izler.
Biçimi:
Biçimi genel formu% nt alır. n isteğe bağlıdır ve 1-9 önde gelen sıfır, ya da kayan nokta ve% w çıkış için 1,1-9,9 göstermek için çıkışı olması, ya da 01-09 kaç karakter belirtmek için olabilir. T türü olup, aşağıdakilerden biri olabilir:
c
Character
s
String or character
u
Unsigned int
d
Signed int
Lu
Long unsigned int
Ld
Long signed int
x
Hex int (lower case)
X
Hex int (upper case)
Lx
Hex long int (lower case)
LX
Hex long int (upper case)
f
Float with truncated decimal
g
Float with rounded decimal
e
Float in exponential format
w
Ondalık ile unsigned int eklenir. N için iki sayı belirtin. İlk toplam alan genişliğidir. İkinci ondalık basamak istenen sayısıdır.
LCD ekranına Değişken Yazdırma Basit Bir Örnek
int aboo67=10;
printf(lcd_putc,"Değer : %d",aboo67);
4x20 Türkçe Kütüphane
/////////////////////////////////////////////////////////////////
// özel_karakter_LCD.c //////
// Bu LCD sürücü dosyası 4x20 HD44780 uyumlu LCD'ler /////
// için yazılmıştır. LCD'ye sadece yazma yapılacağı için /////
// R/W ucu şaseye bağlanmalıdır. LCD bağlantısı aşağıdadır. /////
// Bu LCD dosyasıyla özel karakterler de LCD’de gösterilebilir///
/////////////////////////////////////////////////////////////////
// RB0 -> LCD’nin D4 ucuna
// RB1 -> LCD’nin D5 ucuna
// RB2 -> LCD’nin D6 ucuna
// RB3 -> LCD’nin D7 ucuna
// RB4 -> LCD’nin RS ucuna
// RB5 -> LCD’nin E ucuna
// R/W ucu direkt şaseye bağlanacak
#define e pin_b5 // LCD'nin E ucu RB5 pinine bağlı
#define rs pin_b4 // LCD'nin RS ucu RB4 pinine bağlı
#define lcd_satir_bir 0x00 // 1. satır LCD RAM adresi
#define lcd_satir_iki 0x40 // 2. satır LCD RAM adresi
#define lcd_satir_uc 0x14 // 3. satır LCD RAM adresi
#define lcd_satir_dort 0x54 // 4. satır LCD RAM adresi
//****** LCD'ye Komut Gönderme Fonksiyonu **********
void lcd_komut(byte komut)
{
output_b(komut>>4); // Komutun yüksek değerli 4 bitini gönder
output_low(rs); // LCD komut almak için ayarlandı
delay_cycles(1); // 1 komut saykılı bekle
output_high(e); // E ucu lojik-1'den lojik-0'a çekiliyor
delay_cycles(1); // 1 komut saykılı bekle
output_low(e);
delay_ms(2); // 2 msn gecikme veriliyor
output_b(komut&0x0F); // Komutun düşük değerli 4 bitini gönder
output_low(rs); // LCD komut almak için ayarlandı
delay_cycles(1); // 1 komut saykılı bekle
output_high(e); // E ucu lojik-1'den lojik-0'a çekiliyor
delay_cycles(1); // 1 komut saykılı bekle
output_low(e);
delay_ms(2); // 2 msn gecikme veriliyor
}
//******* LCD'ye Veri Gönderme Fonksiyonu **********
void lcd_veri(byte veri)
{
if (veri=='Ç') veri=0; // Karakter Ç ise CGRAM 0.adresteki bilgiyi gönder
if (veri=='Ğ') veri=1; // Karakter Ğ ise CGRAM 1.adresteki bilgiyi gönder
if (veri=='İ') veri=2; // Karakter İ ise CGRAM 2.adresteki bilgiyi gönder
if (veri=='Ö') veri=3; // Karakter Ö ise CGRAM 3.adresteki bilgiyi gönder
if (veri=='Ş') veri=4; // Karakter Ş ise CGRAM 4.adresteki bilgiyi gönder
if (veri=='Ü') veri=5; // Karakter Ü ise CGRAM 5.adresteki bilgiyi gönder
if (veri=='I') veri=6; // Karakter I ise CGRAM 6.adresteki bilgiyi gönder
if (veri==''') veri=7; // Karakter ' ise CGRAM 7.adresteki bilgiyi gönder
//
//
output_b(veri>>4); // Komutun yüksek değerli 4 bitini gönder
output_high(rs); // LCD veri almak için ayarlandı
delay_cycles(1); // 1 komut saykılı bekle
output_high(e); // E ucu lojik-1'den lojik-0'a çekiliyor
delay_cycles(1); // 1 komut saykılı bekle
output_low(e);
delay_ms(1); // 1 msn gecikme veriliyor
output_b(veri&0x0F); // Komutun düşük değerli 4 bitini gönder
output_high(rs); // LCD veri almak için ayarlandı
delay_cycles(1); // 1 komut saykılı bekle
output_high(e); // E ucu lojik-1'den lojik-0'a çekiliyor
delay_cycles(1); // 1 komut saykılı bekle
output_low(e);
delay_ms(1); // 1 msn gecikme veriliyor
}
//******* LCD'de İmlec Konumlandırma Fonksiyonu ********
void imlec(BYTE satir, BYTE y)
{
BYTE adres;
if(satir == 1)
{
adres = lcd_satir_bir;
}
else if( satir == 2)
{
adres = lcd_satir_iki;
}
else if( satir == 3)
{
adres = lcd_satir_uc;
}
else if( satir == 4)
{
adres = lcd_satir_dort;
}
else
{
adres = lcd_satir_bir;
}
adres = adres + y - 1;
lcd_komut(0x80 | adres);
}
//********* LCD Başlangıç Ayarları Fonksiyonu ******
void lcd_hazirla()
{
int i=0;
output_low(rs); // RS ucu lojik-0
output_low(e); // E ucu lojik-0
delay_ms(30); // LCD enerjlendiğinde LCD'nin hazır olması için beklenen süre
for(i=0;i<=3;i++) // LCD'ye 3 kez 0x03 komutu gönderiliyor
{
lcd_komut(0x03);
delay_ms(5); // 5msn gecikme veriliyor
}
lcd_komut(0x02); // LCD'ye 4 bit iletişim komutu gönderiliyor
lcd_komut(0x28); // 4 bit iletişim, 2 satır, 5x8 dot matris seçildi
lcd_komut(0x08); // Display Kapalı
lcd_komut(0x0C); // Display açık,imleç alt çizgi ve yanıp sönme yok
lcd_komut(0x06); // Her veri yazıldığında imleç bir sağa gitsin
lcd_komut(0x01); // Display sil. İmleç 1.satır 1.sütunda
}
//*** Özel Karakterleri CGRAM'e Yükleyen Fonksiyon ****
void ozel_karakterler()
{
// CGRAM'de 1. Adrese "Ç" Karakteri Kaydediliyor
lcd_komut(0x40);lcd_veri(14);
lcd_komut(0x41);lcd_veri(17);
lcd_komut(0x42);lcd_veri(16);
lcd_komut(0x43);lcd_veri(16);
lcd_komut(0x44);lcd_veri(16);
lcd_komut(0x45);lcd_veri(21);
lcd_komut(0x46);lcd_veri(14);
lcd_komut(0x47);lcd_veri(0);
// CGRAM'de 1. Adrese "Ğ" Karakteri Kaydediliyor
lcd_komut(0x48);lcd_veri(14);
lcd_komut(0x49);lcd_veri(0);
lcd_komut(0x4A);lcd_veri(15);
lcd_komut(0x4B);lcd_veri(16);
lcd_komut(0x4C);lcd_veri(19);
lcd_komut(0x4D);lcd_veri(17);
lcd_komut(0x4E);lcd_veri(15);
lcd_komut(0x4F);lcd_veri(0);
// CGRAM'de 2. Adrese "İ" Karakteri Kaydediliyor
lcd_komut(0x50);lcd_veri(4);
lcd_komut(0x51);lcd_veri(0);
lcd_komut(0x52);lcd_veri(4);
lcd_komut(0x53);lcd_veri(4);
lcd_komut(0x54);lcd_veri(4);
lcd_komut(0x55);lcd_veri(4);
lcd_komut(0x56);lcd_veri(4);
lcd_komut(0x57);lcd_veri(0);
// CGRAM'de 3. Adrese "Ö" Karakteri Kaydediliyor
lcd_komut(0x58);lcd_veri(10);
lcd_komut(0x59);lcd_veri(0);
lcd_komut(0x5A);lcd_veri(14);
lcd_komut(0x5B);lcd_veri(17);
lcd_komut(0x5C);lcd_veri(17);
lcd_komut(0x5D);lcd_veri(17);
lcd_komut(0x5E);lcd_veri(14);
lcd_komut(0x5F);lcd_veri(0);
// CGRAM'de 4. Adrese "Ş" Karakteri Kaydediliyor
lcd_komut(0x60);lcd_veri(14);
lcd_komut(0x61);lcd_veri(17);
lcd_komut(0x62);lcd_veri(16);
lcd_komut(0x63);lcd_veri(14);
lcd_komut(0x64);lcd_veri(1);
lcd_komut(0x65);lcd_veri(21);
lcd_komut(0x66);lcd_veri(14);
lcd_komut(0x67);lcd_veri(0);
// CGRAM'de 5. Adrese "Ü" Karakteri Kaydediliyor
lcd_komut(0x68);lcd_veri(10);
lcd_komut(0x69);lcd_veri(0);
lcd_komut(0x6A);lcd_veri(17);
lcd_komut(0x6B);lcd_veri(17);
lcd_komut(0x6C);lcd_veri(17);
lcd_komut(0x6D);lcd_veri(17);
lcd_komut(0x6E);lcd_veri(14);
lcd_komut(0x6F);lcd_veri(0);
// CGRAM'de 6. Adrese "I" Karakteri Kaydediliyor
lcd_komut(0x70);lcd_veri(4);
lcd_komut(0x71);lcd_veri(4);
lcd_komut(0x72);lcd_veri(4);
lcd_komut(0x73);lcd_veri(4);
lcd_komut(0x74);lcd_veri(4);
lcd_komut(0x75);lcd_veri(4);
lcd_komut(0x76);lcd_veri(4);
lcd_komut(0x77);lcd_veri(0);
// CGRAM'de 7. Adrese "'" Karakteri Kaydediliyor
lcd_komut(0x78);lcd_veri(12);
lcd_komut(0x79);lcd_veri(18);
lcd_komut(0x7A);lcd_veri(18);
lcd_komut(0x7B);lcd_veri(12);
lcd_komut(0x7C);lcd_veri(0);
lcd_komut(0x7D);lcd_veri(0);
lcd_komut(0x7E);lcd_veri(0);
lcd_komut(0x7F);lcd_veri(0);
}
Örnek (4x20 LCD)
lcd_kutuphane.c
//------------------------------------------------------------------------------
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#define LCD_RS PIN_B0
#define LCD_E PIN_B1
//------------------------------------------------------------------------------
#define LCD_LINE_1_ADDRESS 0x00
#define LCD_LINE_2_ADDRESS 0x40
#define LCD_LINE_3_ADDRESS 0x14
#define LCD_LINE_4_ADDRESS 0x54
//------------------------------------------------------------------------------
#define lcd_type 2
int8 lcd_line;
int8 const LCD_INIT_STRING[4] =
{
0x20 | (lcd_type << 2), // Mod: 4-bit, 2+ lines, 5x8 dots
0xc, // Ekran Açık
1, // Ekran Temizle
6 // Artış İmleç
};
//------------------------------------------------------------------------------
void lcd_send_nibble(int8 nibble)
{
// Note: !! bir tamsayı ifade dönüştürür
// Bir boolean (1 ya da 0) için.
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));
delay_cycles(1);
output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
}
//------------------------------------------------------------------------------
// Bu alt rutin sadece lcd_read_byte () tarafından çağrılır.
// Bu tek başına bir rutin değil. Örneğin,
// R / W sinyal önce lcd_read_byte () tarafından yüksek ayarlanır
#ifdef USE_RW_PIN
int8 lcd_read_nibble(void)
{
int8 retval;
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3
retval = 0;
output_high(LCD_E);
delay_us(1);
retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);
output_low(LCD_E);
delay_us(1);
return(retval);
}
#endif
//------------------------------------------------------------------------------
// LCD'den byte okuyup geri döner
#ifdef USE_RW_PIN
int8 lcd_read_byte(void)
{
int8 low;
int8 high;
output_high(LCD_RW);
delay_cycles(1);
high = lcd_read_nibble();
low = lcd_read_nibble();
return( (high<<4) | low);
}
#endif
//------------------------------------------------------------------------------
//LCD byte yollar
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);
#ifdef USE_RW_PIN
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif
if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);
delay_cycles(1);
#ifdef USE_RW_PIN
output_low(LCD_RW);
delay_cycles(1);
#endif
output_low(LCD_E);
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
//------------------------------------------------------------------------------
// LCD hazırlanır
void lcd_init(void)
{
int8 i;
lcd_line = 1;
output_low(LCD_RS);
#ifdef USE_RW_PIN
output_low(LCD_RW);
#endif
output_low(LCD_E);
delay_ms(35);
for(i=0 ;i < 3; i++)
{
lcd_send_nibble(0x03);
delay_ms(5);
}
lcd_send_nibble(0x02);
for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);
#ifndef USE_RW_PIN
delay_ms(5);
#endif
}
}
//------------------------------------------------------------------------------
// LCD'de imleçi istenilen stün,satıra gider
void lcd_gotoxy(int8 x, int8 y)
{
int8 address;
switch(y)
{
case 1:
address = LCD_LINE_1_ADDRESS;
break;
case 2:
address = LCD_LINE_2_ADDRESS;
break;
case 3:
address = LCD_LINE_3_ADDRESS;
break;
case 4:
address = LCD_LINE_4_ADDRESS;
break;
default:
address = LCD_LINE_1_ADDRESS;
break;
}
address += x-1;
lcd_send_byte(0, 0x80 | address);
}
//------------------------------------------------------------------------------
void lcd_putc(char c)
{
switch(c)
{
case '\f':
lcd_send_byte(0,1);
lcd_line = 1;
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1, ++lcd_line); break;
case '\b' : lcd_send_byte(0,0x10); break;
case 'ç' : lcd_send_byte(1,0x00); break;
case 'ğ' : lcd_send_byte(1,0x01); break;
case 'i' : lcd_send_byte(1,0x02); break;
case 'ö' : lcd_send_byte(1,0x03); break;
case 'ş' : lcd_send_byte(1,0x04); break;
case 'ü' : lcd_send_byte(1,0x05); break;
default : lcd_send_byte(1,c); break;
}
}
//------------------------------------------------------------------------------
#ifdef USE_RW_PIN
char lcd_getc(int8 x, int8 y)
{
char value;
lcd_gotoxy(x,y);
while(bit_test(lcd_read_byte(),7));
output_high(LCD_RS);
value = lcd_read_byte();
output_low(LCD_RS);
return(value);
}
#endif
//------------------------------------------------------------------------------
void turkce_karakterler_yukle() {
int i,s,adres=64;
const byte karakter_[8][8] = {
{15,16,16,16,16,15,2,0},//ç // 0
{14, 0,15,17,15, 1,14, 0},//ğ // 1
{4,0,4,4,4,4,4,0}, //i // 2
{10,14,17,17,17,17,14,0},//ö // 3
{15,16,16,14, 1,30, 4, 0},//ş // 4
{10,17,17,17,17,17,14,0},//ü // 5
{ 0, 0, 0, 0, 0, 0, 0, 0},//boş
{ 0, 0, 0, 0, 0, 0, 0, 0} //boş
};
for(i=0;i<=7;i++) {
lcd_send_byte(0,adres);
for(s=0;s<=7;s++)
lcd_send_byte(1,karakter_[i][s]);
adres=adres+8;
}
}
//------------------------------------------------------------------------------
main.c
//------------------------------------------------------------------------------
#include <16F876.h>// Kullanılcak denetleyicinin başlık dosyası tanımlanıyor
#include <stdio.h>
// Denetleyici konfigürasyon ayarları
#FUSES HS //High Speed
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılan osilatör frekansı
#include <lcd_kutuphane.c>
//------------------------------------------------------------------------------
void main()
{
set_tris_b(0b00001100);
set_tris_c(0b11111000);
set_tris_a(0b11111111);
output_c(0x00);
//==============================================================================
//==============================================================================
lcd_init(); // LCD Hazırlanıyor
printf(lcd_putc, "\f"); // LCD Ekranı Temizle
turkce_karakterler_yukle(); // Türkçe Karakterleri Yükle
delay_ms(500); // 500 milisaniye bekle
lcd_gotoxy(3,2); // imleç 2ci satır 3cü stüna git
printf(lcd_putc,"ustaderslik.com"); // ekrana yaz
lcd_gotoxy(3,3); // imleç 3ci satır 3cü stüna git
printf(lcd_putc,"çöğşüiçöğşüiğşi"); // ekrana yaz
while (1){
}
}
//==============================================================================
//==============================================================================