Picproje Elektronik Sitesi

DERLEYİCİLER => Hi-Tech => Konuyu başlatan: kantirici - 08 Ağustos 2011, 14:15:15

Başlık: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: kantirici - 08 Ağustos 2011, 14:15:15
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
Başlık: Ynt: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: 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?.

Başlık: Ynt: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: kantirici - 09 Ağustos 2011, 13:06:52
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?
Başlık: Ynt: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: ete - 12 Ağustos 2011, 09:56:59
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
Başlık: Ynt: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: kantirici - 13 Ağustos 2011, 02:50:56
Ç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);
Başlık: Ynt: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: armsistem - 13 Ağustos 2011, 17:09:40
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
Başlık: Ynt: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: kantirici - 13 Ağustos 2011, 18:44:17
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.
Başlık: Ynt: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: armsistem - 13 Ağustos 2011, 21:44:17
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);


Başlık: Ynt: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: kantirici - 14 Ağustos 2011, 00:58:56
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);


Başlık: Ynt: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: armsistem - 14 Ağustos 2011, 01:19:57
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.
Başlık: Ynt: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: armsistem - 14 Ağustos 2011, 21:59:34
ÇÖZÜLDÜ TEŞEKKÜRLER !!!!
Başlık: Ynt: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: 3adam - 24 Ağustos 2011, 01:56:17
Herkese teşekkürler faydalı bir paylaşım....
Başlık: Ynt: 2*16 Lcd Tek Port üzerinden Kontrol Sorunu
Gönderen: mechartronic04 - 04 Ocak 2013, 23:06:21
merhaba bende denedim  ama karakterler hayatımda görmediğim karakterler çıkıyor çan zil gibi işaretler var neden olabilir ki