Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

LCD fonksiyon problemi

Başlatan AsHeS, 21 Haziran 2012, 19:52:00

AsHeS

[code]#include <htc.h>
#include "delay.h" // Gecikme kütüphanesi
#define rs RB6
#define e RB7
#define lcd_port PORTB
 lcd_bekle(void){
DelayUs(100);
}
void lcd_komut(unsigned char k){
char i,porteski;
rs=0;
e=1;
i=((k&(0xF0))>>4)&(0x0F);
porteski=lcd_port;
lcd_port=(porteski&(0xF0))|(i&(0x0F));
e=0;
lcd_bekle();
e=1;
i=(k&(0x0F));
porteski=lcd_port;
lcd_port=(porteski&(0xF0))|(i&(0x0F));
e=0;
lcd_bekle();
}

void imlecyeri(unsigned char x,unsigned char y){
if (x==1)
	lcd_komut((0x80)+((y-1)%16));
	lcd_komut((0xC0)+((y-1)%16));
}

 lcd_kur(void){

lcd_komut(0x03);
DelayMs(2);
lcd_komut(6);
DelayMs(2);
lcd_komut(12);
DelayMs(2);
lcd_komut(1);
DelayMs(2);
imlecyeri(1,1);
DelayMs(2);
}


 lcd_veri(unsigned char k){
char i,porteski;
rs=1;
e=1;
i=((k&(0xF0))>>4)&(0x0F);
porteski=lcd_port;
lcd_port=(porteski&(0xF0))|(i&(0x0F));
e=0;
lcd_bekle();
e=1;
i=(k&(0x0F));
porteski=lcd_port;
lcd_port=(porteski&(0xF0))|(i&(0x0F));
e=0;
lcd_bekle();
}
lcd_yazi(char *q){
lcd_bekle();
while(*q)
	lcd_veri(*q++);
}
void main(void) // Ana fonksiyon alanı
{
TRISB=0x00; // PORTB çıkıG olarak yönlendiriliyor
PORTB=0x00; // PORTB'nin tüm çıkıGları sıfırlanıyor
DelayMs(100);
lcd_komut(0x28);//Kurulum
DelayMs(1);
lcd_veri("a");


for(;;);
}

Şematik bu şekilde

Sorunuma gelecek olursak LCD için basit fonksiyonları kendim yazmaya çalıştım lakin zımbırtı çalışmıyor lcd_komut fonksiyonun da hata olabilir diye düşünüyorum orayı da kurcaladım bir hata bulamadım.En son çare sizlere danışayım dedim.Yardımlarınız için şimdiden teşekkür ederim.

arm-beginner

Sen main() 'den lcd_kur() function'ı hiç çağırmiyorsunki ....

arm-beginner

Benim kullandığım kod.
C++ ile yazılmış, ama sanırım çözersin.

#ifdef LCD_4bit
  //4 bit part
  DelayMs(15);
  LCD_DATADIR_REG |= 1 << LCD_D4 | 1 << LCD_D5 | 1 << LCD_D6 | 1 << LCD_D7 | 1 << LCD_E | 1 << LCD_RS ;
  BIT_CLEAR(LCD_CTRL_PORT, LCD_E);
  BIT_CLEAR(LCD_CTRL_PORT, LCD_RS);
   //---------one------
  LCD_DATA_PORT &= 0x0F;
  LCD_DATA_PORT |= 0x03; //4 bit mode
  this->ToggleE();
  DelayMs(5);
  //-----------two-----------
  this->ToggleE();
  DelayMs(5);
  //-------three-------------
  this->ToggleE();
  DelayMs(5);
  //-------
  this->ToggleE();
  DelayMs(5);
  //-------
  this->SendCmd(0x28);   // Datalaenge 4bit / 2 lines
  this->SendCmd(0x0C);   // set Display On, no Cursor, no blink

 ( ... vs. vs. )

AsHeS

#3
O fonksiyon yerine direkt lcd_komut(0x28) yazdım hocam lakin yine de değişen birşey yok sizin verdiğiniz kodun çok benzeri olarak tekrar kodla oynadım sonuç yine hüsran yeni yazdığım kodu koyuyorum
Edit:lcd_komut fonksiyonun çalıştığını 0x0F ile blinklenmeyle teyit ettim fakat zannımca sorun lcd_veri fonksiyonunda bulamadım gitti zıkkımı.
#include <htc.h>
#include "delay.h" // Gecikme kütüphanesi
#define rs RB6
#define e RB7
#define lcd_port PORTB
 lcd_bekle(void){
DelayUs(100);
}
void lcd_komut(unsigned char k){
char i,porteski;
rs=0;
e=1;
i=((k&(0xF0))>>4)&(0x0F);
porteski=lcd_port;
lcd_port=(porteski&(0xF0))|(i&(0x0F));
e=0;
lcd_bekle();
e=1;
i=(k&(0x0F));
porteski=lcd_port;
lcd_port=(porteski&(0xF0))|(i&(0x0F));
e=0;
lcd_bekle();
}

void imlecyeri(unsigned char x,unsigned char y){
if (x==1)
	lcd_komut((0x80)+((y-1)%16));
	lcd_komut((0xC0)+((y-1)%16));
}

 lcd_kur(void){

lcd_komut(0x28);
DelayMs(2);
lcd_komut(0x28);
DelayMs(2);
lcd_komut(0x0C);
DelayMs(2);
lcd_komut(0x06);
DelayMs(2);
lcd_komut(0x01);
DelayMs(2);
lcd_komut(0x80);
DelayMs(2);
}


 lcd_veri(unsigned char k){
char i,porteski;
lcd_bekle();
rs=1;
e=1;
i=((k&(0xF0))>>4)&(0x0F);
porteski=lcd_port;
lcd_port=(porteski&(0xF0))|(i&(0x0F));
e=0;
lcd_bekle();
e=1;
i=(k&(0x0F));
porteski=lcd_port;
lcd_port=(porteski&(0xF0))|(i&(0x0F));
e=0;
lcd_bekle();
}
lcd_yazi(char *q){
lcd_bekle();
while(*q)
	lcd_veri(*q++);
}
void main(void) // Ana fonksiyon alanı
{
TRISB=0x00; // PORTB çıkıG olarak yönlendiriliyor
PORTB=0x00; // PORTB'nin tüm çıkıGları sıfırlanıyor
DelayMs(100);
lcd_kur();
lcd_veri(0x61);

for(;;);
}

Edit üzerine edit:Çalıştırmayı başardım sorun gecikmeyi az tutmamdaymış sorunun çözüldüğü kod aşağıda ki gibidir.Kütüphaneleştirmiş halidir.
#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 
lcd_bekle(void){
DelayUs(150);
}
void lcd_komut(unsigned char k){
char i,porteski;
rs=0;
e=1;
DelayMs(4);
i=((k&(0xF0))>>4)&(0x0F);
porteski=lcd_port;
lcd_port=(porteski&(0xF0))|(i&(0x0F));
lcd_bekle();
e=0;
lcd_bekle();
e=1;
i=(k&(0x0F));
porteski=lcd_port;
lcd_port=(porteski&(0xF0))|(i&(0x0F));
lcd_bekle();
e=0;
lcd_bekle();
}

void imlecyeri(unsigned char x,unsigned char y){
if (x==1)
	lcd_komut((0x80)+((y-1)%16));
	else
	lcd_komut((0xC0)+((y-1)%16));
}

void lcd_kur(void){
DelayMs(4);
lcd_komut(0x02);
lcd_komut(0x28);
lcd_komut(0x0F);
lcd_komut(0x06);
lcd_komut(0x01);
lcd_komut(0xC0);
}


void lcd_veri(unsigned char pew){
char i,porteski;
lcd_bekle();
rs=1;
e=1;
i=((pew&(0xF0))>>4)&(0x0F);
porteski=lcd_port;
lcd_port=(porteski&(0xF0))|(i&(0x0F));
lcd_bekle();
e=0;
lcd_bekle();
e=1;
i=(pew&(0x0F));
porteski=lcd_port;
lcd_port=(porteski&(0xF0))|(i&(0x0F));
lcd_bekle();
e=0;
}
void lcd_yazi(unsigned char *q){
while(*q)
	lcd_veri(*q++);
}
void lcd_temiz(void){
lcd_komut(0x01);
}