Son zamanlarda Arduino kartları için çıkarılmış i^2c lcd arayüzleri meşhur oldu.  Sebebi 7, 8 pin kullanarak yapacağınız işi sadece 2 pin ile hallediyor olmanızdan kaynaklanıyor. Zaten endüstriyel elektronikte kullanılan çoğu lcd de i^2c protokolünü kullanıyor.  Bu yüzden bu protokolü öğrenmek ve kullanabilmek önem arz ediyor.

51Xwer+frSL._SY300_

Bu arayüzü Arduino da kullanmak oldukça kolay ve zevkli.  Kullanışlı olmasının diğer bir sebebi de işin çok teknik detayını bilmenize gerek kalmıyor olması.  Arduino için hazırlanmış bir çok hazır kütüphane mevcut. Bu yüzden işinizi iki satır kod ile halledebiliyorsunuz. Peki ya bu arayüzü PIC ve ya diğer mikrodenetleyicilerle kullanacak olsaydık?  Bu yazımda kısaca bu konudan bahsetmeye çalışacağım.

Öncelikle bu arayüzü kullanırken hem LCD nin hem de i2c arayüz entegresinin teknik detaylarını bilmek durumundayız.  İlk önce LCD den başlayacak olursak, normal bir 2*16 karakter LCD, 16 pine sahiptir. Bu pinlerden 3 tanesi, güç pinleri(VEE,VDD,VSS), 3 tanesi kontrol pinleri(RW,RS,EN), 2 tanesi LCD ışık kontrol pini (LED+, LED-), geri kalanları ise verileri LCD ye yazdığımız data pinleridir. (D1-D7).

 

Lcd_0

LCD lerin kendi içerisinde de bir çok kaydedici ve işlemci mevcuttur.  LCD nin her bir kaydedicisi belli bir görev dahilindedir.  Örneğin komut kaydedicilerine kaydedilen bilgiler LCD yi kontrol etmek için kullanılırken, data kaydedicilerine kaydedilen bilgiler LCD ye karakter yazmak için kullanılır.  LCD ye gönderilen tüm bilgiler Data pinlerinden 8 bit veya 4 bit olmak üzere ikilik tabanda gönderilir.  Ve gönderdiğimiz bu bilgilerin ne işe yaradığını da kontrol pinleri aracılığı ile LCD ye bildirip onunla ilişkili kaydedicilere kaydederiz.   Aslında i2c arayüz kartının bize sağladığı şey, verileri  8 ve ya 4 kablo kullanarak göndermektense tek bir hat üzerinden gönderme olanağı sunmasıdır.

i2c protokolü genellikle denetleyicilerin kendi içerisindeki veri transferleri için de kullanılır. Bu protokol bir adet belli bir frekansta kare dalga gönderen clock(sck)  hattına bir de asıl verinin gönderildiği data(SDA) pinine ihtiyaç duyar.   Araya bir de i2c kart girince bu sefer bu kartın kaydedicilerii ve adreslerini ilmek durumunda kalıyoruz. Çünkü tüm veri transferleri belli bir kaydedici adresinden yapılıyor. Bu kaydedici adresleri ürünün katalog bilgilerinde mevcuttur.  Bu bilgilerle kendi kütüphanemizi oluşturabiliriz.   Kullanılan LCD i2c arayüz entegresinin ismi PCF8574T dir. Google üzerinden ismini aratarak datasheet’ine ulaşmanız mümkün. 

#use i2c(master,sda=pin_b0,scl=pin_b1,slow=100000)
#define LCD_ADDR       0x4E   //LCD modülü için I2C slav adresi

#define ON             1 
#define OFF            0 
#define RS             0b00000001  //P0 - PCF8574T'nin 1.pini RS olarak tanımlanıyor.
#define RW             0b00000010  //P1 - PCF8574T'nin 2.pini RW olarak tanımlanıyor. 
#define EN             0b00000100  //P2 - PCF8574T'nin 3.pini EN olarak tanımlanıyor.
#define BACKLIGHT_LED  0b00001000  //P3 - PCF8574T'nin 4.pini LED pini olarak tanımlanıyor 

#define lcd_line_one   0x80   // LCD nin 1. satırı için tanımlı kaydedici adresi 
#define lcd_line_two   0xC0   // LCD nin 2. satırı için tanımlı kaydedici adresi 
#define lcd_line_three 0x94   // LCD nin 3. satırı için tanımlı kaydedici adresi(Eğer varsa) 
#define lcd_line_four  0xD4   // LCD nin 4. satırı için tanımlı kaydedici adresi(Eğer varsa)  



byte address; 

int1 lcd_backlight=ON; 

void i2c_send_nibble(unsigned char data) // i2c ye veri gönderen fonksiyon.
   {    
   
        i2c_start(); 
        delay_us(20); 
        i2c_write(LCD_ADDR); //Slav adres bilgisi gönderiliyor.
        delay_us(20); 
        i2c_write(data);  // Veri gönderiliyor.
        delay_us(20); 
        i2c_stop(); 
        delay_us(20); 
        
   } 

void lcd_send_byte(unsigned char data) // LCD ye veri yazmak için En pininin veri gönderilirken 1, gönderildekten sonra 0 olması gerekir.
   { 
   
        if (lcd_backlight) data=data|EN|BACKLIGHT_LED; else data=data|EN; //EN pini aktif ediliyor 
        i2c_send_nibble(data);                                            
        data=data-4;                                                      //EN pini pasif yapılıyor 
        i2c_send_nibble(data); 
        
   } 
    
void lcd_clear() // LCD temizleme fonsiyonu
{ 

    lcd_send_byte(0x00); 
    lcd_send_byte(0x10); 
    delay_ms(2); 
    
} 

void lcd_init() // LCD yapılandırma fonksiyonu
{ 
    delay_ms(200); 
        
   //LCD ye veri yazmak için başlangıçta RS ve RW pinleri 0 olması gerekir.
 
        lcd_send_byte(0x00); 
        lcd_send_byte(0x10); 
        lcd_send_byte(0x00); 
        lcd_send_byte(0x00); 
        lcd_send_byte(0x10); 
           // 8 bit modu set ediliyor
        lcd_send_byte(0x30); 
        lcd_send_byte(0x30); 
           // 4-bit modu set ediliyor
        lcd_send_byte(0x30); 
        lcd_send_byte(0x20); 
           //4 bit modu, 2 satır, 5 x 7 karakter lcd için yapılandırma verisi (28 h) 
        lcd_send_byte(0x20); 
        lcd_send_byte(0x80); 
           //Cursor pasif yapma verisi(0Ch) 
        lcd_send_byte(0x00); 
        lcd_send_byte(0xC0); 
           //Cursoru sola kaydırma verisi(06 h) 
        lcd_send_byte(0x00); 
        lcd_send_byte(0x60); 
           //ekranı temizleme verisi
        lcd_clear(); 
        
} 

void lcd_gotoxy( byte x, byte y) // Cursor konumlandırma fonksiyonu
{      
static char data; 
      
   switch(y) 
   { 
      case 1:  address= lcd_line_one;     break; 
      case 2:  address= lcd_line_two;     break; 
      case 3:  address= lcd_line_three;   break; 
      case 4:  address= lcd_line_four;    break; 
      default: address= lcd_line_one;     break;  
   } 
  
   address+=x-1; 
   data=address&0xF0; 
   lcd_send_byte(data); 
   data=address&0x0F; 
   data=data<<4; 
   lcd_send_byte(data);
   
} 

//Ekrana yazı yazdırma fonksiyonu 
void LCD_PUTC(char in_data) 
{ 
 char data;      
  switch(in_data) 
   {  
     case '\f': lcd_clear()    ;  break;                
     case '': lcd_gotoxy(1,1);  break; 
     case '': lcd_gotoxy(1,2);  break; 
     case '': lcd_gotoxy(1,3);  break; 
     case '': lcd_gotoxy(1,4);  break; 

     default: 
        data=in_data&0xF0; 
        data=data|RS; //set RS pin to 1 
        lcd_send_byte(data); 
        data=in_data&0x0F; 
        data=data<<4; 
        data=data|RS; //set RS pin to 1 
        lcd_send_byte(data); 
     break; 
   } 
}

 

İşte bir i2c kütüphanesi yazmış olduk. Şimdi yusuf_lcd.c ismindeki bu fonksiyonları içeren kütüphaneyi kendi yazacağım basit programa dahil ederek kullanabilirim.

#include "C:\Users\Electronic-Engin\Documents\pic pro\deneme03\main.h"
#include <yusuf_lcd.c>

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

  


Char string="Test"; 
int16 test=1; 

  lcd_init(); 
 
  
        while (TRUE) 
   {    
          
         lcd_clear();  //LCD temizleme fonksiyonu
         printf(LCD_PUTC,"%s","Project Engineer");  //LCD nin birinci satırına yazı yaılıyor
         delay_ms(1000); 
          
         printf(LCD_PUTC,"%s","Yusuf Bulbul");  //LCD nin ikinci satırına yazı yaılıyor
         delay_ms(1000); 
        
         printf(LCD_PUTC,"\f%s","You Are"); //LCD temizleniyor ve 1 satırına tekrar yazı yazılıyor
         delay_ms(1000); 
          
         printf(LCD_PUTC,"\f%s","Welcome"); //LCD temizleniyor ve 2. satırına tekrar yazı yazılıyor.
         delay_ms(1000);  
          
        
    
} 
}

 

 

1 Yorum