哪位大侠来解救小弟啊?1602液晶问题

[复制链接]
2649|4
 楼主| flyqqm 发表于 2010-4-4 20:42 | 显示全部楼层 |阅读模式
我编写的一个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);
}
qufo 发表于 2010-4-5 12:34 | 显示全部楼层
可能延时不够吧。
tcc8073 发表于 2010-4-5 12:56 | 显示全部楼层
访问的时候要查询LCD的忙信号,LCD不忙的时候才可以进行操作
hyg1984 发表于 2010-4-5 13:39 | 显示全部楼层
_nop_只有1us,可能不够,建议看时序图!忙信号也没有检测
adofu2008 发表于 2010-4-5 21:19 | 显示全部楼层
时序不对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部