找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我的1602跑不起来,帮我看看

[复制链接]
跳转到指定楼层
楼主
ID:16763 发表于 2010-6-10 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

看看我的LCD咱跑不起来,正常情况是要显示A的,结果什么也不显示。

《非原创,是摘录书的》

#include< at89x51.h>
#include< intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define DATA_PORT P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
/*********************************************************************
funciton:delay
*********************************************************************/
void DELAYms(uint i)
{   while(--i);
}
/*********************************************************************
function:check busy
*********************************************************************/
void CHECK_BUSY()
{   DATA_PORT=0xFF;
    RS=0;
 RW=1;
 _nop_();
 EN=1;
 _nop_();
 _nop_();
 while(DATA_PORT&0x80);
 EN=0;
}
/*以下是向LCD写入命令IR
功能:向LCD写入命令字符CMD
若check=1,表示要进行忙状态检查*/
void WRITE_IR(uchar cmd,uchar check)
{   if(check)
        CHECK_BUSY();
 RS=0;
 RW=0;
 _nop_();
 DATA_PORT=cmd;
 _nop_();
 EN=1;
 _nop_();_nop_();
 EN=0;
}
/*以下是写入DDR寄存器
功能:在当前光标处显示一个字符*/
void WRITE_DDR(char c)
{   CHECK_BUSY();
    RS=1;
 RW=0;
 _nop_();
 DATA_PORT=c;
 _nop_();
 EN=1;
 _nop_();_nop_();
 EN=0;
}
/*以下是定位光标
功能:光标定位*/
void LCD_POSITION(uchar xpos,uchar ypos)
{   uchar temp;
    xpos=xpos&0x0f;//16**型液晶的范围是0--15
 ypos=ypos&0x01;//16**型液晶的范围是0--1
 temp=xpos;
 if(ypos==1)
     temp=temp|0xc0;//第二行
 else
     temp=temp|0x80;//第一行
 WRITE_IR(temp,0);
}
/*以下是初使化函数
功能:向LCD模块写入控制参数*/
void LCD_INITIAL()
{   WRITE_IR(0x38,0);//功能指令设置,8位接口,2行,5*7字符
 WRITE_IR(0x38,1);
 WRITE_IR(0x08,1);//显示开关控制指令,显示关闭
 WRITE_IR(0x01,1);//清屏指令,将DDRAM数据全部写入空白
 WRITE_IR(0x06,1);//输入方式设置指令,字符不动,光标自动右移一格
 WRITE_IR(0x0F,1);//显示开关控制指令,显示器开,光标开,光标闪烁
}
//以下是在指定行,指定列显示字符
void WRITE_CHAR(uchar xpos,uchar ypos,char c)
{   LCD_POSITION(xpos,ypos);
    WRITE_DDR(c);
}
//************************************************************************
//************************************************************************
void main()
{   LCD_INITIAL();
    DELAYms(6000);
 while(1)
 {   WRITE_CHAR(5,0,'A');
 }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:23004 发表于 2010-6-10 20:55 | 只看该作者
LCD显示最常用调试方法,首先检测硬件连接是否正确,各电平有没有达到要求;其次确定背光是否可以正常开和关;到第三步才开始检测是否可以显示。。。。。。。在开始显示之前,要记得初始化相关的LCD参数。。。(这只是俺的一些小见解,不适用就别用哦)
回复

使用道具 举报

板凳
ID:23004 发表于 2010-6-10 21:14 | 只看该作者

再给你个1602的对比看看啥问题吧

以下是引用brantyou在2010-6-10 21:10:22的发言:
可惜没有数码管的那个代码,只有一个1602显示的,还有温度的,给你上传上来看看吧!!!!
 下载信息  [文件大小:63.3 KB  下载次数:0]
图片点击可在新窗口打开查看点击浏览该文件:1602液晶+温度+万年历.rar

回复

使用道具 举报

地板
ID:16763 发表于 2010-6-10 21:33 | 只看该作者
好           谢谢
回复

使用道具 举报

5#
ID:16763 发表于 2010-6-10 22:05 | 只看该作者

我测了,各信号连接都正常。背光一直是亮的

我把下面红色改成1也不能正常显示

void LCD_INITIAL()
{   WRITE_IR(0x38,0);//功能指令设置,8位接口,2行,5*7字符
 WRITE_IR(0x38,1);
 WRITE_IR(0x08,1);//显示开关控制指令,显示关闭
 WRITE_IR(0x01,1);//清屏指令,将DDRAM数据全部写入空白
 WRITE_IR(0x06,1);//输入方式设置指令,字符不动,光标自动右移一格
 WRITE_IR(0x0F,1);//显示开关控制指令,显示器开,光标开,光标闪烁
}

回复

使用道具 举报

6#
ID:16763 发表于 2010-6-10 22:06 | 只看该作者

把下面的改成5000也不行。

/*********************************************************************
funciton:delay
*********************************************************************/
void DELAYms(uint i)
{   while(--i);
}

回复

使用道具 举报

7#
ID:11238 发表于 2010-8-5 10:18 | 只看该作者

显示一个A要那么复杂的程序吗?不要吓我啊

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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