标题: 我的1602跑不起来,帮我看看 [打印本页]

作者: newchp    时间: 2010-6-10 13:59
标题: 我的1602跑不起来,帮我看看

看看我的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');
 }
}


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

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

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


作者: newchp    时间: 2010-6-10 21:33
好           谢谢
作者: newchp    时间: 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);//显示开关控制指令,显示器开,光标开,光标闪烁
}


作者: newchp    时间: 2010-6-10 22:06

把下面的改成5000也不行。

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


作者: laibu88    时间: 2010-8-5 10:18

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






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1