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);
}
RW ucu kullanılmıyor sanırım. onu nasıl entegre edebiliriz koda?
bu kodları kullanan var mı?