我编写的一个1602液晶,照着书上编的一个,原理都知道,接线是数据线接P2,RS,RW,EN分别是P1^0,P1^1,P1^2。
我用的是在线SST仿真,外部晶振是11.0592MH,可是连清屏都没有反应,一直显示一行黑,请大侠们指点,感激不尽:) 。
程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Data P2
#define by 0xff
sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
sbit lcden=P1^2;
void Daley5ms()
{
uint i=5552;
while(i--) ;
}
void Daley400ms()
{
uchar i=5;
uint j;
while(i--)
{
j=7269;
while(j--) ;
};
}
/*void WaitEnable()
{
Data=0xff;
lcdrs=0;
lcdrw=1;
_nop_();
lcden=1;
_nop_();
_nop_();
while(Data&by); //why??
lcden=0;
} */
void WriteCommand(uchar com,uchar attribc)
{
// if(attribc)
// WaitEnable();
lcdrs=0;
lcdrw=0;
_nop_();
Data=com;
_nop_();
lcden=1;
_nop_();
_nop_();
lcden=0;
}
void LocateXY(char posx,char posy)
{
uchar temp;
temp=posx&0xf;
posy&=0x1;
if(posy)
temp|=0x04;
temp|=0x08;
WriteCommand(temp,1);
}
void WriteData(char dataw)
{
// WaitEnable();
lcdrs=1;
lcdrw=0;
_nop_();
Data=dataw;
_nop_();
lcden=1;
_nop_();
_nop_();
lcden=0;
}
void LcdReset()
{
WriteCommand(0x38,0);
Daley5ms();
WriteCommand(0x38,0);
Daley5ms();
WriteCommand(0x38,0);
Daley5ms();
WriteCommand(0x38,1);
WriteCommand(0x08,1);
WriteCommand(0x01,1);
WriteCommand(0x06,1);
WriteCommand(0x0c,1);
}
void WriteLocateChar(uchar x,uchar y,uchar wdata)
{
LocateXY(x,y);
WriteData(wdata);
}
void main()
{
void LcdReset();
WriteCommand(0x01,1);
while(1);
} |