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, czsami 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.
Pozdrawiam
#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);
}
}
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, czsami 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.
Pozdrawiam
#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);
}
}