I2C Modülü ile 2×16 LCD Ekran Kullanımı
Merhaba arkadaşlar, bu yazımızda Trudyo Geliştirme Kartı ile 2×16 Karakter LCD Ekran ve LCD I2C Seri Arayüz Modülü’nün kullanımından bahsedeceğiz.
LCD Ekranlar Hakkında Kısa Bir Bilgi
Bir kısaltma olan LCD, İngilizce’de Liquid Crystal Display yani Sıvı Kristal Ekran anlamına gelmektedir. LCD, 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. Bir LCD ekranın pinlerini ve bu pinlerin fonksiyonlarını aşağıdaki tablo üzerinden inceleyebilirsiniz.
Pin No | İsim | Açıklama |
1 | VSS | GND Bağlantı Pini |
2 | VDD | +5V Bağlantı Pini |
3 | VEE | Kontrast Ayarlama Pini |
4 | RS | Register Select Pini (0:Command 1:Data) |
5 | R/W | Okuma/Yazma Seçim Pini (0:Yazma 1:Okuma) |
6 | E | Enable Pini |
7-14 | D0-D7 | Data Bitleri Bağlantı Pinleri |
15 | A | LCD Arka Işık +5V Bağlantı Pini |
16 | K | LCD Arka Işık GND Bağlantı Pini |
LCD I2C Seri Arayüz Modülü Hakkında Kısa Bir Bilgi
LCD I2C Seri Arayüz Modülü, birçok karakter LCD ekranını kablo kalabalığı ile uğraşmadan projenize sadece 2 kablo ile bağlayabileceğiniz bir dönüştürücü modüldür. Modüle entegre olan jumper ile kullandığınız ekranın arka aydınlatmasını açıp kapatabilir ve potans ile ekran kontrast ayarını yapabilirsiniz. SDA ve SCL pinlerini kullanan bu modül I2C haberleşmeye sahiptir.
Pin No | İsim | Açıklama |
1 | GND | GND Bağlantı Pini |
2 | VCC | +5V Bağlantı Pini |
3 | SDA | I2C Data Bağlantı Pini |
4 | SCL | I2C Clock Bağlantı Pini |
LCD ve Trudyo Geliştirme Kartı Bağlantısı
Yukarıdaki görsellerde açıkladığı üzere I2C Seri Arayüz Modüllü 2×16 LCD Ekran, Trudyo Geliştirme Kartı‘nın B0 ve B1 pinlerine bağlanmıştır. Modül üzerinde bulunan 10K Ohm değerinde bir Potansiyometre ile LCD ekranın kontrast ayarı yapılabilmektedir.
Bu Uygulamada Kullanılan Malzemeler
Trudyo Geliştirme Kartı
Başlamadan Önce
2×16 LCD Ekran Kullanımı
Bu uygulamada, 2×16 Karakter LCD ekran kullanarak Keypad ile şifreli giriş uygulaması yapacağız. 2×16 karakter LCD ekran kullanımı hakkında ayrıntılı bilgi ve örnek uygulamayı incelemek için daha önce yayınlanan “2×16 LCD Ekran Kullanımı” yazımızı okuyabilirsiniz.
Trudyo Konfigürasyon Ayarları
Trudyo Geliştirme Kartı ile programlama yapabilmek için kartınızın konfigürasyon ayarlarını yapmanız gerekmektedir. Gerekli konfigürasyon ayarlarını yapmak için “Trudyo Konfigürasyon Ayarları” yazımızı okuyabilirsiniz.
2x16 I2C LCD Uygulama Kodları
#include "LCD_I2C.c" // I2C LCD Kütüphanesi
// Connections
sbit LED at LATA4_bit; // Dahili LED RA4 Pinine Bagli
unsigned short i; // Döngü islemlerinde kullanilacak index degiskeni
void main() {
// Port Giris-Çikis Seçimi (0:Çikis, 1:Giris)
TRISA=0b00000000; // [][][][LED][][][][]
TRISB=0b00000000; // [][][][][][][SCK][SDA]
TRISC=0b00000000; // [][][][][][][][]
TRISD=0b00000000; // [][][][][][][][]
TRISE=0b00000000; // [][][][][][][][]
// Port Analog-Dijital Giris Seçimi (0:Dijital, 1:Analog)
ANSELA=0b00000000; // [][][][][][][][]
ANSELB=0b00000000; // [][][][][][][][]
ANSELC=0b00000000; // [][][][][][][][]
ANSELD=0b00000000; // [][][][][][][][]
ANSELE=0b00000000; // [][][][][][][][]
// Port Temizleme
LATA=0x00;
LATB=0x00;
LATC=0x00;
LATD=0x00;
LATE=0x00;
// I2C Hazirlama
I2C1_Init(100000); // I2C LCD kütüphanesi dahili I2C donanimi ile çalismaktadir.
// LCD Ekran Hazirlama
LCD_Init(); // Ekrani hazirla
LCD_Cmd(_LCD_CURSOR_OFF); // Imleci kapat
LCD_Cmd(_LCD_CLEAR); // Ekrani temizle
// Sonsuz Dongu
while(1){
Lcd_Cmd(_LCD_CLEAR); // Ekrani temizle
Lcd_Out(1,6,"TRUDYO"); // 1.Satir 6.Sutuna yaz
Lcd_Out(2,2,"MAKER BLOG IS"); // 2.Satir 2.Sutuna yaz
Lcd_Out_CP("!"); // Imlec konumuna '!' yaz (Bir önceki komutta imlec 2.satir 15.sutunda kalmisti
delay_ms(2000); // 2 saniye bekleme
Lcd_Cmd(_LCD_CLEAR); // Ekrani temizle
Lcd_Chr(2,4,'L'); delay_ms(150); // 2.satir 4.sütuna yaz ve 150ms bekle.
Lcd_Chr_Cp('O'); delay_ms(150); // Imlec konumuna yaz ve 150ms bekle.
Lcd_Chr_Cp('A'); delay_ms(150); // Imlec konumuna yaz ve 150ms bekle.
Lcd_Chr_Cp('D'); delay_ms(150); // Imlec konumuna yaz ve 150ms bekle.
Lcd_Chr_Cp('I'); delay_ms(150); // Imlec konumuna yaz ve 150ms bekle.
Lcd_Chr_Cp('N'); delay_ms(150); // Imlec konumuna yaz ve 150ms bekle.
Lcd_Chr_Cp('G'); delay_ms(150); // Imlec konumuna yaz ve 150ms bekle.
Lcd_Chr_Cp('.'); delay_ms(150); // Imlec konumuna yaz ve 150ms bekle.
Lcd_Chr_Cp('.'); delay_ms(150); // Imlec konumuna yaz ve 150ms bekle.
Lcd_Chr_Cp('.'); delay_ms(150); // Imlec konumuna yaz ve 150ms bekle.
delay_ms(2000); // 2 saniye bekleme
Lcd_Cmd(_LCD_CLEAR); // Ekrani temizle
Lcd_Out(1,1,"WELCOME TO"); // 1.Satir 1.Sutuna yaz
Lcd_Out(2,1,"MAKER BLOG"); // 2.Satir 1.Sutuna yaz
delay_ms(500); // 500ms bekle
while(1){ // Sonsuz döngü
for(i=0;i<6;i++){ // 6 turluk döngü
Lcd_Cmd(_LCD_SHIFT_RIGHT); // tüm ekrani bir kez saga kaydir
delay_ms(500); // 500ms bekle
}
for(i=0;i<6;i++){ // 6 turluk döngü
Lcd_Cmd(_LCD_SHIFT_LEFT); // tüm ekrani bir kez sola kaydir
delay_ms(500); // 500ms bekle
}
}
}
}
2x16 I2C LCD Kütüphane Kodları
#define _LCD_FIRST_ROW 0x80 // Move cursor to the 1st row
#define _LCD_SECOND_ROW 0xC0 // Move cursor to the 2nd row
#define _LCD_THIRD_ROW 0x94 // Move cursor to the 3rd row
#define _LCD_FOURTH_ROW 0xD4 // Move cursor to the 4th row
#define _LCD_CLEAR 0x01 // Clear display
#define _LCD_RETURN_HOME 0x02 // Return cursor to home position, returns a shifted display to
// its original position. Display data RAM is unaffected.
#define _LCD_CURSOR_OFF 0x0C // Turn off cursor
#define _LCD_UNDERLINE_ON 0x0E // Underline cursor on
#define _LCD_BLINK_CURSOR_ON 0x0F // Blink cursor on
#define _LCD_MOVE_CURSOR_LEFT 0x10 // Move cursor left without changing display data RAM
#define _LCD_MOVE_CURSOR_RIGHT 0x14 // Move cursor right without changing display data RAM
#define _LCD_TURN_ON 0x0C // Turn Lcd display on
#define _LCD_TURN_OFF 0x08 // Turn Lcd display off
#define _LCD_SHIFT_LEFT 0x18 // Shift display left without changing display data RAM
#define _LCD_SHIFT_RIGHT 0x1E // Shift display right without changing display data RAM
// LCD Definitions
#define LCD_ADDR 0x4E
const unsigned short HEX00=0x00;
const unsigned short HEX01=0x01;
const unsigned short HEX04=0x04;
const unsigned short HEX06=0x06;
const unsigned short HEX08=0x08;
const unsigned short HEX20=0x20;
const unsigned short HEX28=0x28;
const unsigned short HEX30=0x30;
const unsigned short HEX80=0x80;
const unsigned short HEX94=0x94;
const unsigned short HEXC0=0xC0;
const unsigned short HEXD4=0xD4;
const unsigned short HEXF0=0xF0;
void LCD_Cmd(char out_char) {
char hi_n, lo_n;
char rs = HEX00;
hi_n = out_char & HEXF0;
lo_n = (out_char << 4) & HEXF0;
I2C1_Start();
I2C1_Is_Idle();
I2C1_Wr(LCD_ADDR);
I2C1_Is_Idle();
I2C1_Wr(hi_n | rs | HEX04 | HEX08);
I2C1_Is_Idle();
Delay_50us();
I2C1_Wr(hi_n | rs | HEX00 | HEX08);
I2C1_Is_Idle();
Delay_50us();
Delay_50us();
I2C1_Wr(lo_n | rs | HEX04 | HEX08);
I2C1_Is_Idle();
Delay_50us();
I2C1_Wr(lo_n | rs | HEX00 | HEX08);
I2C1_Is_Idle();
I2C1_stop();
if(out_char == HEX01)
Delay_ms(2);
}
void LCD_Chr(char row, char column, char out_char) {
char hi_n, lo_n;
char rs = HEX01;
column--;
switch(row){
case 1:
LCD_Cmd(HEX80+column);
break;
case 2:
LCD_Cmd(HEXC0+column);
break;
case 3:
LCD_Cmd(HEX94+column);
break;
case 4:
LCD_Cmd(HEXD4+column);
break;
};
hi_n = out_char & HEXF0;
lo_n = (out_char << 4) & HEXF0;
I2C1_Start();
I2C1_Is_Idle();
I2C1_Wr(LCD_ADDR);
I2C1_Is_Idle();
I2C1_Wr(hi_n | rs | HEX04 | HEX08);
I2C1_Is_Idle();
Delay_50us();
I2C1_Wr(hi_n | rs | HEX00 | HEX08);
I2C1_Is_Idle();
Delay_50us();
Delay_50us();
I2C1_Wr(lo_n | rs | HEX04 | HEX08);
I2C1_Is_Idle();
Delay_50us();
I2C1_Wr(lo_n | rs | HEX00 | HEX08);
I2C1_Is_Idle();
I2C1_stop();
}
void LCD_Chr_Cp(char out_char) {
char hi_n, lo_n;
char rs = HEX01;
hi_n = out_char & HEXF0;
lo_n = (out_char << 4) & HEXF0;
I2C1_Start();
I2C1_Is_Idle();
I2C1_Wr(LCD_ADDR);
I2C1_Is_Idle();
I2C1_Wr(hi_n | rs | HEX04 | HEX08);
I2C1_Is_Idle();
Delay_50us();
I2C1_Wr(hi_n | rs | HEX00 | HEX08);
I2C1_Is_Idle();
Delay_50us();
Delay_50us();
I2C1_Wr(lo_n | rs | HEX04 | HEX08);
I2C1_Is_Idle();
Delay_50us();
I2C1_Wr(lo_n | rs | HEX00 | HEX08);
I2C1_Is_Idle();
I2C1_stop();
}
void LCD_Init() {
char rs = HEX00;
I2C1_Start();
I2C1_Is_Idle();
I2C1_Wr(LCD_ADDR);
I2C1_Is_Idle();
Delay_10ms();
Delay_10ms();
Delay_10ms();
I2C1_Wr(HEX30 | rs | HEX04 | HEX08);
I2C1_Is_Idle();
Delay_50us();
I2C1_Wr(HEX30 | rs | HEX00 | HEX08);
I2C1_Is_Idle();
Delay_10ms();
I2C1_Wr(HEX30 | rs | HEX04 | HEX08);
I2C1_Is_Idle();
Delay_50us();
I2C1_Wr(HEX30 | rs | HEX00 | HEX08);
I2C1_Is_Idle();
Delay_10ms();
I2C1_Wr(HEX30 | rs | HEX04 | HEX08);
I2C1_Is_Idle();
Delay_10ms();
Delay_10ms();
Delay_10ms();
Delay_10ms();
Delay_10ms();
I2C1_Wr(HEX30 | rs | HEX00 | HEX08);
I2C1_Is_Idle();
Delay_10ms();
I2C1_Wr(HEX20 | rs | HEX04 | HEX08);
I2C1_Is_Idle();
Delay_50us();
I2C1_Wr(HEX20 | rs | HEX00 | HEX08);
I2C1_Is_Idle();
I2C1_Stop();
Delay_10ms();
LCD_Cmd(HEX28);
LCD_Cmd(HEX06);
}
void LCD_Out(char row, char col, char *text) {
while(*text)
LCD_Chr(row, col++, *text++);
}
void LCD_Out_Cp(char *text) {
while(*text)
LCD_Chr_Cp(*text++);
}
Uygulamaya ait dosyaları buraya tıklayarak indirebilirsiniz. Merak ettiğiniz ve aklınıza takılan soruları aşağıda 👇 yorum olarak bize iletebilirsiniz. İyi çalışmalar. 🙂 #geliştirmeyebaşla
Yorum yapmak için giriş yapmalısınız.