2*16 Lcd Tek Port üzerinden Kontrol Sorunu

Başlatan kantirici, 08 Ağustos 2011, 14:15:15

kantirici

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

kantirici

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?.


kantirici

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?

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

kantirici

Ç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);

armsistem

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

kantirici

#6
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.

armsistem

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);

kantirici

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);



armsistem

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.


3adam

Herkese teşekkürler faydalı bir paylaşım....

mechartronic04

merhaba bende denedim  ama karakterler hayatımda görmediğim karakterler çıkıyor çan zil gibi işaretler var neden olabilir ki