#include<reg52.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
uchar key_No[]={'1','2','3','4','5','6','7','8','9'};
sbit RS=P2^4; //寄存器选择位
sbit RW=P2^0; //读写选择位
sbit E=P2^3; //使能信号位
uchar tmp; //暂存P2的值
uchar keynum;
void display();
//毫秒级延时
void delay(uint z)
{
uint x, y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void keyscan()
{
P3=0xfe; //扫描第1行
if(P1!=0xff) //有按键按下
{
tmp = P3;
delay(5);
if(P1!=0xff) //延时后确定有按键按下
{
switch(tmp)
{
case 0xfe: keynum=1;break; //第1行第1个按键按下
case 0xfd: keynum=2;break; //第1行第2个按键按下
case 0xfb: keynum=3;break; //第1行第3个按键按下
case 0xf7: keynum=4;break; //第1行第4个按键按下
case 0xef: keynum=5;break; //第1行第5个按键按下
}
while(tmp!=0xff) //等待按键松手
{
tmp=P1;////?????????????????????????????
display();
}
}
}
delay(5);
P3=0xfd; //扫描第2行
if(P1!=0xff) //有按键按下
{
tmp = P1;
delay(5);
if(P1!=0xff) //延时后确定有按键按下
{
switch(tmp)
{
case 0xfe: keynum=9; break; //第2行第1个按键按下
case 0xfd: keynum=10;break; //第2行第2个按键按下
case 0xfb: keynum=11;break; //第2行第3个按键按下
case 0xf7: keynum=12;break; //第2行第4个按键按下
case 0xef: keynum=13;break; //第2行第5个按键按下
}
while(tmp!=0xff)
{
tmp=P1;
display();
}
}
}
delay(5);
P3=0xfb; //扫描第3行
if(P1!=0xff) //有按键按下
{
tmp = P1;
delay(5);
if(P1!=0xff) //延时后确定有按键按下
{
switch(tmp)
{
case 0xfe: keynum=17;break; //第3行第1个按键按下
case 0xfd: keynum=18;break; //第3行第2个按键按下
case 0xfb: keynum=19;break; //第3行第3个按键按下
case 0xf7: keynum=20;break; //第3行第4个按键按下
case 0xef: keynum=21;break; //第3行第5个按键按下
}
while(tmp!=0xff)
{
tmp=P1;
display();
}
}
}
delay(5);
P3=0xf7; //扫描第4行
if(P1!=0xff) //有按键按下
{
tmp = P1;
delay(5);
if(P1!=0xff) //延时后确定有按键按下
{
switch(tmp)
{
case 0xfe: keynum=25;break; //第4行第1个按键按下
case 0xfd: keynum=26;break; //第4行第2个按键按下
case 0xfb: keynum=27;break; //第4行第3个按键按下
case 0xf7: keynum=28;break; //第4行第4个按键按下
case 0xef: keynum=29;break; //第4行第5个按键按下
}
while(tmp!=0xff)
{
tmp=P1;
display();
}
}
}
delay(5);
P3=0xef; //扫描第5行
if(P1!=0xff) //有按键按下
{
tmp = P1;
delay(5);
if(P1!=0xff) //延时后确定有按键按下
{
switch(tmp)
{
case 0xfe: keynum=33;break; //第5行第1个按键按下
case 0xfd: keynum=34;break; //第5行第2个按键按下
case 0xfb: keynum=35;break; //第5行第3个按键按下
case 0xf7: keynum=36;break; //第5行第4个按键按下
case 0xef: keynum=37;break; //第5行第5个按键按下
}
while(tmp!=0xff)
{
tmp=P2;
display();
}
}
}
delay(5);
}
void Write_com(uchar com)
{
// while(BusyTest()==1);
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(写指令时,E为高脉冲) 就是让E从0到1发生正跳变,所以应先置"0"
P0=com; //将数据送入P0口,即写入指令或地址
delay(1);
/*_nop_();
_nop_();
_nop_();
_ nop_();*/
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
//*********************写数据
void WriteData(uchar dat)
{
// while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //(写指令时,E为高脉冲)
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=dat; //将数据送入P0口,即将数据写入液晶模块
delay(1);
/*_nop_();
_nop_();
_nop_();
_ nop_();*/
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
//*******************初始化
void Init(void)
{
Write_com(0x30); //显示模式设置:16×1显示,5×7点阵,8位数据接口
Write_com(0x0c); //显示模式设置:显示开,无光标
Write_com(0x06); //显示模式设置:光标右移,
Write_com(0x01); //清屏幕指令,将以前的显示内容清除
}
void show()
{
uchar a;
Init();
Write_com(0x80);
for(a=0;a<9;a++)
{
WriteData( key_No[a]);
delay(1);
}
}
void main()
{
keyscan();
show(); //这里的显示是保存上一次的显示值
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
是的!
谢谢!
一周热门 更多>