CCS C karakter LCD kütüphanesi

Başlatan rojhatbilge, 18 Ekim 2009, 16:54:00

rojhatbilge

Herkese merhabalar

Kendi yazdığım, içinde Türkçe karakterlerinde bulunduğu 2x16 LCD kütüphanesini yayınlıyorum.

#ifndef _BENIMLCD_C_
#define _BENIMLCD_C_

#ifdef  LCD_PORT_B
#define enable          pin_B3
#define rs_xxxx         pin_B2
#define X_LCD_DATA_X    output_B
#define X_LCD_TRIS_X    set_tris_B
#endif

#ifdef  LCD_PORT_C
#define enable          pin_C3
#define rs_xxxx         pin_C2
#define X_LCD_DATA_X    output_C
#define X_LCD_TRIS_X    set_tris_C
#endif

#ifdef  LCD_PORT_D
#define enable          pin_D3
#define rs_xxxx         pin_D2
#define X_LCD_DATA_X    output_D
#define X_LCD_TRIS_X    set_tris_D
#endif

#define SOL    0
#define SAG    1

/*#include komutuyla lcd bildirimi yapılmadan önce #define LCD_PORT_X şeklinde X yerine B, C, D portlarından hangisi yazılırsa LCD o porta bağlanır.*/
//ÖRNEK
// #define  LCD_PORT_C        //lcd PORTC'ye bağlandı. Pin sıralaması aşağıda.
// #include "benimlcd.c"            


//LCD'nin pic'e bağlanan pinleri
//LCD                PIC
//D7-------------->X7
//D6-------------->X6
//D5-------------->X5
//D4-------------->X4
//E---------------->X3
//RS-------------->X2


////////////////////////////////////////////////////////////////////////////////////////////////

/*Özel karakter tablosu (iki karakterlik boş yer var. Bu boş yerler iki karakter daha ekleneblir)*/
const char karakter[8][8] = {
       {0x0E, 0X11, 0X10, 0X10, 0X10, 0X11, 0X0E, 0X04},       /////Ç////
       {0X00, 0X00, 0X0E, 0X11, 0X10, 0X11, 0X0E, 0X04},      ////ç/////
       {0x0E, 0X11, 0X10, 0X0E, 0X01, 0X11, 0X0E, 0X04},     ////Ş////
       {0x00, 0X00, 0X0F, 0X10, 0X0E, 0X01, 0X1E, 0X04},    /////ş///
       {0X0A, 0X00, 0X11, 0X11, 0X11, 0X13, 0X0D, 0X00},   ////ü////
       {0X0A, 0X00, 0X0E, 0X11, 0X11, 0X11, 0X0E, 0X00},   ////ö/////
       {0X00, 0X00, 0X0C, 0X04, 0X04, 0X04, 0X0E, 0X00}   ////ı////
        };


//       FONKSIYONLAR
void lcd_komut_gonder(byte );// -->LCD'ye 8 bitlik komut gönderir.
void lcd_yaz(byte );/////////// -->LCD'ye 8 bitlik data gönderir.
void lcd_hazirla();///////////////// -->LCD'yi 2x16 olarak hazırlar.
void lcd_imlec_duz(); ////////////// -->İmleci düz_alt hale getirir.
void lcd_imlec_yak_sondur();//////// -->İmleci karakter boyu yanıp söner hale getirir.
void lcd_sil(); //////////////////// -->LCD'yi silip imleci 1. satır başına getirir.
void lcd_imlec_gotoxy(byte , byte );//--> İmleci istenilen koordinata getirir.
void lcd_imlec_gizle();//////////// -->İmleci kaldırır.
void lcd_satirbasi(byte);////////////  -->İmleci 1.satir, 1.sütuna tasir.
void lcd_karakter_sil(byte , byte, int8 x);// --> byte satır, byte sütun dan itibaren b karakter siler.
void lcd_ozel_karakter_yukle(void);         /* --> LCD RAM'ına Ç, ç, Ş, ş, ü, ö, ı karakterlerini yükler.lcd_hazirla(); fonksiyonundan önce kullanılmalıdır. */
void lcd_imlec_kaydir(int1 yon, int size);   /*--> İmleci yon parametresiyle verilen yöne, size parametresi adetinde kaydırır.                                             //SAG veya SOL şeklinde sembolik sabit olarak verilir. Bu sembolik sabitler bu kütüphanede tanımlıdır. */


void lcd_ozel_karakter_yukle(void) {
   int i = 0, j = 0x40, k = 0;
   lcd_hazirla();
   
   for(i = 0; i < 8; i++)
      for(k = 0; k < 8; k++) {
         lcd_komut_gonder(j++);
         lcd_yaz(karakter[i][k]);
      }
}


void lcd_komut_gonder(byte komut) {
   X_LCD_DATA_X(komut & 0xF0);
   delay_us(5);
   output_low(rs_xxxx);
   delay_us(5);
   output_high(enable);
   delay_us(2);
   output_low(enable);
   delay_ms(2);
   
   X_LCD_DATA_X(komut << 4);
   delay_us(5);
   output_low(rs_xxxx);
   delay_us(5);
   output_high(enable);
   delay_us(2);
   output_low(enable);
   delay_ms(2);
}
   
void lcd_yaz(byte komut) {
   switch(komut) {
      case 'Ç': komut = 0; break;
      case 'ç': komut = 1; break;
      case 'Ş': komut = 2; break;
      case 'ş': komut = 3; break;  
      case 'ü': komut = 4; break;
      case 'ö': komut = 5; break;
      case 'ı': komut = 6; break;
   }
   X_LCD_DATA_X(komut & 0xF0);
   delay_us(5);
   output_high(rs_xxxx);
   delay_us(5);
   output_high(enable);
   delay_us(2);
   output_low(enable);
   delay_ms(2);
   
   X_LCD_DATA_X(komut << 4);
   delay_us(5);
   output_high(rs_xxxx);
   delay_us(5);
   output_high(enable);
   delay_us(2);
   output_low(enable);
   delay_ms(2);
}

void lcd_imlec_gotoxy(byte satir, byte sutun) {
   if(satir == 1)
      lcd_komut_gonder(0x80 | (sutun-1));
   if(satir == 2)
      lcd_komut_gonder(0x80 | (0x40 + (sutun-1)));
}

void lcd_hazirla() {
   Set_tris_A(0b00000000);
  // output_low(RW);
   X_LCD_DATA_X(0x00);
   X_LCD_TRIS_X(0x03);
   lcd_komut_gonder(0x02);
   lcd_komut_gonder(0x28);
   lcd_komut_gonder(0x08);
   lcd_komut_gonder(0x0C);
   lcd_komut_gonder(0x06);
   lcd_komut_gonder(0x01);
   delay_ms(10);
}

void lcd_imlec_duz() {
   lcd_komut_gonder(0x0E);
}

void lcd_imlec_yak_sondur() {
   lcd_komut_gonder(0x0D);
}

void lcd_sil() {
   lcd_komut_gonder(0x01);
}

void lcd_imlec_gizle() {
   lcd_komut_gonder(0x0C);
}
   
void lcd_satirbasi(byte __a) {
   if(__a == 1)
      lcd_komut_gonder(0x02);
   if(__a == 2)
      lcd_komut_gonder(0xC0);
}

void lcd_karakter_sil(byte satir, byte sutun, int8 x) {
   if(satir == 1)
      lcd_komut_gonder(0x80 | (sutun-1));
   if(satir == 2)
      lcd_komut_gonder(0x80 | (0x40 + (sutun-1)));
   while(x--)
      lcd_yaz(" ");
}

void lcd_imlec_kaydir(int1 yon, int size)
{
   int8 komut = 0b00010000;
   int8 mask;
   
   if(yon == SAG)
      mask = 0X04;     
   else
      mask = 0x00;
   
   komut |= mask;
   while(size--)
      lcd_komut_gonder(komut);
}

#endif


Örnek kod;
#include <18f4680.h>
#use delay (clock = 10000000)

#fuses HS, PUT

#define LCD_PORT_D

#include "benimlcd.c"

void main(void)
{
   lcd_ozel_karakter_yukle();
   lcd_hazirla();   
   
   delay_ms(1000);   
   
   lcd_sil();
   lcd_imlec_gotoxy(1, 5);
   lcd_yaz('A');
   
   printf(lcd_yaz, "Deneme");
   
   lcd_imlec_duz();
   
   while(1);
}

zamzam23

RW ucu kullanılmıyor sanırım. onu nasıl entegre edebiliriz koda?

engineer42