LCD Problemi

the_maniac

Üye
Katılım
25 Nis 2009
Mesajlar
48
Puanları
1
Arkadaşlar benim bitirme projemde bir verici ve alıcı devresi yapmam gerekiyor. Verici devresinde hex tuş takımından girilen veriyi LCD ekranda göstermem gerekiyor tabi buna ek olarak yaptığım başka şeyler de war. Her tuşa basıldığında LCD'de o tuşu görmem lazım her şeyden önce. Tuş takımım çalışıyor ama LCD bi turlu çalışmıyor. Önce 18F452 ile kodu yazmıştım(4Mhz) (açıkçası ramine ihtiyacım war ve bu picle bu sorunu çözmeliyim) fakat LCDde sadece 1 satır veya 2 satır kareler göruyorum. LCD'yi hazır fonksiyonla çalıştırıyorum ve microc kullanıyorum. Daha sonra 16F877A ile denedim onda da çalıştıramadım.Picc de bi kod yazdım ve bunu yukledim 16F877A'ya, kristalimi değiştirdim, başka arkadaşımın kullandığı ve çalışan devreden çıkarıp verdiği LCD ile denedim,4Mhz ile çalışıyordum 20Mhz ile denedim ama ne yaptıysam olmadı.Zamanım çok daralıyor.Projenin teslim tarihi yaklaşıyor.Yardımcı olabilirseniz çok sevinirim.

Not: Kodlarımda hata olduğunu duşunmuyorum çunku hep hazır fonksiyonlar kullanıyorum,devreyi boardda kurdum temassızlık olmamasına dikkat ettim mumkun mertebe avometrenin kısa devre modunda ölçum yapmaya çalıştım. 2 tane 16F877A vardı elimde ikisini de denedim.Bu nedenle picte de olduğunu duşunmuyorum.Kristalimi de çalışan devreden çıkardım ve kendi devreme taktım. Contrast ayarımı pot yardımıyla inceledim sorun yok onda da. Kullandığım LCD de AV Display firmasının ABC016002E69-YLY-R displayi.
 
Resim yok , şema yok , kod yok :rolleyes:

Loto oymak için forumda başlık yok.:)

Proteus ve kodlar ekli olsa yorum daha kolay olurdu.

Hadi bir sallayayım.
LCD 1-2-3 pinleri doğru şekilde bağlımı ? Özellikle 3 , bir potun ortasındamı ( ve ya gerilim bölücü 2 direnç) ?
 
Arkadaşlar burda kodum ve proteustaki devre çizimim var. Kodda max 32 karakterlik veri alıyorum. Her tuşa basıldığında tuşu LCD'de gösteriyorum 32 karakter girmişse kullanıcı, direk tum girdiklerinin ASCII karşılığını gönderiyorum eğer kullanıcı 32 karakterden daha kısa bir mesaj iletmek istiyorsa da gönder butonuna basıyor. En son gönderme işlemi tamamlanınca LCD'de tum mesajı gösteriyorum. Bir de LCD Clear butonu var basıldığında LCD'yi clear edip tekrar programı başa dönduruyor.
Kodu 4Mhz'e göre yazdım 18F452 kullanıyorum.16x2 lik LCD çalıştırıyorum ve microc kullanıyorum. LCD çalışıyor yani ekran ışığı yanıyor. Fakat kareler göruyorum ve contrast ayarını da kontrol ettim.(Pot kullanarak)Pin diyagramımdan da eminim çunku contrast ayarının nerede olduğunu bulabildim bir de benim LCD'min bir başka devrede aynı pin dizilimiyle çalıştığını gözumle gördum :)
Not: potu çevirerek baktım ya kare görunuo ya da potu diğer tarafa çevirince hiç bişi görunmuo_O yuzden contrasttan dolayı bir problem olduğunu sanmıyorum.

Kod:
 void ayarlar();
void port_ayari();
void tus_kontrol(int []);
void LCD_yaz(int*,int);
int veri_dondur(int ,int [],int);//her tuş takımına karşılık gelen 8 bitlik veriyi döndurur
void veri_gonder(int [][],int);//çıkış portuna veriyi atar
int sayac_kontrol(int,int [],int);//mex veri mikt sınırına ulaşılmış mı kontrol eder
void veri_sifirla(int []);//veri dizisini sıfırlar
int veri_uret(int veri_karsila[],int dizi_karsila[],int z);

void main()
{
int i;
int z=0,sayac=0;
int tus,dizi[8]={1,1,1,1,1,1,1,1},veri[264];
delay_ms(1000);
ayarlar();
veri_sifirla(veri);
PORTA.F3=1;
do
{
anadongu:
tus_kontrol(veri);
kontrol1:
if(PORTD.F0==0)//basılmamamıştır.
{
goto kontrol1;
}
else if(PORTD.F0==1) //basılmıştır.
{
ayarlar();
veri_sifirla(veri);// burayı yeni ekledim.
goto anadongu;
}
delay_ms(300);
}while(1);
}
void ayarlar()
{
TRISB=0x00;
//PORTB=0x00;
TRISA=0x00;
PORTA=0x00;
////////////
TRISC=0x0F;
//TRISC.F0=1;//R0-3: İNPUT, R4-7 OUTPUT
// TRISC.F1=1;
// TRISC.F2=1;
// TRISC.F3=1;
// TRISC.F4=0;//F4 ve devamı satır.
// TRISC.F5=0;
// TRISC.F6=0;
// TRISC.F7=0;
////////////
PORTC=0xF0;
// PORTC.F7=1;//satırları Vcc'ye çekiyoruz.
// PORTC.F6=1;
// PORTC.F5=1;
// PORTC.F4=1;
// PORTC.F3=0;//sutunlara da ilk değer olarak GND atıyoruz.
// PORTC.F2=0;
// PORTC.F1=0;
// PORTC.F0=0; //burası doğru çalışıyor.
TRISD=0x01;
PORTD=0x00;
PORTE=0;
TRISE=0x05;
Lcd_Init(&PORTB);
Lcd_Cmd(Lcd_CLEAR);
Delay_1sec();
Lcd_Cmd(LCD_CURSOR_OFF);
Lcd_Out(1, 1, "Mesajinizi");
Lcd_Out(2, 1, "Giriniz");
delay_ms(2000);
Lcd_Cmd(Lcd_CLEAR);
}

void tus_kontrol(int veri[])
{
int a=0,tus=100,sayac=0,J=1,x=1,dizi[8]={1,1,1,1,1,1,1,1},i=0,z=0,b;
while(x==1)
{
//PORTC.F7=1;//satırları Vcc'ye çekiyoruz.
// PORTC.F6=1;
// PORTC.F5=1;
// PORTC.F4=1;
PORTC.F3=0;//sutunlara da ilk değer olarak GND atıyoruz.
PORTC.F2=0;
PORTC.F1=0;
PORTC.F0=0; //burası doğru çalışıyor
if(PORTC.F0==1)//1,4,7 veya E'dır.
{
delay_ms(20);
PORTC.F7=1;
PORTC.F6=0;
PORTC.F5=0;
PORTC.F4=0;
if(PORTC.F0==1)
{
int i;
tus=1;
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
else
{
PORTC.F7=0;
PORTC.F6=1;
PORTC.F5=0;
PORTC.F4=0;
if(PORTC.F0==1)
{
int i;//,
tus=4;
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
else
{
PORTC.F7=0;
PORTC.F6=0;
PORTC.F5=1;
PORTC.F4=0;
if(PORTC.F0==1)
{
int i;//,
tus=7;
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
else
{
PORTC.F7=0;
PORTC.F6=0;
PORTC.F5=0;
PORTC.F4=1;
if(PORTC.F0==1)
{
int i;//,
tus='E';
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
}
}
}
}
else if(PORTC.F1==1)//2,5,8 veya 0'dir.
{
delay_ms(20);
PORTC.F7=1;
PORTC.F6=0;
PORTC.F5=0;
PORTC.F4=0;
if(PORTC.F1==1)
{
int i;//,
tus=2;
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
else
{
PORTC.F7=0;
PORTC.F6=1;
PORTC.F5=0;
PORTC.F4=0;
if(PORTC.F1==1)
{
int i;//,dizi5[8]={1,0,1,1,0,1,0,1};
tus=5;
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
else
{
PORTC.F7=0;
PORTC.F6=0;
PORTC.F5=1;
PORTC.F4=0;
if(PORTC.F1==1)
{
int i;//,dizi8[8]={1,0,1,1,1,0,0,0};
tus=8;
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
else
{
PORTC.F7=0;
PORTC.F6=0;
PORTC.F5=0;
PORTC.F4=1;
if(PORTC.F1==1)
{
int i;//,
tus=0;
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
}
}
}
}
else if(PORTC.F2==1)//3,6,9 veya F'dir.
{
delay_ms(20);
PORTC.F7=1;
PORTC.F6=0;
PORTC.F5=0;
PORTC.F4=0;
if(PORTC.F2==1)
{
int i;//,dizi3[8]={1,0,1,1,0,0,1,1};
tus=3;
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
else
{
PORTC.F7=0;
PORTC.F6=1;
PORTC.F5=0;
PORTC.F4=0;
if(PORTC.F2==1)
{
int i;//,dizi6[8]={1,0,1,1,0,1,1,0};
tus=6;
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
else
{
PORTC.F7=0;
PORTC.F6=0;
PORTC.F5=1;
PORTC.F4=0;
if(PORTC.F2==1)
{
int i;//,dizi9[8]={1,0,1,1,1,0,0,1};
tus=9;
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
else
{
PORTC.F7=0;
PORTC.F6=0;
PORTC.F5=0;
PORTC.F4=1;
if(PORTC.F2==1)
{
int i;//,diziF[8]={1,1,0,0,0,1,1,0};
tus='F';
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
}
}
}
}
else if(PORTC.F3==1)//A,B,C veya D'dir.
{
delay_ms(20);
PORTC.F7=1;
PORTC.F6=0;
PORTC.F5=0;
PORTC.F4=0;
if(PORTC.F3==1)
{
int i;//,
tus='A';
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
else
{
PORTC.F7=0;
PORTC.F6=1;
PORTC.F5=0;
PORTC.F4=0;
if(PORTC.F3==1)
{
int i;//,
tus='B';
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
else
{
PORTC.F7=0;
PORTC.F6=0;
PORTC.F5=1;
PORTC.F4=0;
if(PORTC.F3==1)
{
int i;//
tus='C';
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
else
{
PORTC.F7=0;
PORTC.F6=0;
PORTC.F5=0;
PORTC.F4=1;
if(PORTC.F3==1)
{
int i;//
tus='D';
LCD_yaz(&J,tus);
sayac=sayac+1;
z=veri_dondur(tus,veri,z);
port_ayari();
}
}
}
}
} a=sayac-1;
if(sayac==32)
{
x=0;
}
else if(PORTD.F0==1)
{
//PORTA.F5=1;
x=0;
}
delay_ms(300);
}
//PORTA.F3=1;
// delay_ms(300);
a++;
b=z;
for(z;z<b+8;z++)
{
veri[z]=1;
i++;
}
//veri_dondur(tus,veri,z);
veri_gonder(veri,z);
}

void LCD_yaz(int *J,int karakter)
{
int K,T;
if(*J>16)
{
K=2;
if(*J==32){ T=16; }
else{
T=*J%16;
}
}
else T=*J;
switch(karakter)
{
case 0: Lcd_Chr(K, T, '0'); (*J)++; break;
case 1: Lcd_Chr(K, T, '1'); (*J)++; break;
case 2: Lcd_Chr(K, T, '2'); (*J)++; break;
case 3: Lcd_Chr(K, T, '3'); (*J)++; break;
case 4: Lcd_Chr(K, T, '4'); (*J)++; break;
case 5: Lcd_Chr(K, T, '5'); (*J)++; break;
case 6: Lcd_Chr(K, T, '6'); (*J)++; break;
case 7: Lcd_Chr(K, T, '7'); (*J)++; break;
case 8: Lcd_Chr(K, T, '8'); (*J)++; break;
case 9: Lcd_Chr(K, T, '9'); (*J)++; break;
case 'A': Lcd_Chr(K, T, 'A'); (*J)++; break;
case 'B': Lcd_Chr(K, T, 'B'); (*J)++; break;
case 'C': Lcd_Chr(K, T, 'C'); (*J)++; break;
case 'D': Lcd_Chr(K, T, 'D'); (*J)++; break;
case 'E': Lcd_Chr(K, T, 'E'); (*J)++; break;
case 'F': Lcd_Chr(K, T, 'F'); (*J)++; break;
}
}
void port_ayari()
{
PORTC.F7=1;//satırları Vcc'ye çekiyoruz.
PORTC.F6=1;
PORTC.F5=1;
PORTC.F4=1;
PORTC.F3=0;//sutunlara da ilk değer olarak GND atıyoruz.
PORTC.F2=0;
PORTC.F1=0;
PORTC.F0=0; //burası doğru çalışıyor
}
void veri_sifirla(int veri[])
{
int i=0;
do
{
veri=0;
i=i+1;
}while(i<264);
}
void veri_gonder(int dizi_gonderilecek[],int indis)//tmm yazılacak 1.boyutun gemesi lazım
{ //veri sayac
int b,i,m=0,counter,z;
z=indis;
//counter=indis;
// for(i=0;i<8;i++)
// {
// dizi_gonderilecek[counter]=1;
// }

//for(m=0;m<=indis;m++)//1.boyutu değiştirir.
// {
//z=8*indis-1;
//b=z;
for(i=0;i<z;i++)
{
PORTA=dizi_gonderilecek+4; //D uzerinden çalışmadı data yollamıo
//portd.F1=1; //geri Aportuna dönS
delay_ms(1000);
porta=0;
//PORTD=0;
delay_ms(50); //delayleri ayarlaman gerekiyor !!!!!!!!!!!!!!!!!!
if(i%8==7)
{
delay_ms(1000);
}
} //gönderirken her 8 bitten sonra kaymamasına dikkat et !!!!!!
//delay_ms(1000);
// }

}
//verileri gönderdikten sonra Lcd'yi clear etmek için butona basılmış mı
//kontrol edilmesi gerek !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


int veri_dondur(int tus,int veri[],int z)
{
int dizi0[8]={1,0,1,1,0,0,0,0};
int dizi1[8]={1,0,1,1,0,0,0,1};
int dizi2[8]={1,0,1,1,0,0,1,0};
int dizi3[8]={1,0,1,1,0,0,1,1};
int dizi4[8]={1,0,1,1,0,1,0,0};
int dizi5[8]={1,0,1,1,0,1,0,1};
int dizi6[8]={1,0,1,1,0,1,1,0};
int dizi7[8]={1,0,1,1,0,1,1,1};
int dizi8[8]={1,0,1,1,1,0,0,0};
int dizi9[8]={1,0,1,1,1,0,0,1};
int diziA[8]={1,1,0,0,0,0,0,1};
int diziB[8]={1,1,0,0,0,0,1,0};
int diziC[8]={1,1,0,0,0,0,1,1};
int diziD[8]={1,1,0,0,0,1,0,0};
int diziE[8]={1,1,0,0,0,1,0,1};
int diziF[8]={1,1,0,0,0,1,1,0};
// int i=0,b;
// b=z;
// for(z;z<b+8;z++)
// {
// veri_karsila[z]=dizi_karsila;
// i++;
// }
// return z;

switch(tus)
{
case 0: z=veri_uret(veri,dizi0,z); break;
case 1: z=veri_uret(veri,dizi1,z); break;
case 2: z=veri_uret(veri,dizi2,z); break;
case 3: z=veri_uret(veri,dizi3,z); break;
case 4: z=veri_uret(veri,dizi4,z); break;
case 5: z=veri_uret(veri,dizi5,z); break;
case 6: z=veri_uret(veri,dizi6,z); break;
case 7: z=veri_uret(veri,dizi7,z); break;
case 8: z=veri_uret(veri,dizi8,z); break;
case 9: z=veri_uret(veri,dizi9,z); break;
case 'A': z=veri_uret(veri,diziA,z); break;
case 'B': z=veri_uret(veri,diziB,z); break;
case 'C': z=veri_uret(veri,diziC,z); break;
case 'D': z=veri_uret(veri,diziD,z); break;
case 'E': z=veri_uret(veri,diziE,z); break;
case 'F': z=veri_uret(veri,diziF,z); break;
}
return z;
}
int veri_uret(int veri_karsila[],int dizi_karsila[],int z)
{
int i=0,b;
b=z;
for(z;z<b+8;z++)
{
veri_karsila[z]=dizi_karsila;
i++;
}
return z;
}
 
Verdiğin kodlar microC pro v1.65 de derlenmedi , bir çok hata var.
LCD initten başlayıp devam ediyorlar.Muhtemelen lcd dosyalarında değişikliğin var ve bunları bilmiyorum.
MicroC nin inceliklerini bilmiyorum.

Bir şeyler yapmışsın ve sonuç almak için gayret gösteriyorsun.
Elimden gelse yardım etmek istiyorum , yanlış anlama ama , biri senden yardım istese , proteus dosyası varken sadece resmi gönderse bu karışık devre için vakit harcarmıydın ?

Edit : microC yazılımının orijinal sitesinde aradınmı çare.

http://www.mikroe.com/forum/viewforum.php?f=13
 
Son düzenleme:
Verdiğin kodlar microC pro v1.65 de derlenmedi , bir çok hata var.
LCD initten başlayıp devam ediyorlar.Muhtemelen lcd dosyalarında değişikliğin var ve bunları bilmiyorum.
MicroC nin inceliklerini bilmiyorum.

Bir şeyler yapmışsın ve sonuç almak için gayret gösteriyorsun.
Elimden gelse yardım etmek istiyorum , yanlış anlama ama , biri senden yardım istese , proteus dosyası varken sadece resmi gönderse bu karışık devre için vakit harcarmıydın ?

Edit : microC yazılımının orijinal sitesinde aradınmı çare.

mikroElektronika :: View Forum - mikroC General


microc nin o versiyonunu ben de yukledim ama onda tamamen farklı library dolayısıyla hata vermesi çok normal. benim kullandığım versiyon 8.1 buna göre denersen derleme sırasında hata olmadığını göreceksin.
ayrıca çok ufak bir lcd deneme kodu yazdım:
void main()
{
delay_ms(1000);
TRISA=0x00;
TRISB=0x00;
TRISC=0x00;
TRISD=0x00;
TRISE=0x00;
Lcd_Config(&PORTD, 2, 3, 1, 7, 6, 5, 4);
while(1)
{
Lcd_Cmd(Lcd_CLEAR); // Clear display
//Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 3, "Hello!");
delay_ms(3000);
}
}

sadece lcdye yazı yazacak fakat herhangi bir data gelmiyor. dahası imleci de göstermiyor.eğer yardımcı olabilirsen çok sevinirim
 
kullandığın lcd 2x16 ise bacak dizilimde surekli hata çıktığını söylemek isterim.
ööncelikle ondan emin ol. Kullandığın programı ben bilmiyorum ama pbp ile yaptığım uygulamalarda hiç sorun yaşamadım. sorununun hardware mi yoksa software mi olduğunu bir anlaman lazım . çalıştığına emin olduğun bir programı sadece basit birşey yazabilir, ekrana gönderirsen hata yı kafadan 2 ye bölmüş olursun.


kolay gelsin
 
bu kodları bir de 16F877A ile dene derim. ben de 18f452 kullanarak grafik ekrana birşeyler yaptırmaya çalışmıştım sonradan başka bir fonksiyon daha kullanmam gerektiğini görmüştüm ve onu kullanınca düzelmişti. eğer 16F877A da düzgün çalışıyorsa, kodlarda değişiklik yapman gerekir 18F452 ye göre.
 
Arkadaşlar hatayı sonradan buldum. Hem LCD'ye bağlanacak direnç hem de pin diziliminde hata varmış. İkisi birlikte olunca da doğru pin dizilimini bulsam bile direnç doğru değerde olmadığı için ekranda bir şey göremiyordum.
Arkadaşımın çalışan devresine kendi LCD'mi takmıştım. Doğru pin dizilimindeymiş ve tesadüfen yan baktığımda aslında bir şeylerin yazdığını gördüm. Bu şekilde hatamı buldum ve mezun oldum :D Teşekkür ederim yardımlarınıza.
 
bende aynı hatayı alıyorum o dizilim ile direnç değerlerini alabilirmiyim
 

Forum istatistikleri

Konular
128,247
Mesajlar
916,162
Kullanıcılar
450,056
Son üye
atas.27

Yeni konular

Geri
Üst