万年历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;

}

}

}