Problem w zaprogramowaniu LCD na 89S52.

To forum jest dla wszystkich pasjonatów wiecznie młodych mikrokontrolerów '51. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
cristof_w
-
Posty: 66
Rejestracja: 24 sie 2006, 5:09

Problem w zaprogramowaniu LCD na 89S52.

Post autor: cristof_w » 31 mar 2007, 9:23

Witam.
Poniżej przedstawiam program w C do LCD, napisany w środowisku M-IDE, programowany Issprogr'iem z wykorzystaniem AT89S52.
Ogólnie na LCD coś się pokazuje, czasami jakieś bzdedy a czsami to czego żądam.
Czy ktoś z Was może to przetestować u siebie i sprawdzić jak to działa?
Ewentualnie co tutaj powinno byc poprawione i jak, żeby działało w 100% prawidłowo.
Jak uprościć ten program?
Pozdrawiam

Kod: Zaznacz cały

#pragma SMALL 
#include <8051.h> 
#include <stdio.h> 

//definicje znakow specjalnych dla wyswietlacza LCD 
char code CGRom[65]= 
{0xAA,0x55}; 

#define PORT P1 
#define LcdEnable P1_3 
#define LcdRead P1_0 
#define LcdReg P1_2 


//opoznienie wielokrotnosc 1ms 
void Delay(unsigned int time) 
{ 
unsigned int j; 
while (time >=1) 
{ 
for (j=0;j<20;j++); 
time--; 
} 
} 

//zapis bajtu do LCD 
void WriteByteToLcd(char X) 
{ 
LcdEnable=1; 
PORT |=0xF0; 
PORT &=(X | 0x0F); 

LcdEnable=0; 
LcdEnable=1; 
X<<=4; 
PORT |=0xF0; 
PORT &=(X | 0x0F); 

LcdEnable=0; 
Delay(1); 
} 


//zapis bajtu do rejestru kontrolnego LCD 
void WriteToLcdCtrlRegister(char X) 
{ 
LcdReg=LcdRead=0; //ustawienie sygnalow sterujacych 
WriteByteToLcd(X); 
} 

//zapis bajtu do pamieci obrazu 
void LcdWrite(char X) 
{ 
LcdReg=1; //ustawienie sygnalow sterujacych 
LcdRead=0; 
LcdEnable=1; 
WriteByteToLcd(X); 
} 

//czyszczenie ekranu LCD 
void LcdClrScr(void) 
{ 
WriteToLcdCtrlRegister(0x01); 
} 

//inicjalizacja wysiwetlacza LCD w trybie 4 bity 
void LcdInitialize(void) 
{ 
char i; 

Delay(15); 
P0=0x0F; //zerowanie linii LcdReg.LcdRead,LcdEnable 
for (i=0; i<3; i++) 
{ 
LcdEnable=1; //impuls na E 
PORT &=0x3F; //ustawienie wartosci inicjujacej 
LcdEnable=0; 
Delay(5); 
} 
LcdEnable=1; 
PORT &=0x2F; 
LcdEnable=0; 
Delay(1); 
WriteToLcdCtrlRegister(0x28); 
WriteToLcdCtrlRegister(0x08); 
WriteToLcdCtrlRegister(0x01); 
WriteToLcdCtrlRegister(0x06); 
WriteToLcdCtrlRegister(0x0C); 
} 

//ustawia kursor na wspolrzednych x,y 
void GotoXY(char x, char y) 
{ 
/* switch (y) 

{ 
case 0: 
x +=0x80; 
break; 
case 1: 
x +=0xC0; 
break; 
case 2: 
x +=0x94; 
break; 
case 3: 
x +=0xD4; 
break; 
}*/ 

WriteToLcdCtrlRegister(x); 
} 

//wyswietla tekst na wspolrzednych x,y 
void WriteTextXY(char x, char y, char *S) 
{ 
while (*S) 
{ 
GotoXY(x,y); 
LcdWrite(*S); 
x++; 
S++; 
if (x>19) 
{ 
x=0; 
y++; 
} 
} 
} 

//wyswietla tekst rozpoczynajac od aktualnego polozenia kursora 
void Writetext(char *S) 
{ 
while (*S) 
{ 
LcdWrite(*S); 
S++; 
} 
} 

//definiowanie znakow z tablicy CGRom 
void DefineSpecialCharacters(char *ptr) 
{ 
WriteToLcdCtrlRegister(0x40); 

while (*ptr !=0) 

{ 
LcdWrite(*ptr); 
ptr++; 
} 
WriteToLcdCtrlRegister(0x80); 
} 


//program glowny 
void main(void) 
{ 
char ix=1, iy=1, x, y, i=0; 
LcdInitialize(); 
DefineSpecialCharacters(&CGRom); 
while (1) 
{ 
WriteTextXY(x, y, " " ); 
if (ix ==1 ) x++; else x--; 
if (iy ==1 ) y++; else y--; 
if (x ==19 ) ix = 0; 
if (x ==0 ) ix = 1; 
if (y ==3 ) iy = 0; 
if (y ==0 ) iy = 1; 
WriteTextXY(x, y, "4444"); 
Delay(50); 
} 
}

-----
Kody źródłowe zamykami w tagi CODE. ZbeeGin
Ostatnio zmieniony 01 sty 1970, 1:00 przez cristof_w, łącznie zmieniany 1 raz.

ODPOWIEDZ