这个是我编的1602的显示,跪求大神指点。谢谢。
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
uchar key_No[]={'1','2','3','4','5','6','7','8','9'};
sbit RS=P2^4; //寄存器选择位
sbit RW=P2^0; //读写选择位
sbit E=P2^3; //使能信号位
void delay(uint z)
{
uchar i,j;
for(i=z;i>0;i--);
for(j=110;j>0;j--);
}
//********************写指令
void Write_com(uchar com)
{
// while(BusyTest()==1);
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(写指令时,E为高脉冲)
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=com; //将数据送入P0口,即写入指令或地址
delay(1);
/*_nop_();
_nop_();
_nop_();
_ nop_();*/
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
//*********************写数据
void WriteData(uchar dat)
{
// while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //(写指令时,E为高脉冲)
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=dat; //将数据送入P0口,即将数据写入液晶模块
delay(1);
/*_nop_();
_nop_();
_nop_();
_ nop_();*/
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
//*******************初始化
void Init(void)
{
Write_com(0x30); //显示模式设置:16×1显示,5×7点阵,8位数据接口
Write_com(0x0c); //显示模式设置:显示开,无光标
Write_com(0x06); //显示模式设置:光标右移,
Write_com(0x01); //清屏幕指令,将以前的显示内容清除
}
//*******************主函数
void main(void)
{
uchar a;
Init();
Write_com(0x80);
for(a=0;a<9;a++)
{
WriteData(uchar key_No[a]);
delay(1);
}
}
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
uchar key_No[]={'1','2','3','4','5','6','7','8','9'};
sbit RS=P2^4; //寄存器选择位
sbit RW=P2^0; //读写选择位
sbit E=P2^3; //使能信号位
void delay(uint z)
{
uchar i,j;
for(i=z;i>0;i--);
for(j=110;j>0;j--);
}
//********************写指令
void Write_com(uchar com)
{
// while(BusyTest()==1);
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(写指令时,E为高脉冲)
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=com; //将数据送入P0口,即写入指令或地址
delay(1);
/*_nop_();
_nop_();
_nop_();
_ nop_();*/
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
//*********************写数据
void WriteData(uchar dat)
{
// while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //(写指令时,E为高脉冲)
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=dat; //将数据送入P0口,即将数据写入液晶模块
delay(1);
/*_nop_();
_nop_();
_nop_();
_ nop_();*/
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
//*******************初始化
void Init(void)
{
Write_com(0x30); //显示模式设置:16×1显示,5×7点阵,8位数据接口
Write_com(0x0c); //显示模式设置:显示开,无光标
Write_com(0x06); //显示模式设置:光标右移,
Write_com(0x01); //清屏幕指令,将以前的显示内容清除
}
//*******************主函数
void main(void)
{
uchar a;
Init();
Write_com(0x80);
for(a=0;a<9;a++)
{
WriteData(uchar key_No[a]);
delay(1);
}
}
不知道你要问什么?
E=0; //E置低电平(写指令时,E为高脉冲)
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=com; //将数据送入P0口,即写入指令或地址
delay(1);
/*_nop_();
这里吧!
编译时有“syntax error near ‘’unsigned”。我找不到问题在哪。
没错啊!哪里有问题呢?
把这句WriteData(uchar key_No[a]);
改为WriteData(key_No[a]);
是这里,谢谢!
哦,以为是时序的错误。这里吧,应该把那个E = 0去掉。不知道你仿真有警告没。
好好好
不用啊,没有警告!使能端要有上升沿,才能进行写入操作啊。所以E要先等于0吧。
不用啊,没有警告!使能端要有上升沿,才能进行写入操作啊。所以E要先等于0吧。
下降沿!我确定一定以及肯定!
我才反应过来,那个protues仿真。仿真里面会提示,逻辑问题,比如没有忙检测啊,还有逻辑不准确啊等等!
欢迎来试试哈!
嗯。我用protues仿真了,这个程序可以运行,没有看到提示!
我查了书,郭天祥的51单片机,151页。“给E一个高脉冲将数据送入液晶控制器。”你可以看看!
欢迎常来proteus板块!