LCD1602液晶显示出现乱码,如何解决?

LCD1602液晶显示出现乱码,如何解决?,第1张

你把跟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=0j<ij++)

for(x=0x<=148x++)

}

/********************************************************************

* 名称 : 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)

}

试试这个 有用请给好评

估计是初始化没做好,时序不对,考虑到你之前是没问题的,应该是工作不稳定,很有可能是你写的代码的时序太快,造成LCD工作不稳定。

建议在写指令的时候多加一些短延时,每一个CLK时钟信号之间都加一些短延时(这是最主要的),很短的延时就可以了。

我之前也遇到过这些问题,基本加了延时之后工作就很稳定了,现在的1602质量参差不齐,不同模块的工作速度都有很大误差。这些东西仿真是仿不出来的,只能自己慢慢调试

初始化时,LCD 内部的 *** 作,需要较长的时间。

void init()

{

lcden = 0

write_com(0x38)delay(50)//应该加上延时

write_com(0x0e)delay(50)

write_com(0x06)delay(50)

}

试试看。

----

另外,最终仅仅是显示三位数,计算过程,弄的,就太复杂了。

理论上:

当 ad = 255 时,应该显示什么结果?

当 ad = 0 时,又应该显示什么结果?


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11409344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存