Picproje Elektronik Sitesi

DERLEYİCİLER => Hi-Tech => Konuyu başlatan: orhanc - 02 Mayıs 2010, 20:34:15

Başlık: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: 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...
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: gogge - 02 Mayıs 2010, 21:19:51
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.

Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 02 Mayıs 2010, 21:28:40
18 serisi için çalışan lcd kütüpahensi varmı elinizde ?
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: gogge - 02 Mayıs 2010, 22:05:05
http://www.4shared.com/file/B7HOXhq4/pic18_lcd_ktphanesi.html

Hiç kullanmadım ama elimde bu kütüphaneler var. Umarım işinizi görür.
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: 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.
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: gogge - 03 Mayıs 2010, 00:00:31
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.
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: acemi2010 - 03 Mayıs 2010, 19:00:56
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
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: acemi2010 - 03 Mayıs 2010, 19:11:03
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
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 03 Mayıs 2010, 19:23:58
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 ?

Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 03 Mayıs 2010, 23:03:05
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;
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: M_B - 03 Mayıs 2010, 23:34:55
Merhaba Altaki linki inceleyin. İşinizi görecektir.
Kolay gelsin

http://extremeelectronics.co.in/microchip-pic-tutorials/interfacing-lcd-modules-with-pic-microcontrollers/
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: arslan74 - 03 Mayıs 2010, 23:57:50
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
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 04 Mayıs 2010, 23:05:46
Denedim kodları pinleri kendi devreme göre ayarladım ama hala siyah satır geliyor bir türlü çalışmadı. :-\
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: SERRO EFE - 04 Mayıs 2010, 23:29:29
kontrast ayarlamamış olabilirmi acaba.
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 05 Mayıs 2010, 03:37:46
Hayır mikroC ile yazdırıyorum aynı devreye. Proteusda çalışıyor gözüküyor ama devrede hareket yok
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: ahmet2004 - 05 Mayıs 2010, 16:34:00
*orhanc*

microC mi kullanıyorsun HitechC mi kullanıyorsun?

arslan74 un verdiği kodlar çalışıyor.Senin çalıştığın çalışmayan kodlar neler eklersen bakalım?
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 05 Mayıs 2010, 16:45:48
Alıntı yapılan: ahmet2004 - 05 Mayıs 2010, 16:34:00
*orhanc*

microC mi kullanıyorsun HitechC mi kullanıyorsun?

arslan74 un verdiği kodlar çalışıyor.Senin çalıştığın çalışmayan kodlar neler eklersen bakalım?

Hitech kullanmak istiyorum ama lcd çalışmadığı için microC Kullandım. Devrede sorun yok hitech ile bir türlü yazdıramadım çünkü lcd nin pinleri farklı şekilde bağlı

RS  > RD0
RW > RD1
E    > RD2

D4-D7 >  RD4-RD7


evet o kodlar proteusda çalışıyor ama devrede çalışmıyor
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: ahmet2004 - 05 Mayıs 2010, 17:16:27
delay.c
/*
* Delay functions
* See delay.h for details
*
* Make sure this code is compiled with full optimization!!!
*/

#include "delay.h"

void
DelayMs(unsigned char cnt) {
unsigned char i;
while (cnt--) {
i=4;
while(i--) {
DelayUs(uS_CNT); /* Adjust for error */
} ;
} ;
}



delay.h
/*
* Delay functions for HI-TECH C on the PIC18
*
* Functions available:
* DelayUs(x) Delay specified number of microseconds
* DelayMs(x) Delay specified number of milliseconds
*
* Note that there are range limits:
* - on small values of x (i.e. x<10), the delay becomes less
* accurate. DelayUs is accurate with xtal frequencies in the
* range of 4-16MHZ, where x must not exceed 255.
* For xtal frequencies > 16MHz the valid range for DelayUs
* is even smaller - hence affecting DelayMs.
* To use DelayUs it is only necessary to include this file.
* To use DelayMs you must include delay.c in your project.
*
* Set the crystal frequency in the CPP predefined symbols list
* on the PICC-18 commmand line, e.g.
* picc18 -DXTAL_FREQ=4MHZ
*
* or
* picc18 -DXTAL_FREQ=100KHZ
*
* Note that this is the crystal frequency, the CPU clock is
* divided by 4.
*
* MAKE SURE this code is compiled with full optimization!!!
*/

#define MHZ *1

#ifndef XTAL_FREQ
#define XTAL_FREQ 20MHZ /* Crystal frequency in MHz */
#endif

#if XTAL_FREQ < 8MHZ
#define uS_CNT 238 /* 4x to make 1 mSec */
#endif

#if XTAL_FREQ == 8MHZ
#define uS_CNT  244
#endif

#if XTAL_FREQ > 8MHZ
#define uS_CNT  246
// 246
#endif

#define FREQ_MULT (XTAL_FREQ)/(4MHZ)

#define DelayUs(x) { unsigned char _dcnt; \
  if(x>=4) _dcnt=(x*(FREQ_MULT)/2); \
  else _dcnt=1; \
  while(--_dcnt > 0) \
{\
asm("nop");\
asm("nop");\
continue; }\
}

extern void DelayMs(unsigned char);




Genelde hitechC de yapılan hata delay.c ve delay.h ın doğru kullanılamamasıdır.
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: ahmet2004 - 05 Mayıs 2010, 17:19:05
lcd.h

#ifndef LCD_H_
#define LCD_H_
/*
* LCD interface header file
* See lcd.c for more info
*/

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

extern void lcd_putch(char c);

/* Go to the specified position */

extern void lcd_goto(unsigned char pos);

/* intialize the LCD - call before anything else */

extern void lcd_init(void);

#endif /*LCD_H_*/


lcd.c


#include <htc.h>
#define XTAL_FREQ 20MHZ
#include "delay.h"
#include "lcd.h"

#define LCD_RS RD0
#define LCD_RW RD1
#define LCD_EN RD2

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

/////////////////////////////
#define TRIS_RS TRISD0
#define TRIS_RW TRISD1
#define TRIS_EN TRISD2

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


Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 05 Mayıs 2010, 17:21:50
Eve birazdan gideceğim deneyip tekrardan bilgi vereceğim
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: ahmet2004 - 05 Mayıs 2010, 17:24:26

20Mhz  kristal kullanılmıştır.

(http://img319.yukle.tc/images/8839devre.jpg)

(http://img315.yukle.tc/images/2072hata.jpg)

ÖM inize cevap yazmak istedim bu mesaj geliyor.
Mesaj ayarlarınızı tüm kullanıcılardan mesaj al kısmını seçerseniz.
Kullanıcı 'orhanc' sizi engellemiştir.

(http://img313.yukle.tc/images/5346hata2.jpg)
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 05 Mayıs 2010, 17:26:47
Tamam düzelttim ayarı kaçmış :)
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 05 Mayıs 2010, 17:37:39
Ben bir şey daha sorayım bununla ilgili. Ben hitechi derleyici olarak mplab içinden kullanıyorum bunun bir etkisi olabilir mi ve tam sürüm olmasıan rağmen lite modu kullanılıyor gibi bir uyarı veriyor ve onu düzeltemedim.
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: ahmet2004 - 05 Mayıs 2010, 17:42:44
ben hitech-ide den kullanıyorum.Başka bir sınırsız hitech kur sınırlamalar kalmaz o zaman.
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 05 Mayıs 2010, 21:59:38
#define LCD_RS RD0
//#define LCD_RW RD2
#define LCD_EN RD1

#define LCD_DB4 RD2
#define LCD_DB5 RD3
#define LCD_DB6 RD4
#define LCD_DB7 RD5


Devremin pinleri bu şekildeymiş ve bağladım ama görüntü gelmedi. Aynı pinler ile microc çalışıyor ve devre 8mhz ve 18f4620 kullandım.
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 05 Mayıs 2010, 22:47:25
sizin devrenin aynısını yaptık dosyaları da aldık ve çalıştırdık ancak yine görüntü yok tek farkı devre 8mhz ve main.c kodu da şöyle

#include <htc.h>
#include "lcd.h"

void main(void)
{
   PORTD = 0x00;
   TRISD = 0x00;

   lcd_init();
   lcd_clear();
   lcd_goto(1);   
   lcd_puts("test programi.");
   lcd_puts("Merhaba Dunya.");
while(1){

}
}
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: z - 05 Mayıs 2010, 23:26:02
LCD yi neden hazir fonskyonlarla kullanmaya calisiyorsun?

LCD nin bir kac sayfalik dokumanini incelersen C gibi bir dilde 5-10 satirda ihtiyacin olan fonksiyonlari yazabilecegini farkedeceksin.
Kendi kendinin patronu olur diledigin portu diledigin pini kullanirsin.


Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: M_B - 05 Mayıs 2010, 23:26:06
Merhaba orhanc;
Bende sizin main kodunu ve arslan74 hocamızın verdiği kutuphaneyi kullanarak Isıs te sımule ettim calısıyor. Bir sorun gozukmedı.
Siz İsiste sımule ettiğinizde normal olarak calısıyor mu?.
Birde Hex yuklerken Config ayarlarını programlayıcı üzerinden yapıyormusunuz. Cunku main de Config ayarınızı goremedım.
Ornek olarak :
__CONFIG(1,INTIO);
__CONFIG(3,MCLRDIS);
__CONFIG(4,DEBUGDIS);
__CONFIG(5,UNPROTECT);
__CONFIG(6,UNPROTECT);
__CONFIG(7,UNPROTECT);


Kolay gelsin.

Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: ahmet2004 - 05 Mayıs 2010, 23:54:52
Buda benim yazdıklarım senin donanımında çalışıyor.


#include <stdio.h>
#include <stdlib.h>
#include <htc.h>
#include <pic18f4620.h>

__CONFIG(1, HS & IESODIS & FCMDIS);
__CONFIG(2, PWRTDIS & BORDIS & WDTDIS & WDTPS128);
__CONFIG(3, CCP2RB3 & LPT1DIS & MCLREN);
__CONFIG(4, STVREN & LVPDIS & DEBUGDIS & XINSTDIS);
__CONFIG(5, UNPROTECT);
__CONFIG(6, UNPROTECT);
__CONFIG(7, UNPROTECT);

#define XTAL_FREQ 8MHZ
#include "delay.h"
#include "lcd.h"

void main(void)
{
PORTD = 0x00;
TRISD = 0x00;

lcd_init();
lcd_clear();
lcd_goto(1);
lcd_puts("test programi.");
lcd_puts("Merhaba Dunya.");
while(1){

}
}




ilk başta RW pinini RD1 e vermişsin.Benim yazdıklarımla birlikte Lcd RW pini şaseye bağlayınca çalışıyor.


Son durumu söyle ona göre devam edelim.
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 06 Mayıs 2010, 01:12:14
Proteusa güvenmeyin gerçek devrede hiçbiri çalışmıyor :) ben configi mplabın ayar menüsünden yapıyorum
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 06 Mayıs 2010, 01:33:20
Son Denememde configleri kod olarak ekledim ve devre çalıştı sanırım mplabın ayar kısmında bir sorunu var. Herkese teşekkür ederim vaktinizi ayırdığınız için.
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 07 Mayıs 2010, 09:36:21
Arkadaşlar burada verilen lcd kodunda lcd yi 4*20 olarak nasıl ayarlayabilirim? ve birde şöyle bir sorun oluyor bazen ds1302 den saati alıyorum bazen değerler 165 veya 0 olarak geliyor. Bunun bir sebebi var mıdır?
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 07 Mayıs 2010, 13:50:21
Alıntı yapılan: FxDev - 07 Mayıs 2010, 13:41:17
Alıntı yapılan: orhanc - 07 Mayıs 2010, 09:36:21
Arkadaşlar burada verilen lcd kodunda lcd yi 4*20 olarak nasıl ayarlayabilirim? ve birde şöyle bir sorun oluyor bazen ds1302 den saati alıyorum bazen değerler 165 veya 0 olarak geliyor. Bunun bir sebebi var mıdır?

Kodunuzu koysanız kütüphaneleriniz dahil yardımcı oluruz.

2.sayfadaki ahmet2004 tarafından göndrerilen kodu kullandım ama o 2 satır.
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: orhanc - 07 Mayıs 2010, 16:23:04
Teşekkür ederim sorunu çözdüm :)
Başlık: Ynt: LCD Pinlerini nasıl ayarlayabilirim ?
Gönderen: kantirici - 17 Haziran 2011, 14:19:32
Alıntı yapılan: ahmet2004 - 05 Mayıs 2010, 17:16:27
delay.c
/*
* Delay functions
* See delay.h for details
*
* Make sure this code is compiled with full optimization!!!
*/

#include "delay.h"

void
DelayMs(unsigned char cnt) {
unsigned char i;
while (cnt--) {
i=4;
while(i--) {
DelayUs(uS_CNT); /* Adjust for error */
} ;
} ;
}



delay.h
/*
* Delay functions for HI-TECH C on the PIC18
*
* Functions available:
* DelayUs(x) Delay specified number of microseconds
* DelayMs(x) Delay specified number of milliseconds
*
* Note that there are range limits:
* - on small values of x (i.e. x<10), the delay becomes less
* accurate. DelayUs is accurate with xtal frequencies in the
* range of 4-16MHZ, where x must not exceed 255.
* For xtal frequencies > 16MHz the valid range for DelayUs
* is even smaller - hence affecting DelayMs.
* To use DelayUs it is only necessary to include this file.
* To use DelayMs you must include delay.c in your project.
*
* Set the crystal frequency in the CPP predefined symbols list
* on the PICC-18 commmand line, e.g.
* picc18 -DXTAL_FREQ=4MHZ
*
* or
* picc18 -DXTAL_FREQ=100KHZ
*
* Note that this is the crystal frequency, the CPU clock is
* divided by 4.
*
* MAKE SURE this code is compiled with full optimization!!!
*/

#define MHZ *1

#ifndef XTAL_FREQ
#define XTAL_FREQ 20MHZ /* Crystal frequency in MHz */
#endif

#if XTAL_FREQ < 8MHZ
#define uS_CNT 238 /* 4x to make 1 mSec */
#endif

#if XTAL_FREQ == 8MHZ
#define uS_CNT  244
#endif

#if XTAL_FREQ > 8MHZ
#define uS_CNT  246
// 246
#endif

#define FREQ_MULT (XTAL_FREQ)/(4MHZ)

#define DelayUs(x) { unsigned char _dcnt; \
  if(x>=4) _dcnt=(x*(FREQ_MULT)/2); \
  else _dcnt=1; \
  while(--_dcnt > 0) \
{\
asm("nop");\
asm("nop");\
continue; }\
}

extern void DelayMs(unsigned char);




Genelde hitechC de yapılan hata delay.c ve delay.h ın doğru kullanılamamasıdır.


@ahmet2004 verdigin kütüphane içinçok teşekkürler.Sorunsuz ve kolayca istedigimiz pine lcd yi yönlendirebiliyoruz.