LCD1602液晶显示出现乱码,求高手解惑!急!!!谢谢 5
我是一名在校大学生。正在做毕业设计,是基于52单片机的。显示模块用到lcd1602模块。用霍尔元件产生脉冲使程序产生外部中断0,外部中断一次,液晶的显示的数字增加1.调试...
我是一名在校大学生。正在做毕业设计,是基于52单片机的。显示模块用到lcd1602模块。用霍尔元件产生脉冲使程序产生外部中断0,外部中断一次,液晶的显示的数字增加1.调试过程中,液晶屏就会出现乱码。不知道是程序问题,还是硬件问题。硬件方面我用PO口,没接上拉电阻。程序问题,我同学说可能是清屏时间不够长。我不知道是什么原因啊???就高手解释下。谢谢!!!
以下是液晶模块的.H程序:
#ifndef _LCD1602_H
#define _LCD1602_H
#define LCM_Data P0
#define uchar unsigned char
sbit lcden=P2^2;
sbit led=P2^1;
sbit lcdrs=P2^0;
sbit LCD_BZ = P0^7; //LCD忙标志位
//==========检测LCD忙状态==============//
void LCD_busy(void)
{
do
{
lcden = 0;
lcdrs = 0; //指令
led = 1; //读出
P0 = 0xff; //除P0口外,其它口不需要此句!!!
lcden = 1;
_nop_(); //高电平读出 延迟时间1us
}while(LCD_BZ); //LCD_BZ=1表示忙,LCD_BZ=0表示空闲
lcden = 0;
}
//===========写指令函数==============//
void write_1602com(uchar com)
{
LCD_busy(); //检测忙
lcdrs=0; //指令
led=0; //写入
lcden=0;
P0=com;
_nop_();
_nop_();
_nop_();
_nop_(); //传指令
lcden=1;
lcden=0; //下降沿有效
}
//===========写数据函数==============//
void write_1602(uchar date)
{
LCD_busy(); //检测忙
lcdrs=1; //数据
led=0; //写入
lcden=0;
P0=date; //传数据
_nop_();
_nop_();
_nop_();
_nop_();
lcden=1;
lcden=0; //下降沿有效
}
//========按规定显示字符串函数==============//
void display_1602(uchar y,uchar x,uchar const *s)
{
if(y==1)
write_1602com(0x80|x); //y=1时在第一行显示
if(y==2)
write_1602com(0xc0|x); //y=2时在第二行显示
while(*s)
{
write_1602(*s); //根据字符串逐个显示
s++;
}
}
//===========LCD1602初始化函数==============//
void init_1602()
{
lcden=0;
write_1602com(0x38);
write_1602com(0x38);
write_1602com(0x38);
write_1602com(0x38); //显示模式设置
write_1602com(0x08); //显示关闭
write_1602com(0x01); //显示清屏
write_1602com(0x06); //显示光标移动设置
write_1602com(0x0c); //显示开及光标设置
}
#endif 展开
以下是液晶模块的.H程序:
#ifndef _LCD1602_H
#define _LCD1602_H
#define LCM_Data P0
#define uchar unsigned char
sbit lcden=P2^2;
sbit led=P2^1;
sbit lcdrs=P2^0;
sbit LCD_BZ = P0^7; //LCD忙标志位
//==========检测LCD忙状态==============//
void LCD_busy(void)
{
do
{
lcden = 0;
lcdrs = 0; //指令
led = 1; //读出
P0 = 0xff; //除P0口外,其它口不需要此句!!!
lcden = 1;
_nop_(); //高电平读出 延迟时间1us
}while(LCD_BZ); //LCD_BZ=1表示忙,LCD_BZ=0表示空闲
lcden = 0;
}
//===========写指令函数==============//
void write_1602com(uchar com)
{
LCD_busy(); //检测忙
lcdrs=0; //指令
led=0; //写入
lcden=0;
P0=com;
_nop_();
_nop_();
_nop_();
_nop_(); //传指令
lcden=1;
lcden=0; //下降沿有效
}
//===========写数据函数==============//
void write_1602(uchar date)
{
LCD_busy(); //检测忙
lcdrs=1; //数据
led=0; //写入
lcden=0;
P0=date; //传数据
_nop_();
_nop_();
_nop_();
_nop_();
lcden=1;
lcden=0; //下降沿有效
}
//========按规定显示字符串函数==============//
void display_1602(uchar y,uchar x,uchar const *s)
{
if(y==1)
write_1602com(0x80|x); //y=1时在第一行显示
if(y==2)
write_1602com(0xc0|x); //y=2时在第二行显示
while(*s)
{
write_1602(*s); //根据字符串逐个显示
s++;
}
}
//===========LCD1602初始化函数==============//
void init_1602()
{
lcden=0;
write_1602com(0x38);
write_1602com(0x38);
write_1602com(0x38);
write_1602com(0x38); //显示模式设置
write_1602com(0x08); //显示关闭
write_1602com(0x01); //显示清屏
write_1602com(0x06); //显示光标移动设置
write_1602com(0x0c); //显示开及光标设置
}
#endif 展开
4个回答
展开全部
你把跟lcd数据连接的一些外设都去掉 程序的话
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//这三个引脚参考资料
sbit LCD1602_EN=P2^7; //1602使能引脚
sbit LCD1602_RW=P2^6; //1602读写引脚
sbit LCD1602_RS=P2^5; //1602数据/命令选择引脚
/********************************************************************
* 名称 : LCD1602_delay()
* 功能 : 延时,延时时间大概为5US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LCD1602_delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void LCD1602_Delay(uint i)
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : bit Busy(void)
* 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
bit Busy(void)
{
bit busy_flag = 0;
LCD1602_RS = 0;
LCD1602_RW = 1;
LCD1602_EN = 1;
LCD1602_delay();
busy_flag = (bit)(P0 & 0x80);
LCD1602_EN = 0;
return busy_flag;
}
/********************************************************************
* 名称 : LCD1602_wcmd(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void LCD1602_wcmd(uchar del)
{
while(Busy());
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_EN = 0;
LCD1602_delay();
P0 = del;
LCD1602_delay();
LCD1602_EN = 1;
LCD1602_delay();
LCD1602_EN = 0;
}
/********************************************************************
* 名称 : LCD1602_wdata(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void LCD1602_wdata(uchar del)
{
while(Busy());
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_EN = 0;
LCD1602_delay();
P0 = del;
LCD1602_delay();
LCD1602_EN = 1;
LCD1602_delay();
LCD1602_EN = 0;
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LCD1602_init(void)
{
LCD1602_wcmd(0x38);//设置16X2显示
LCD1602_wcmd(0x08);//关显示
LCD1602_wcmd(0x0c);//开显示
LCD1602_wcmd(0x0e);//开显示显示光标
LCD1602_wcmd(0x0f);//开显示显示光标光标闪烁
LCD1602_wcmd(0x06);//写入指针加一
LCD1602_wcmd(0x04);//写入指针减一
// LCD1602_wcmd(0x07);//写入整屏左移
// LCD1602_wcmd(0x05);//写入整屏右移
LCD1602_wcmd(0x01);//清屏
//LCD1602_wcmd(0x80+0X10);
}
/********************************************************************
* 名称 : LCD1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void LCD1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
LCD1602_wcmd(a);
LCD1602_wdata(sign);
}
/********************************************************************
* 名称 : LCD1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void LCD1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a,b=0;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
while(1)
{
LCD1602_wcmd(a++);
if((*p == '\0')||(b==16)) break;
b++;
LCD1602_wdata(*p);
p++;
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
LCD1602_Delay(30);
LCD1602_init();
LCD1602_string(1,1," Welcome To ");
LCD1602_string(2,1," The MCU World ");
LCD1602_char(1,1,'*');
LCD1602_char(1,16,'*');
while(1);
}
试试这个 有用请给好评
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//这三个引脚参考资料
sbit LCD1602_EN=P2^7; //1602使能引脚
sbit LCD1602_RW=P2^6; //1602读写引脚
sbit LCD1602_RS=P2^5; //1602数据/命令选择引脚
/********************************************************************
* 名称 : LCD1602_delay()
* 功能 : 延时,延时时间大概为5US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LCD1602_delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void LCD1602_Delay(uint i)
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : bit Busy(void)
* 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
bit Busy(void)
{
bit busy_flag = 0;
LCD1602_RS = 0;
LCD1602_RW = 1;
LCD1602_EN = 1;
LCD1602_delay();
busy_flag = (bit)(P0 & 0x80);
LCD1602_EN = 0;
return busy_flag;
}
/********************************************************************
* 名称 : LCD1602_wcmd(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void LCD1602_wcmd(uchar del)
{
while(Busy());
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_EN = 0;
LCD1602_delay();
P0 = del;
LCD1602_delay();
LCD1602_EN = 1;
LCD1602_delay();
LCD1602_EN = 0;
}
/********************************************************************
* 名称 : LCD1602_wdata(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void LCD1602_wdata(uchar del)
{
while(Busy());
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_EN = 0;
LCD1602_delay();
P0 = del;
LCD1602_delay();
LCD1602_EN = 1;
LCD1602_delay();
LCD1602_EN = 0;
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LCD1602_init(void)
{
LCD1602_wcmd(0x38);//设置16X2显示
LCD1602_wcmd(0x08);//关显示
LCD1602_wcmd(0x0c);//开显示
LCD1602_wcmd(0x0e);//开显示显示光标
LCD1602_wcmd(0x0f);//开显示显示光标光标闪烁
LCD1602_wcmd(0x06);//写入指针加一
LCD1602_wcmd(0x04);//写入指针减一
// LCD1602_wcmd(0x07);//写入整屏左移
// LCD1602_wcmd(0x05);//写入整屏右移
LCD1602_wcmd(0x01);//清屏
//LCD1602_wcmd(0x80+0X10);
}
/********************************************************************
* 名称 : LCD1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void LCD1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
LCD1602_wcmd(a);
LCD1602_wdata(sign);
}
/********************************************************************
* 名称 : LCD1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void LCD1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a,b=0;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
while(1)
{
LCD1602_wcmd(a++);
if((*p == '\0')||(b==16)) break;
b++;
LCD1602_wdata(*p);
p++;
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
LCD1602_Delay(30);
LCD1602_init();
LCD1602_string(1,1," Welcome To ");
LCD1602_string(2,1," The MCU World ");
LCD1602_char(1,1,'*');
LCD1602_char(1,16,'*');
while(1);
}
试试这个 有用请给好评
2012-08-09
展开全部
我前一阵子出现乱码了,发现的问题是你送的数据其实是ascII码,当我显示一个数字时,其实现实的是他所对应的ascii码,不知道楼主是不是也是这个问题,比如你要现实1,你送的数据应该是48+1,你要现实字母,比如a,应该送的数据是97,A对应的是65,不知道有没有帮助到你
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你好,麻烦问一下,您的这个问题解决了吗?我现在也在做LCD1602的显示,板子是自己设计自己焊的。和你出的问题完全是一样啊!!!!!!!您解决了吗?求赐教啊!!!我快被逼疯了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |