Merhaba arkadaşlar.2*16 lcdnin tüm pinlerini portb den kontrol etmek istiyorum.Elimde **** pic deneme kartı var ve lcdnin tüm pinleri portb de rb0-rb5 aralığında.RB0-RB3 de lcdnin D4-D7 pinleri , rs RB4 ve en RB5 e bağlı.Forumda direk pin pin ayarlanabilen kütüphane buldum.Fakat ben fxdevin kütüphanesini kullanmak istiyorum.Sorunum; D4-D7 pinlerini RB0-RB3 e aktarıyorum fakat rs ve en uçlarını RB4 ve RB5 e aktardıgım zaman lcdyi çalıştıramıyorum.Buda lcdye bilgi gönderirken değişkenin yüksek bitlerinin sürekli 0 olarak gelmesi ve RB4 RB5i sıfırlamasından dolayı oldugunu düşünüyorum.Bu durumda nasıl bir yol izlemem gerekir acaba.teşekkürler.
lcd.c
#include <pic.h>
#include "lcd.h" // lcd.h dosyası tanımlanıp, değerler alınıyor
#include "delay.h" // Gecikme fonksiyonu tanımlanıyor
void lcd_busy(void)
{
DelayUs(250);
}
void lcd_komut(unsigned char c) // Komut gönderme fonksiyonu
{
rw=0; // LCD'ye yazma yapılacak
rs=0; // LCD'ye komut gönderilecek
e=1; // DüGen kenar tetikleme olduğu için E önce 1
lcd_port = ( c & 0xF0 )>>4; // Yüksek değerlikli bitler gönderiliyor
e=0; // E, 0 yapılıyor
lcd_busy(); //Belirli süre bekleniyor
e=1; // E, 1 yapılıyor
lcd_port = ( (c & 0x0F) ); // DüGük değerlikli bitler gönderiliyor
e=0; // E, 0 yapılıyor
lcd_busy(); // Belirli bir süre bekleniyor
}
void veri_yolla(unsigned char c)
{
rw=0;
rs=1; // Komut yolladan tek farkı, RS'nin 1 olması
e=1;
lcd_port = ( c & 0xF0 )>>4;
e=0;
lcd_busy();
e=1;
lcd_port = ( (c & 0x0F) );
e=0;
lcd_busy();
}
void lcd_clear(void) // LCD siliniyor
{
lcd_komut(0x1);
DelayMs(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 ayarları yapılıyor
{
rs = 0;
e = 0;
rw = 0;
DelayMs(15);
e=1;
lcd_komut(0x02);
DelayMs(2);
lcd_komut(CiftSatir4Bit);
lcd_komut(SagaYaz);
lcd_komut(ImlecGizle);
lcd_clear();
lcd_komut(BirinciSatir);
}
lcd.h
#define rs RB4 //Pin tanımlamaları
#define rw RB6
#define e RB5
#define lcd_port PORTB
/* 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 kaydır
#define KaydirSaga 24 // Göstergeyi bir karakter sağa kaydır
#define KaydirSola 28 // Göstergeyi bir karakter sola kaydır
#define EkraniKapat 8 // Göstergeyi kapat (veriler silinmez)
#define BirinciSatir 128 // LCD'nin ilk satir baGlangıç adresi
// (DDRAM adres)
#define IkinciSatir 192 // Gkinci satirin baGlangıç 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);
Bu kütüphane de lcd pinlerini direk ayarlayabildigim .h ve .c dosyası;
/*
* LCD interface example
* Uses routines from delay.c
* This code will interface to a standard LCD controller
* like the Hitachi HD44780. It uses it in 4 bit mode, with
* the hardware connected as follows (the standard 14 pin
* LCD connector is used):
*
* PORTD bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
* PORTA bit 3 is connected to the LCD RS input (register select)
* PORTA bit 1 is connected to the LCD EN bit (enable)
*
* To use these routines, set up the port I/O (TRISA, TRISD) then
* call lcd_init(), then other routines as required.
*
*/
#include <pic.h>
#include "lcd.h"
#include "delay.h"
#define LCD_EN RB5
#define LCD_RW a
#define LCD_RS RB4
#define LCD_DB4 RB0
#define LCD_DB5 RB1
#define LCD_DB6 RB2
#define LCD_DB7 RB3
/////////////////////////////
#define TRIS_EN TRISB3
#define TRIS_RW TRISB4
#define TRIS_RS TRISB5
#define TRIS_DB4 TRISB0
#define TRIS_DB5 TRISB1
#define TRIS_DB6 TRISB2
#define TRIS_DB7 TRISB3
#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
bit bit_test (unsigned char var, unsigned char bit_no) {
if ( !!(var & (1 << bit_no)) )
return 1;
else
return 0;
}
/*
void LCD_STROBE(void){
LCD_EN = 1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
LCD_EN = 0;
};
*/
/* Write unsig int to LCD */
void lcd_write_int( unsigned int val){
unsigned int temp= 0;
unsigned int t= 10000;
char flag=1;
char flag_minus=0;
unsigned char sifirlar = 0;
if (val == 0){
lcd_puts("0 ");
return;
}
/* if (val < 0){
flag_minus= 1 ;
val*= -1;
}
*/
do{
temp= val/t;
if (flag)
if ( temp == 0 ){
sifirlar++;
continue;
}
else {
flag= 0;
if(flag_minus)
lcd_putch('-');
}
lcd_putch('0'+temp);
val= val - temp*t;
}while(t/=10);
while (sifirlar--)
lcd_puts(" ");
}
void lcd_write_char( unsigned char val){
unsigned int temp= 0;
unsigned int t= 100;
char flag=1;
char flag_minus=0;
unsigned char sifirlar = 0;
if (val == 0){
lcd_puts("0 ");
return;
}
/* if (val < 0){
flag_minus= 1 ;
val*= -1;
}
*/
do{
temp= val/t;
if (flag)
if (temp==0){
sifirlar++;
continue;
}
else {
flag= 0;
if(flag_minus)
lcd_putch('-');
}
lcd_putch('0'+temp);
val= val - temp*t;
}while(t/=10);
while (sifirlar--)
lcd_puts(" ");
}
/* write a byte to the LCD in 4 bit mode */
void
lcd_write(unsigned char c)
{
DelayUs(40);
//LCD_DATA = ( ( c >> 4 ) & 0x0F );
if ( c & 0b00010000 )
LCD_DB4 = 1;
else
LCD_DB4 = 0;
if ( c & 0b00100000 )
LCD_DB5 = 1;
else
LCD_DB5 = 0;
if ( c & 0b01000000 )
LCD_DB6 = 1;
else
LCD_DB6 = 0;
if ( c & 0b10000000 )
LCD_DB7 = 1;
else
LCD_DB7 = 0;
LCD_STROBE();
//LCD_DATA = ( c & 0x0F );
if ( c & 0b00000001 )
LCD_DB4 = 1;
else
LCD_DB4 = 0;
if ( c & 0b00000010 )
LCD_DB5 = 1;
else
LCD_DB5 = 0;
if ( c & 0b00000100 )
LCD_DB6 = 1;
else
LCD_DB6 = 0;
if ( c & 0b00001000 )
LCD_DB7 = 1;
else
LCD_DB7 = 0;
LCD_STROBE();
}
/*
* Clear and home the LCD
*/
void
lcd_clear(void)
{
LCD_RS = 0;
lcd_write(0x1);
DelayMs(20);
}
/* write a string of chars to the LCD */
void
lcd_puts(const char * s)
{
LCD_RS = 1; // write characters
while(*s)
lcd_write(*s++);
}
/* write one character to the LCD */
void
lcd_putch(char c)
{
LCD_RS = 1; // write characters
lcd_write( c );
}
/*
* Go to the specified position
*/
void
lcd_goto(unsigned char pos)
{
LCD_RS = 0;
lcd_write(0x80+pos);
}
/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
char init_value;
init_value = 0x3; // RB4=1, RB5=1, RB6=0, RB7=0;
char a;
LCD_RW = 0;
LCD_RS = 0;
LCD_EN = 0;
// TRISA = 0b00110000;
TRIS_DB4 = 0; // OUTPUT
TRIS_DB5 = 0; // OUTPUT
TRIS_DB6 = 0; // OUTPUT
TRIS_DB7 = 0; // OUTPUT
TRIS_RS = 0; // OUTPUT
TRIS_EN = 0; // OUTPUT
TRIS_RW = 0; // OUTPUT
LCD_RS = 0;
LCD_EN = 0;
LCD_RW = 0;
DelayMs(35); // wait 15mSec after power applied,
//LCD_DATA = init_value; // 0X3
LCD_DB4 = 1;
LCD_DB5 = 1;
LCD_DB6 = 0;
LCD_DB7 = 0;
LCD_STROBE();
DelayMs(25); // 5
LCD_STROBE();
DelayUs(200); // 200
DelayUs(200);
LCD_STROBE();
DelayUs(200); // 200
DelayUs(200);
//LCD_DATA = 2; // Four bit mode
LCD_DB4 = 0;
LCD_DB5 = 1;
LCD_DB6 = 0;
LCD_DB7 = 0;
LCD_STROBE();
lcd_write(0b00011100); // Set interface length
// lcd_write(0xF); // Display On, Cursor On, Cursor Blink
lcd_write(0b00101000); // function set 4 bits, 2 lines, font set # 1
lcd_write(0b00001100); // display on, cursor off, blink off
lcd_write(0b00000110); // increment - no display shift
lcd_write(0x6); // Set entry Mode
lcd_clear(); // Clear screen
}
/*
* LCD interface header file
* See lcd.c for more info
*/
bit bit_test (unsigned char var, unsigned char bit_no);
/* write a byte to the LCD in 4 bit mode */
extern void lcd_write(unsigned char);
/* Clear and home the LCD */
extern void lcd_clear(void);
/* write a string of characters to the LCD */
extern void lcd_puts(const char * s);
/* Go to the specified position */
extern void lcd_goto(unsigned char pos);
/* intialize the LCD - call before anything else */
extern void lcd_init(void);
extern void lcd_putch(char);
/* Set the cursor position */
#define lcd_cursor(x) lcd_write(((x)&0x7F)|0x80)
/* Display int value to LCD display */
void lcd_write_int( unsigned int val);
void lcd_write_char( unsigned char val);
//----------------------------------
#define S1_1 0x00
#define S1_2 0x01
#define S1_3 0x02
#define S1_4 0x03
#define S1_5 0x04
#define S1_6 0x05
#define S1_7 0x06
#define S1_8 0x07
#define S1_9 0x08
#define S1_10 0x09
#define S1_11 0x0A
#define S1_12 0x0B
#define S1_13 0x0C
#define S1_14 0x0D
#define S1_15 0x0E
#define S1_16 0x0F
#define S1_17 0x10
#define S1_18 0x11
#define S1_19 0x12
#define S1_20 0x13
//----------------------------------
#define S2_1 0x40
#define S2_2 0x41
#define S2_3 0x42
#define S2_4 0x43
#define S2_5 0x44
#define S2_6 0x45
#define S2_7 0x46
#define S2_8 0x47
#define S2_9 0x48
#define S2_10 0x49
#define S2_11 0x4A
#define S2_12 0x4B
#define S2_13 0x4C
#define S2_14 0x4D
#define S2_15 0x4E
#define S2_16 0x4F
#define S2_17 0x50
#define S2_18 0x51
#define S2_19 0x52
#define S2_20 0x53
//----------------------------------
#define S3_1 0x14
#define S3_2 0x15
#define S3_3 0x16
#define S3_4 0x17
#define S3_5 0x18
#define S3_6 0x19
#define S3_7 0x1A
#define S3_8 0x1B
#define S3_9 0x1C
#define S3_10 0x1D
#define S3_11 0x1E
#define S3_12 0x1F
#define S3_13 0x20
#define S3_14 0x21
#define S3_15 0x22
#define S3_16 0x23
#define S3_17 0x24
#define S3_18 0x25
#define S3_19 0x26
#define S3_20 0x27
//----------------------------------
#define S4_1 0x54
#define S4_2 0x55
#define S4_3 0x56
#define S4_4 0x57
#define S4_5 0x58
#define S4_6 0x59
#define S4_7 0x5A
#define S4_8 0x5B
#define S4_9 0x5C
#define S4_10 0x5D
#define S4_11 0x5E
#define S4_12 0x5F
#define S4_13 0x60
#define S4_14 0x61
#define S4_15 0x62
#define S4_16 0x63
#define S4_17 0x64
#define S4_18 0x65
#define S4_19 0x66
#define S4_20 0x67
teşekkürler kütüphaneye hemen bakıyorum.Peki yukarıdaki sorunumu nasıl halledebilirim.Yani ;
lcd_port = ( c & 0xF0 )>>4
lcd_port = ( (c & 0x0F) ) bu işlemler sonucu portbnin sadece ilk 4 bitinin etkilenmesi için ne yapabilirim?.
Alıntı yapılan: kantirici - 09 Ağustos 2011, 00:58:22
teşekkürler kütüphaneye hemen bakıyorum.Peki yukarıdaki sorunumu nasıl halledebilirim.Yani ;
lcd_port = ( c & 0xF0 )>>4
lcd_port = ( (c & 0x0F) ) bu işlemler sonucu portbnin sadece ilk 4 bitinin etkilenmesi için ne yapabilirim?.
bir fikri olan yokmu arkadaşlar?
lcd_port = ( c & 0xF0 )>>4 işlemi sonucunda elinde sıfırdan başka bir şey kalmaz.
Zira ( c & 0xF0 ) işlemi C değişkenindeki ilk 4 biti almak için yapılır. SOnradan verdiğin >>4 ifadesi bu bitleri 4 bit sağa kaydırır. Geriden sıfırlar geldiği için elinde sıfır kalır. SOnuç sabit sıfırdır.
Bir port'a bir işlemin sonunda elde ettiğin ilk 4 biti eklemenin yolu, önce portu okuyup bir yerde saklamalı sonra elindeki 4 biti ona eklemelisin.
Tabiiki portu okurken ilk 4 biti dikkate almadan okuma yapman daha uygun olur. İşte komutlar;
Önce Portu okuyalım;
TEMP=PORTC & %11110000 burada porta ait son 4 bitin mevcut değerini almış olduk. Daha sonra senin işlemi yapalım;
LCD_PORT=C & $0F bu işlem bize C değişkeninin ilk 4 bitini verdi.
Şimdi bunları birleştirmek gerekiyor,
LCD_PORT=TEMP+LCD_PORT veya TEMP ile LCD_PORT değişkenlerini OR işlemine tâbi tutabilirsin.
Ete
Çok teşekkür ederim ete.verdigin bilgilerden sonra hallettim.Belki başkasına lazım olur diye lcd kütüphanesinide ekliyorum.D4-D7 portb de RB0-RB3 e lcdnin RS ucu RB4e ve EN ucuda RB5 e baglı.RB6 ve RB7 ise istenildigi gibi kullanılabiliyor.Kütüphane için ise fxdev e tekrar teşekkürler.
lcd.c
#include <pic.h>
#include "lcd.h" // lcd.h dosyası tanımlanıp, değerler alınıyor
#include "delay.h" // Gecikme fonksiyonu tanımlanıyor
void lcd_busy(void)
{
DelayUs(250);
}
void lcd_komut(unsigned char c) // Komut gönderme fonksiyonu
{
int temp,bilgi;
rw=0; // LCD'ye yazma yapılacak
rs=0; // LCD'ye komut gönderilecek
e=1; // DüGen kenar tetikleme olduğu için E önce 1
temp=PORTB&0xF0;
bilgi=( c & 0xF0 )>>4;
lcd_port=temp+bilgi;
e=0; // E, 0 yapılıyor
lcd_busy(); //Belirli süre bekleniyor
e=1; // E, 1 yapılıyor
temp=PORTB&0xF0;
bilgi=( (c & 0x0F) );
lcd_port=temp+bilgi;
e=0; // E, 0 yapılıyor
lcd_busy(); // Belirli bir süre bekleniyor
}
void veri_yolla(unsigned char c)
{ int temp,bilgi;
rw=0;
rs=1; // Komut yolladan tek farkı, RS'nin 1 olması
e=1;
temp=PORTB&0xF0;
bilgi=( c & 0xF0 )>>4;
lcd_port=temp+bilgi;
e=0;
lcd_busy();
e=1;
temp=PORTB&0xF0;
bilgi=( (c & 0x0F) );
lcd_port=temp+bilgi;
e=0;
lcd_busy();
}
void lcd_clear(void) // LCD siliniyor
{
lcd_komut(0x1);
DelayMs(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 ayarları yapılıyor
{
rs = 0;
e = 0;
rw = 0;
DelayMs(15);
e=1;
lcd_komut(0x02);
DelayMs(2);
lcd_komut(CiftSatir4Bit);
lcd_komut(SagaYaz);
lcd_komut(ImlecGizle);
lcd_clear();
lcd_komut(BirinciSatir);
}
lcd.h
/* www.FxDev.org
* D4,D5,D6,D7 pinlerini kullanarak 4 bit iletiGim kullanır.
* Cursor kapalıdır.
* RW kullanılmadığı için direk toprağa bağlanabilir.
* 2x16 LCD Kullanım Klavuzu
* lcd_init(); ile LCD'nin ilk ayarlarını yap
* lcd_clear(); ile LCD'yi sil
* lcd_yaz("deneme"); Geklinde yazı yazdır.
* veri_yolla('F'); Geklinde tek ascii kodu yazdır.
* lcd_gotoxy(1,13); Geklinde LCD'nin istenilen yerine git.
* www.FxDev.org
*/
#define rs RB4 //Pin tanımlamaları
#define rw RB6
#define e RB5
#define lcd_port PORTB
/* 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 kaydır
#define KaydirSaga 24 // Göstergeyi bir karakter sağa kaydır
#define KaydirSola 28 // Göstergeyi bir karakter sola kaydır
#define EkraniKapat 8 // Göstergeyi kapat (veriler silinmez)
#define BirinciSatir 128 // LCD'nin ilk satir baGlangıç adresi
// (DDRAM adres)
#define IkinciSatir 192 // Gkinci satirin baGlangıç 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);
Selam , bende de bu problem var baştan 'ETE' arkadaşa açıklamalı örnek için teşekkür ederim. Benim gibi yeni öğrenmeye başlamış arkadaşlar için çok yardımcı oluyor. Benim istediğim aşağıdaki gibi lcd'yi sürmek , nelere dikkat etmem gerekiyor. Şimdiden yardımcı olan arkadaşlara teşekkür ederim.
LCD-E -RB0
LCD-RW -RB2
LCD-RS -RB1
LCD-D7 -RB7
LCD-D6 -RB6
LCD-D5 -RB5
LCD-D4 -RB4
void lcd_komut ve void veri_yolla fonksiyonlarında ete hocanın anlattıgından yola çıkarak port durumu için gerekli (portta pinlerin durumuna göre veriyi porta gönderen kısım) değiştirmelisin.benim yaptıgımın tam tersini yapacaksın.Port durumunu okurken temp=PORTB0x0F ve verinin düşük 4 bitini gönderirkende 4 bit sola kaydıracaksın.
RS-RW-EN için direk lcd.h içerisindeki #define ile tanımlanmış pinleri değiştir.
Yüksek bitler için;
temp=PORTB&0xF0;
bilgi=( (c & 0xF0) );
lcd_port=temp+bilgi;
Düşük bitler için;
temp=PORTB&0x0F;
bilgi=( c & 0x0F )<<4;
lcd_port=temp+bilgi;
ilgili yerleri değiştirmen yeterli.İlk önce yüksek bitler sonra düşük bitler yollanıyor.
yada ilk mesajda 2.verdigim lcd kütüphanesinde lcd.h içerisinde #define ile tanımlanmış pinler tek tek değiştirerekte o kütüphaneyi hiç bir değişiklik yapmadan kullnabilirsin.
Dostum yardım için teşekkür ederim lakin çalıştıramadım ,kodlar aşağıda nerede yanlış yaptım ?
LCD-E -RB0
LCD-RW -RB2
LCD-RS -RB1
LCD-D7 -RB7
LCD-D6 -RB6
LCD-D5 -RB5
LCD-D4 -RB4
/*
Yüksek bitler için;
temp=PORTB&0xF0;
bilgi=( (c & 0xF0) );
lcd_port=temp+bilgi;
Düşük bitler için;
temp=PORTB&0x0F;
bilgi=( c & 0x0F )<<4;
lcd_port=temp+bilgi;
*/
#include <pic.h>
#include "lcd1.h" // lcd.h dosyası tanımlanıp, değerler alınıyor
#include "delay.h" // Gecikme fonksiyonu tanımlanıyor
void lcd_busy(void)
{
DelayUs(250);
}
void lcd_komut(unsigned char c) // Komut gönderme fonksiyonu
{
int temp,bilgi;
rw=0; // LCD'ye yazma yapılacak
rs=0; // LCD'ye komut gönderilecek
e=1; // DüGen kenar tetikleme olduğu için E önce 1
temp=PORTB&0x0F;
bilgi=( c & 0x0F )<<4;
lcd_port=temp+bilgi;
e=0; // E, 0 yapılıyor
lcd_busy(); //Belirli süre bekleniyor
e=1; // E, 1 yapılıyor
temp=PORTB&0x0F;
bilgi=( c & 0x0F )<<4;
lcd_port=temp+bilgi;
e=0; // E, 0 yapılıyor
lcd_busy(); // Belirli bir süre bekleniyor
}
void veri_yolla(unsigned char c)
{ int temp,bilgi;
rw=0;
rs=1; // Komut yolladan tek farkı, RS'nin 1 olması
e=1;
temp=PORTB&0x0F;
bilgi=( c & 0x0F )<<4;
lcd_port=temp+bilgi;
e=0;
lcd_busy();
e=1;
temp=PORTB&0x0F;
bilgi=( c & 0x0F )<<4;
lcd_port=temp+bilgi;
e=0;
lcd_busy();
}
void lcd_clear(void) // LCD siliniyor
{
lcd_komut(0x1);
DelayMs(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 ayarları yapılıyor
{
rs = 0;
e = 0;
rw = 0;
DelayMs(15);
e=1;
lcd_komut(0x02);
DelayMs(2);
lcd_komut(CiftSatir4Bit);
lcd_komut(SagaYaz);
lcd_komut(ImlecGizle);
lcd_clear();
lcd_komut(BirinciSatir);
}
/* www.FxDev.org
* D4,D5,D6,D7 pinlerini kullanarak 4 bit iletiGim kullanır.
* Cursor kapalıdır.
* RW kullanılmadığı için direk toprağa bağlanabilir.
* 2x16 LCD Kullanım Klavuzu
* lcd_init(); ile LCD'nin ilk ayarlarını yap
* lcd_clear(); ile LCD'yi sil
* lcd_yaz("deneme"); Geklinde yazı yazdır.
* veri_yolla('F'); Geklinde tek ascii kodu yazdır.
* lcd_gotoxy(1,13); Geklinde LCD'nin istenilen yerine git.
* www.FxDev.org
*/
#define rs RB1 //Pin tanımlamaları
#define rw RB2
#define e RB0
#define lcd_port PORTB
/* 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 kaydır
#define KaydirSaga 24 // Göstergeyi bir karakter sağa kaydır
#define KaydirSola 28 // Göstergeyi bir karakter sola kaydır
#define EkraniKapat 8 // Göstergeyi kapat (veriler silinmez)
#define BirinciSatir 128 // LCD'nin ilk satir baGlangıç adresi
// (DDRAM adres)
#define IkinciSatir 192 // Gkinci satirin baGlangıç 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 de gerekli değişikligi yapmamşısın.Yapılmış hali aşagıda.İstersen ilk mesajda verdigim 2. kütüphane dosyalarınıda kullanabilirsin.
#include <pic.h>
#include "lcd.h" // lcd.h dosyası tanımlanıp, değerler alınıyor
#include "delay.h" // Gecikme fonksiyonu tanımlanıyor
void lcd_busy(void)
{
DelayUs(250);
}
void lcd_komut(unsigned char c) // Komut gönderme fonksiyonu
{
int temp,bilgi;
rw=0; // LCD'ye yazma yapılacak
rs=0; // LCD'ye komut gönderilecek
e=1; // DüGen kenar tetikleme olduğu için E önce 1
temp=PORTB&0xF0;
bilgi=( (c & 0xF0) );
lcd_port=temp+bilgi;
e=0; // E, 0 yapılıyor
lcd_busy(); //Belirli süre bekleniyor
e=1; // E, 1 yapılıyor
temp=PORTB&0x0F;
bilgi=( c & 0x0F )<<4;
lcd_port=temp+bilgi;
e=0; // E, 0 yapılıyor
lcd_busy(); // Belirli bir süre bekleniyor
}
void veri_yolla(unsigned char c)
{ int temp,bilgi;
rw=0;
rs=1; // Komut yolladan tek farkı, RS'nin 1 olması
e=1;
temp=PORTB&0xF0;
bilgi=( (c & 0xF0) );
lcd_port=temp+bilgi;
e=0;
lcd_busy();
e=1;
temp=PORTB&0x0F;
bilgi=( c & 0x0F )<<4;
lcd_port=temp+bilgi;
e=0;
lcd_busy();
}
void lcd_clear(void) // LCD siliniyor
{
lcd_komut(0x1);
DelayMs(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 ayarları yapılıyor
{
rs = 0;
e = 0;
rw = 0;
DelayMs(15);
e=1;
lcd_komut(0x02);
DelayMs(2);
lcd_komut(CiftSatir4Bit);
lcd_komut(SagaYaz);
lcd_komut(ImlecGizle);
lcd_clear();
lcd_komut(BirinciSatir);
}
lcd.h
/* www.FxDev.org
* D4,D5,D6,D7 pinlerini kullanarak 4 bit iletiGim kullanır.
* Cursor kapalıdır.
* RW kullanılmadığı için direk toprağa bağlanabilir.
* 2x16 LCD Kullanım Klavuzu
* lcd_init(); ile LCD'nin ilk ayarlarını yap
* lcd_clear(); ile LCD'yi sil
* lcd_yaz("deneme"); Geklinde yazı yazdır.
* veri_yolla('F'); Geklinde tek ascii kodu yazdır.
* lcd_gotoxy(1,13); Geklinde LCD'nin istenilen yerine git.
* www.FxDev.org
*/
#define rs RB1 //Pin tanımlamaları
#define rw RB2
#define e RB0
#define lcd_port PORTB
/* 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 kaydır
#define KaydirSaga 24 // Göstergeyi bir karakter sağa kaydır
#define KaydirSola 28 // Göstergeyi bir karakter sola kaydır
#define EkraniKapat 8 // Göstergeyi kapat (veriler silinmez)
#define BirinciSatir 128 // LCD'nin ilk satir baGlangıç adresi
// (DDRAM adres)
#define IkinciSatir 192 // Gkinci satirin baGlangıç 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);
Selam , ilginç aynısını denerken yazmıştım fakat halen çalışmıyor ,artık kafa durdu sabaha denerim yardım için sağolasın.
ÇÖZÜLDÜ TEŞEKKÜRLER !!!!
Herkese teşekkürler faydalı bir paylaşım....
merhaba bende denedim ama karakterler hayatımda görmediğim karakterler çıkıyor çan zil gibi işaretler var neden olabilir ki