LCD Kütüphanesi(C18 ve XC8 için)

lcd.h dosyası:

/*
* B4,B5,B6,B7 pinlerini kullanarak 4 bit iletisim kullanir.
* Cursor kapalidir.
* RW kullanilmadigi için direk topraga baglanabilir.
* 
* 2x16 LCD Kullanim Klavuzu
* lcd_init(); ile LCD'nin ilk ayarlarini yap
* lcd_clear(); ile LCD'yi sil
* lcd_yaz("deneme"); seklinde yazi yazdir.
* veri_yolla('F'); seklinde tek ascii kodu yazdir.
* lcd_gotoxy(1,13); seklinde LCD'nin istenilen yerine git.
*/

/*PİN TANIMLAMALARI*/
#define rs LATCbits.LATC0 
#define rw LATCbits.LATC1
#define e  LATCbits.LATC2
#define rs_tris TRISCbits.RC0
#define rw_tris TRISCbits.RC1
#define e_tris  TRISCbits.RC2

#define lcd_port LATB
#define lcd_tris TRISBbits
////////////////////////////////////////////

/* LCD'de kullanilan komutlarin tanimlamasi*/
#define Sil 1 // Ekrani temizler
#define BasaDon 2 // Imleci sol üst köseye getirir
#define SolaYaz 4 // Imlecin belirttigi adres azalarak gider
#define SagaYaz 6 // Imlecin belirttigi adres artarak gider
#define ImlecGizle 12 // Göstergeyi ac, kursor görünmesin
#define ImlecAltta 14 // Yanip sönen blok kursor
#define ImlecYanSon 15 // Yanip sönen blok kursor
#define ImlecGeri 16 // Kursoru bir karakter geri kaydir
#define KaydirSaga 24 // Göstergeyi bir karakter saga kaydir
#define KaydirSola 28 // Göstergeyi bir karakter sola kaydir
#define EkraniKapat 8 // Göstergeyi kapat (veriler silinmez)
#define BirinciSatir 128 // LCD'nin ilk satir baslangiç adresi
// (DDRAM adres)
#define IkinciSatir 192 // ikinci satirin baslangiç adresi
#define KarakUretAdres 64 // Karakter üreteci adresini belirle
// (CGRAM adres)
/* LCD'de Kullanilan Fonksiyon Seçimi */
#define CiftSatir8Bit 56 // 8 bit ara birim, 2 satir, 5*7 piksel
#define TekSatir8Bit 48 // 8 bit ara birim, 1 satir, 5*7 piksel
#define CiftSatir4Bit 40 // 4 bit ara birim, 2 satir, 5*7 piksel
#define TekSatir4Bit 32 // 4 bit ara birim, 1 satir, 5*7 piksel
extern void veri_yolla(unsigned char);
extern void lcd_clear(void);
extern void lcd_yaz(const char *s);
extern void lcd_gotoxy(unsigned char x, unsigned char y);
extern void lcd_init(void);
extern void lcd_komut(unsigned char c);

 

lcd.c dosyası:

#include <p18cxxx.h>
#include "lcd.h" // lcd.h dosyasi tanimlanip, degerler aliniyor
//#include "delays.h" // Gecikme fonksiyonu tanimlaniyor
void lcd_busy(void)
{
    //DelayUs(250);
    Delay10KTCYx(2);
}

void lcd_komut(unsigned char c) // Komut gönderme fonksiyonu
{
    rw=0; // LCD'ye yazma yapilacak
    rs=0; // LCD'ye komut gönderilecek
    e=1; // Düsen kenar tetikleme oldugu için E önce 1
    lcd_port = ( c & 0xF0 ); // Yüksek degerlikli bitler gönderiliyor
    e=0; // E, 0 yapiliyor
    lcd_busy(); //Belirli süre bekleniyor
    e=1; // E, 1 yapiliyor
    lcd_port = ( (c & 0x0F)<<4 ); // Düsük degerlikli bitler gönderiliyor
    e=0; // E, 0 yapiliyor
    lcd_busy(); // Belirli bir süre bekleniyor
}

void veri_yolla(unsigned char c)
{
    rw=0;
    rs=1; // Komut yolladan tek farki, RS'nin 1 olmasi
    e=1;
    lcd_port = ( c & 0xF0 );
    e=0;
    lcd_busy();
    e=1;
    lcd_port = ( (c & 0x0F)<<4 );
    e=0;
    lcd_busy();
}

void lcd_clear(void) // LCD siliniyor
{
    lcd_komut(0x1);
    //DelayMs(2);
    Delay10KTCYx(2);
}

void lcd_yaz(const char * s) // LCD'ye string ifade gönderiliyor
{
    lcd_busy();
    while(*s)
    veri_yolla(*s++);
}

void lcd_gotoxy(unsigned char x,unsigned char y) //LCD'nin belli //bölgesine gidiliyor
{
    if(x==1)
    lcd_komut(0x80+((y-1)%16));
    else
    lcd_komut(0xC0+((y-1)%16));
}

void lcd_init() // LCD ilk yükleme ayarlari yapiliyor
{
    lcd_tris.RB4=0;
    lcd_tris.RB5=0;
    lcd_tris.RB6=0;
    lcd_tris.RB7=0;

    rs_tris=0;
    rw_tris=0;
    e_tris=0;

    rs = 0;
    e = 0;
    rw = 0;
    Delay10KTCYx(15);
    e=1;
    lcd_komut(0x02);
    Delay10KTCYx(2);
    lcd_komut(CiftSatir4Bit);
    lcd_komut(SagaYaz);
    lcd_komut(ImlecGizle);
    lcd_clear();
    lcd_komut(BirinciSatir);
}

 

main.c dosyası:

/* 
 * File:   main.c
 * Author: Gökhan BEKEN
 *
 * Created on 19 Eylül 2013 Persembe, 21:10
 */

#include "p18cxxx.h"
//#include <delays.h> // Gecikme fonksiyonu tanimlaniyor
#include <stdio.h> //sprintf için gerekli
#include "lcd.h" // LCD kütüphanesi çağrılıyor

#pragma config OSC = HS, WDT = OFF, LVP = OFF

void main(void)
{    
    char s1[16]="M. Gokhan BEKEN";
    char s2[16]="GokhanBeken.com";

    unsigned long int sene=2013;
    char katar[16]="07 ARALIK";

    ADCON1 = 0x0F; //bütün pinler dijital olsun

    lcd_init(); // LCD ilk ayarlar yapılıyor

    lcd_gotoxy(1,1); //birinci satırın birinci sutununa geç
    lcd_yaz(s1);
    lcd_gotoxy(2,1); // ikinci satırın birinci sutununa geç
    lcd_yaz(s2);

    Delay10KTCYx(100);
    sprintf(s1,"Sene : %lu",sene); //long türünde bir sayıyı %lu ile yazdırabilirsiniz
    sprintf(s2,"%s",katar); //bir katarı %s ile yazdırabilirsiniz

    lcd_clear(); //LCD yi temizle
    lcd_gotoxy(1,1); //birinci satırın birinci sutununa geç
    lcd_yaz(s1);
    lcd_gotoxy(2,1); // ikinci satırın birinci sutununa geç
    lcd_yaz(s2);

    for(;;);

}

Dosyaların, xc8 ve c18 ile yazılmış iki farklı versiyonunu ve ISIS simülasyon dosyasını indirmek için tıklayınız: http://gokhanbeken.com/dosyalar/LCD_c18_xc8_gokhanbeken_com.rar
Alternatif link: http://www.4shared.com/rar/i1w_dnzs/LCD_c18_xc8_gokhanbekencom.html

Not: Bu kütüphane Fırat Deveci’nin Hi-Tech kitabından uyarlanmıştır, kendisine teşekkür ediyorum.

M.Gökhan BEKEN

16 thoughts on “LCD Kütüphanesi(C18 ve XC8 için)

  1. Paylaşım için teşekkürler. Hatasız derleme yapıyorum Proteus ISIS similasyon da lcd pinlere elektririk geliyor ama görüntü çıkmıyor ne yapmam gerekiyor ?

    • Daha önce denemiş ve isis’te sorunsuz çalıştırmıştım. Projeyi indirdikten sonra tekrar derleme yapmadan, içindeki hex dosyasını isis’e gösterip, tekrar dener misiniz? Eğer hala göstermiyorsa isis ile alakalı bir durumdur.

  2. Hex ‘i olduğu gibi denedim ISIS’i lcd.h ye göre ayarladım aynı problem görüntüye dair hiç bir belirti yok. Yalnız PIC C Compiler de lcd çalışıyor daha basit kodlama yapısı var ama MPLAB IDE de çalıştırmak istiyorum. Ne yapabiliriz ?

  3. sprintf() fonksiyonunu kullanamıyorum. sprintf () ile ekranda herhangi birşey yazdıramıyorum. ekran boş görünüyor.

  4. spirintf fonksiyonu ekrana birşey yazmak için değil, bir değişkene formatlı veri yazmak için kullanılır.
    mesela:
    char yazi[30];
    sprintf(&yazi,”sayi : %d”,15); //yazi adlı değişkene veri yaz
    lcd_yaz(yazi); //yazi adlı değişkenin içeriğini LCD’ye gönder

    gördüğünüz gibi ekrana birşey yazmak için “lcd_yaz” fonksiyonunu kullandık

  5. Gokhan hocam basic den c ye geciyorum. Haliyle bazi konulari kavrayamiyorum. lcd_yaz fonksiyonunda veri_yolla(*s++) satirinda gelen argumani 1 artiriyor , bu durumda yazamaya ikinci karakterden baslamazmi, ikinci olarak karakterler dizini sona erdiginde while() dongusununu icinin false olacaginin garantisi varmi. Buradaki mantigi acabilirmisiniz. Tesekkurler.

Bir Cevap Yazın