找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 930|回复: 3
打印 上一主题 下一主题
收起左侧

为什么1602液晶一行白

[复制链接]
跳转到指定楼层
楼主
ID:871134 发表于 2020-12-30 18:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


#include<reg52.h>
#include<intrins.h>  //包含_nop_()函数的头文件
sbit RS=P2^0;  //将RS定义为P2^0
sbit RW=P2^1;  //将RW定义为P2^1
sbit E=P2^2; //将E定义为P2^2
sbit BF=P0^7; //将BF定义为P0^7
unsigned char code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义字符℃

/************************************
函数功能:1ms基准延时
入口参数:n
************************************/

void delay1ms(unsigned int n )
{
unsigned char i;
while(n--)
  for(i=0;i<115;i++);
}
/************************************
函数功能:判断液晶的忙碌状态
返回值:result=1,忙碌;result=0,不忙
************************************/
bit BusyTest()
{
bit result;
RS=0;  //读状态时,RS=0,RW=1,E=1
RW=1;
E=1;
_nop_(); //延时一个时钟周期
_nop_();
_nop_();
_nop_(); //4个周期延时,给硬件反应时间
result=BF;
E=0;  //将E置0,不允许读
return result;
}
/************************************
函数功能:将模式设置指令或显示地址送入液晶
入口参数:dictate
************************************/
void Write_com(unsigned char dictate)
{
while(BusyTest()==1);  //如果忙就等待
RS=0;      //写指令时,RS=0.RW=0,E=负跳变
RW=0;
E=1;   //先将E拉高
_nop_();  
_nop_();     //给硬件反应时间
P0=dictate; //将数据送入P0口,即指令或地址
_nop_();
_nop_();
_nop_();
_nop_();    //反应时间
E=0;     //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/************************************
函数功能:指定字符显示的实际地址
入口参数:x
************************************/
void WriteAddress(unsigned char x)
{
Write_com(x|0x80);   //显示位置的确定方法为“0x80+地址码x”
}
/************************************
函数功能:将数据(ASKII码)写入液晶模块
入口参数:y(字符常量)
************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1); //如果忙碌就等待
RS=1;       //写数据时RS=1,RW=0,E=负跳变
RW=0;
E=1;    //先将E拉高
P0=y;
_nop_();
_nop_();
_nop_();
_nop_();  //反应时间
E=0;     //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/************************************
函数功能:对LCD的显示模式进行初始化
************************************/
void LcdInt()
{
delay1ms(15);    //首次写指令时给LCD一段较长的反应时间
Write_com(0x38);   //显示模式设置:16X2显示,5X7点阵,8位数据总线
delay1ms(5);
Write_com(0x38);
delay1ms(5);
Write_com(0x38);
delay1ms(5);     //3次写 设置模式
Write_com(0x0f); //显示模式设置:显示开,有光标,光标闪烁
delay1ms(5);
Write_com(0x06);  //显示模式设置:光标右移,字符不移
delay1ms(5);
Write_com(0x01);  //清屏
delay1ms(5);

}
//主函数
void main()
{
unsigned char i,j;
LcdInt();   //调用LCD初始化函数
delay1ms(10);
while(1)
{

        Write_com(0x01); // 清屏
        delay1ms(5);

        Write_com(0x40);   //设置CGRAM地址,索引值为(0x00 ~ 0x07),建立好字模后,往ddram中写索引0x00,新建的字符就会显示出来。
        delay1ms(5);
        for(j=0;j<15;j++)
        {
                WriteData(User[j]); //写入℃
                delay1ms(5);
        }

        WriteAddress(0x05);  //设定屏幕上的显示位置
        WriteData(0x00); //因为执行过Write_com(0x40),默认从CGRAM取出℃
        delay1ms(1000);

}
}

仿真可以但是实物不行
想请大伙看看程序有什么问题
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:814525 发表于 2020-12-31 08:59 | 只看该作者
E=1与E=0 之间 4个_nop_()可能时间不够。多加写nop或者用延时函数Delay3us();
回复

使用道具 举报

板凳
ID:213173 发表于 2020-12-31 09:54 | 只看该作者
软件都是基于硬件基础上编写的。仿真正常实物不行多数是硬件问题。如果选用的是51内核1T单片机,延时函数就要改写。
回复

使用道具 举报

地板
ID:390416 发表于 2020-12-31 10:26 | 只看该作者
这是我分享到51hei的贴子 关于LCD1602液晶的。使用STC增强型单片机。可以兼容STC89。你可以看看。
http://www.51hei.com/bbs/dpj-200685-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表