万年历51单片机LCD1602不显示是什么原因?
#定义?LCD1602_FLAG
#定义?LCD 1602 _端口?p0蛋白
# include & ltreg 51 . h & gt;
# include & ltstddef.h & gt
#定义?乌恰尔?未签名?茶
sbit?lcd1602_rs=p2^0;
sbit?lcd1602_e=p2^2;
sbit?lcd1602_rw=p2^1;
sbit?lcd1602_busy=p0^7;
乌恰尔?str[]= "这个?是吗?钥匙?测试”;
乌恰尔?keyval,keystr[16];
作废?延迟(uchar?答
{
乌恰尔?我;
而(a-)for(I = 0;我& lt120;i++);
}
/*
************************************
*?函数名:lcd1602_CheckBusy()
*?功能函数:状态查询
************************************
*/
作废?lcd1602_CheckBusy()
{
做
{
LCD 1602 _ busy = 1;
LCD 1602 _ RS = 0;
LCD 1602 _ rw = 1;
LCD 1602 _ e = 0;
LCD 1602 _ e = 1;
}
while(LCD 1602 _ busy);
}
/*
***************************************
*?函数名:?lcd1602_WriteCmd()
*?功能函数:写命令
*?入口参数:命令字
*?导出参数:无
***************************************
*/
作废?lcd1602_WriteCmd(const?乌恰尔?cmd)
{
LCD 1602 _ check busy();
LCD 1602 _ RS = 0;
LCD 1602 _ rw = 0;
LCD 1602 _ e = 1;
LCD 1602 _ PORT = cmd;
LCD 1602 _ e = 0;
}
/*
*******************************************
*?函数名:lcd1602_WriteData()
*?功能函数:写入数据
*?入口参数:c-要写入的数据。
*?导出参数:无
*********************************************
*/
作废?lcd1602_WriteData(const?乌恰尔?c)
{
LCD 1602 _ check busy();
LCD 1602 _ RS = 1;
LCD 1602 _ rw = 0;
LCD 1602 _ e = 1;
LCD 1602 _ PORT = c;
LCD 1602 _ e = 0;
}
/*
***********************************************
*?函数名:lcd1602_Init()
*?函数Function:初始化LCD
*?入口参数:无
*?导出参数:无
***********************************************
*/
作废?lcd1602_Init()
{
LCD 1602 _ write cmd(0x 38);//显示模式为8位2行5*7点阵。
LCD 1602 _ write cmd(0x0c);?//显示?启用,标志?启用,flash?启用,
LCD 1602 _ write cmd(0x 06);?//标志?搬家?去哪?对吧,屏幕?不要?移动
LCD 1602 _ write cmd(0x 01);?//清除?屏幕
}
/*
************************************************
*?函数名称:lcd1602_Display()
*?功能作用:?信息显示
*?入口参数:ptr -字符或字符串指针
*?导出参数:无
*?描述:用户可以通过以下方式调用它:
*?1)lcd1602_Display("你好,世界!");
*?2)?INT8U?存储类型?Txt[]= "要显示的字符串";
*或者?INT8U?存储类型?txt[]={'t ',' x ',' t ',..,'\0'};
*INT8U?* ptr
* ptr = & amptxt
* LCD 1602 _显示(ptr);
*或者?LCD 1602 _ Display(txt);
*或者?LCD 1602 _ Display(& amp;txt);
************************************************
*/
作废?lcd1602_Display(const?乌恰尔?*ptr,uchar?线)
{
乌恰尔?数据?I = 0;
乌恰尔?*数据?q;
q = ptr
开关(线路)
{
案子?0:
LCD 1602 _ write cmd(0x 80);
而(q!=NULL?& amp& amp?(*q!='\0')?& amp& amp?我& lt16)
{
LCD 1602 _ WriteData(* q);
q++;
i++;
}
打破;
案子?1:
LCD 1602 _ write cmd(0xc 0);
而(q!=NULL?& amp& amp?(*q!='\0')?& amp& amp?我& lt16)
{
LCD 1602 _ WriteData(* q);
q++;
i++;
}
打破;
}
}
乌恰尔?kbscan(无效)
{
未签名?夏尔?sccode,recode
P3 = 0x0f;//发送0扫描,列线输入
如果?((P3?& amp?0x0f)?!=?0x0f)//有一个键被按下。
{
延迟(20);?//延迟去抖动
如果?((P3 & amp;0x0f)!=?0x0f)
{
sccode?=?0xef//逐行扫描初始值
while((sc code & amp;0x01)!=0)
{
P3 = sc code;
如果((P3 & amp;0x0f)!=0x0f)
{
recode =(P3 & amp;0x0f)| 0xf 0;
而((P3 & amp;0x0f)!= 0x0f);//等待密钥被提出。
return((~ sc code)+(~ recode));
?}
其他
sc code =(sc code & lt;& lt1)| 0x 01;
}
}
}
回归?0;//没有按键,返回0。
}
乌恰尔?getkey(void)
{
乌恰尔?关键;
key = kbs can();
if(key = = 0){ key val = 0x ff;return(0);}
开关(钥匙)
{
案子?0x 11:keyval = 7;打破;
案子?0x 12:keyval = 4;打破;
案子?0x 14:keyval = 1;打破;
案子?0x 18:keyval = 10;打破;
案子?0x 21:keyval = 8;打破;
案子?0x 22:keyval = 5;打破;
案子?0x 24:keyval = 2;打破;
案子?0x 28:keyval = 0;打破;
案子?0x 41:keyval = 9;打破;
案子?0x 42:keyval = 6;打破;
案子?0x 44:keyval = 3;打破;
案子?0x 48:key val = 11;打破;
案子?0x 81:keyval = 12;打破;
案子?0x 82:key val = 13;打破;
案子?0x 84:key val = 14;打破;
案子?0x 88:key val = 15;打破;
默认值:keyval = 0xff打破;
}
如果(keyval!=0xff)返回(1);
不然呢?return(0);
}
主()
{
乌恰尔?num
LCD 1602 _ Init();
lcd1602_Display(str,0);
while(1)
{
if(getkey())
{
if(keyval & lt;10)keystr[num]= keyval+0x 30;
不然呢?keystr[num]= keyval-10+' A ';
lcd1602_Display(keystr,1);
num++;
num % = 16;
}
}
}