LCD Pinlerini nasıl ayarlayabilirim ?

Başlatan orhanc, 02 Mayıs 2010, 20:34:15

orhanc

Hi-Tech de  2*20 LCD için pinleri aşağıdaki gibi tanımlamam gerekiyor. Bunu nasıl yapabilirim? Devre buna uygun basılmış değişiklik yapma şansımız yok. PIC18f452 veya 18f4620 kullanacağım.

RS  > RD0
RW > RD1
E    > RD2

D4-D7 >  RD4-RD7


Herkese şimdiden Teşekkürler...
i'm doing nothing... Giddy Up  http://www.drorhan.com

gogge

lcd.c kütüphanesinde lcd port yönlendirmeleri şu şekilde.

#define   LCD_RS RA3
#define   LCD_RW RA2
#define    LCD_EN RA1

#define   LCD_DATA  PORTD      **(PORTD'nin düşük 4 biti)

İstediğiniz değişiklikleri buradan yapabilirsiniz. Kolay gelsin.


orhanc

18 serisi için çalışan lcd kütüpahensi varmı elinizde ?
i'm doing nothing... Giddy Up  http://www.drorhan.com

gogge


orhanc

Proteusda çalışan kodlar neden devrede çalışmıyor bir türlü anlam veremiyorum. Şema ile devre aynı ama olmuyor.
i'm doing nothing... Giddy Up  http://www.drorhan.com

gogge

LCD beslemesinden kaynaklanıyor olabilir.

1- VSS (-)
2- VDD (+)
3- Vo (POT orta uç)

Ben bir ara 2 ve 3 nolu uçları ters bağlamıştım. Sonradan farkettim. Belki sizde de aynı sorun olabilir.

acemi2010

Hocam frekansınız kaç Mhz?
Eğer yüksek frekans kullanıyorsanız; LCD_STROBE fonksiyonunda LCD_EN = 1 olduktan sonra bekleme koymalısınız.
Bahsi geçen kütüphanede sadece 2 adet asm("nop"); konulmuş.

Timuçin

acemi2010

Alıntı yapılan: orhanc - 02 Mayıs 2010, 23:27:57
Proteusda çalışan kodlar neden devrede çalışmıyor bir türlü anlam veremiyorum. Şema ile devre aynı ama olmuyor.

Hocam kullandığınız LCD kütüphanesini buraya koyarsanız yardımcı olmaya çalışırım.
Alıntı YapRS  > RD0
RW > RD1
E > RD2
D4-D7 >  RD4-RD7
Bu konfigürasyonu Gogge'nin verdiği kütüphane ile çalıştıramazsınız.

lcd_data() fonksiyonunda,        LCD_DATA |= ( ( c >> 4 ) & 0x0F ); gibi bir komut var ki (Burada LCD_DATA, pic'in portu oluyor); high nibble'a 0 atıyor!....
Neyse uzatmayim lafı ==> bu kütüphane, control pinleri ile data pinlerinin aynı pic portunda configure edilmesi için uygun değil!....

saygılarımla

orhanc

picin sadece  lcd portlarını  aktif etmiş olmamıza rağmen  ekranda görüntü varken pice elimi yaklaştırdığımda yada  pinlere pullap  dirençleri bagladıgım an ekranda sadece  siyah bölümler oluyor ve ekran çalışmıyor picin clear ucundada pullap direnci mevcut. bunun sebebi nedir ve nasıl çözülür. çalıştıramadığımız kodların sebebi buymuş daha sonraki denemelerde tüm kodları çalıştırdık. Örnek olarak verebileceğiniz c18 ile yazılmış basit birşey var mıdır ?

i'm doing nothing... Giddy Up  http://www.drorhan.com

orhanc

mikroC de tanımlamalar böyle. Bunun hitech ve/veya c18 için olanı varmıdır elinizde? Bu kod ile devre çalışıyor demek ki sorun kodlardaymış

sbit LCD_RS at RD0_bit;
sbit LCD_EN at RD1_bit;
sbit LCD_D4 at RD2_bit;
sbit LCD_D5 at RD3_bit;
sbit LCD_D6 at RD4_bit;
sbit LCD_D7 at RD5_bit;

sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISD1_bit;
sbit LCD_D4_Direction at TRISD2_bit;
sbit LCD_D5_Direction at TRISD3_bit;
sbit LCD_D6_Direction at TRISD4_bit;
sbit LCD_D7_Direction at TRISD5_bit;
i'm doing nothing... Giddy Up  http://www.drorhan.com

M_B

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

arslan74

Alıntı yapılan: orhanc - 02 Mayıs 2010, 20:34:15
Hi-Tech de  2*20 LCD için pinleri aşağıdaki gibi tanımlamam gerekiyor. Bunu nasıl yapabilirim? Devre buna uygun basılmış değişiklik yapma şansımız yok. PIC18f452 veya 18f4620 kullanacağım.

RS  > RD0
RW > RD1
E    > RD2

D4-D7 >  RD4-RD7


Herkese şimdiden Teşekkürler...


Merhaba,

Böyle bir sorunla  bende karşılaşmıştım. Çözüm olarak LCD kütüphanesini yeniden yazdım. Artık istediğim pini kullanabiliyorum, Hata 4 bit data uclarıda sıralı veya aynı portlarda olma zorunda değil. isteidiğiniz data pinlerini ayrı ayrı herhangi bir port pine bağlayabilirsiniz.

lcd.c kodu.
/*
 *	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 RB3
#define	LCD_RW RB4
#define	LCD_RS RB5

#define	LCD_DB4 RD4
#define	LCD_DB5 RD5
#define	LCD_DB6 RD6
#define	LCD_DB7 RD7

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

#define	TRIS_EN	TRISB3
#define	TRIS_RW 	TRISB4
#define	TRIS_RS 	TRISB5

#define	TRIS_DB4 	TRISD4
#define	TRIS_DB5 	TRISD5
#define	TRIS_DB6 	TRISD6
#define	TRIS_DB7 	TRISD7


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

	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.h kodu.
/*
 *	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


Örnek kullanımda söyle bir şey olabilir.

lcd_init();
	
	lcd_clear();
	
	lcd_goto(S1_1);	// Select line
	//        1234567890123456
	lcd_puts("test programi.");
	lcd_goto(S2_1);	// Select  line
	//        1234567890123456
	lcd_puts("Merhaba Dunya.");

   lcd_write_char(234);


Şeklinde kullanabilirsin. Bu kod 4Mhz göre ayarlandığı için. yüksek hızlarda çalışmaz ise Delay rutinlerini değiştirmen gerekebilir.

Selamlar

orhanc

Denedim kodları pinleri kendi devreme göre ayarladım ama hala siyah satır geliyor bir türlü çalışmadı. :-\
i'm doing nothing... Giddy Up  http://www.drorhan.com

SERRO EFE

kontrast ayarlamamış olabilirmi acaba.

orhanc

Hayır mikroC ile yazdırıyorum aynı devreye. Proteusda çalışıyor gözüküyor ama devrede hareket yok
i'm doing nothing... Giddy Up  http://www.drorhan.com