#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 时,又应该显示什么结果?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)