51单片机的问题:为什么键盘摁下液晶就显示了?
我把keyscan()的值赋给temp1,然后我用if语句当0<=temp1<=10时才可以被液晶打印出来,可是无论我摁下什么液晶都有可以显示出来,求大神帮忙,谢谢!!!...
我把keyscan()的值赋给temp1,然后我用if语句当0<=temp1<=10时才可以被液晶打印出来,可是无论我摁下什么液晶都有可以显示出来,求大神帮忙,谢谢!!!
(液晶D0~D7接P1口矩阵,键盘接P2口)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Rs=P3^3;
sbit Rw=P3^4;
sbit E =P3^5;
uchar code table1[]="password:";
uchar table2[]="0123456789abcdefg";
uchar temp1,num;
void init();
uchar keyscan();
void Lcd_com(uchar com_l); //液晶写指令
void Lcd_data(uchar dat_l); //液晶写数据
void delay(uint aa);
void main()
{
init(); //初始化
Lcd_com(0x01);
Lcd_com(0x80);
for(num=0;num<9;num++) //打印table1[]
{
Lcd_data(table1[num]);
delay(10);
}
num=1;
while(num!=0)
{
temp1=keyscan();
if(0<temp1<10) //纠结的地方
{
Lcd_com(0x80+0x40+num);
Lcd_data(table2[temp1]);
delay(10);
}
num++;
}
}
void init()
{
E=0;
Rw=0;
Rs=0;
Lcd_com(0x38);
Lcd_com(0x0c);
Lcd_com(0x06);
Lcd_com(0x01);
}
uchar keyscan()
{
uchar numk;
uchar key_lie; //存储列的变量
uchar key_hang;
uchar key;
bit flag_key;
flag_key=0;
while(flag_key==0)
{
key=0xff;
P2=0xf0; //1111 0000,行为低电平,列为高电平
key_lie=P2;
key_lie=key_lie&0xf0;
if(key_lie!=0xf0)
{
delay(10);
if(key_lie!=0xf0)
{
key_lie=P2; //读取最新的P2值
key_lie=key_lie&0xf0; //得到最新的列的信息
P2=0x0f; //0000 1111,列为低电平,行为高电平
key_hang=P2; //读取P2口
key_hang=key_hang&0x0f;
key=key_hang|key_lie;
}
while(P2!=0x0f);
}
switch(key)
{
case 0xee: numk=0; flag_key=1;break; //0xee=1110 1110 说明第一个按键被按下,则num的值为0;
case 0xde: numk=1; flag_key=1;break;
case 0xbe: numk=2; flag_key=1;break;
case 0x7e: numk=3; flag_key=1;break;
case 0xed: numk=4; flag_key=1;break;
case 0xdd: numk=5; flag_key=1;break;
case 0xbd: numk=6; flag_key=1;break;
case 0x7d: numk=7; flag_key=1;break;
case 0xeb: numk=8; flag_key=1;break;
case 0xdb: numk=9; flag_key=1;break;
case 0xbb: numk=10; flag_key=1;break;
case 0x7b: numk=11; flag_key=1; break;
case 0xe7: numk=12; flag_key=1; break;
case 0xd7: numk=13; flag_key=1; break;
case 0xb7: numk=14; flag_key=1; break;
case 0x77: numk=15; flag_key=1; break;
}
}
return numk;
}
void Lcd_com(uchar com_l)//写指令
{
Rs=0;
E=0;
P1=com_l;
delay(5);
E=1;
delay(5);
E=0;
}
void Lcd_data(uchar dat_l) //写数据
{
Rs=1;
E=0;
P1=dat_l;
delay(5);
E=1;
delay(5);
E=0;
}
延时函数我就不贴了 展开
(液晶D0~D7接P1口矩阵,键盘接P2口)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Rs=P3^3;
sbit Rw=P3^4;
sbit E =P3^5;
uchar code table1[]="password:";
uchar table2[]="0123456789abcdefg";
uchar temp1,num;
void init();
uchar keyscan();
void Lcd_com(uchar com_l); //液晶写指令
void Lcd_data(uchar dat_l); //液晶写数据
void delay(uint aa);
void main()
{
init(); //初始化
Lcd_com(0x01);
Lcd_com(0x80);
for(num=0;num<9;num++) //打印table1[]
{
Lcd_data(table1[num]);
delay(10);
}
num=1;
while(num!=0)
{
temp1=keyscan();
if(0<temp1<10) //纠结的地方
{
Lcd_com(0x80+0x40+num);
Lcd_data(table2[temp1]);
delay(10);
}
num++;
}
}
void init()
{
E=0;
Rw=0;
Rs=0;
Lcd_com(0x38);
Lcd_com(0x0c);
Lcd_com(0x06);
Lcd_com(0x01);
}
uchar keyscan()
{
uchar numk;
uchar key_lie; //存储列的变量
uchar key_hang;
uchar key;
bit flag_key;
flag_key=0;
while(flag_key==0)
{
key=0xff;
P2=0xf0; //1111 0000,行为低电平,列为高电平
key_lie=P2;
key_lie=key_lie&0xf0;
if(key_lie!=0xf0)
{
delay(10);
if(key_lie!=0xf0)
{
key_lie=P2; //读取最新的P2值
key_lie=key_lie&0xf0; //得到最新的列的信息
P2=0x0f; //0000 1111,列为低电平,行为高电平
key_hang=P2; //读取P2口
key_hang=key_hang&0x0f;
key=key_hang|key_lie;
}
while(P2!=0x0f);
}
switch(key)
{
case 0xee: numk=0; flag_key=1;break; //0xee=1110 1110 说明第一个按键被按下,则num的值为0;
case 0xde: numk=1; flag_key=1;break;
case 0xbe: numk=2; flag_key=1;break;
case 0x7e: numk=3; flag_key=1;break;
case 0xed: numk=4; flag_key=1;break;
case 0xdd: numk=5; flag_key=1;break;
case 0xbd: numk=6; flag_key=1;break;
case 0x7d: numk=7; flag_key=1;break;
case 0xeb: numk=8; flag_key=1;break;
case 0xdb: numk=9; flag_key=1;break;
case 0xbb: numk=10; flag_key=1;break;
case 0x7b: numk=11; flag_key=1; break;
case 0xe7: numk=12; flag_key=1; break;
case 0xd7: numk=13; flag_key=1; break;
case 0xb7: numk=14; flag_key=1; break;
case 0x77: numk=15; flag_key=1; break;
}
}
return numk;
}
void Lcd_com(uchar com_l)//写指令
{
Rs=0;
E=0;
P1=com_l;
delay(5);
E=1;
delay(5);
E=0;
}
void Lcd_data(uchar dat_l) //写数据
{
Rs=1;
E=0;
P1=dat_l;
delay(5);
E=1;
delay(5);
E=0;
}
延时函数我就不贴了 展开
4个回答
展开全部
可以肯定,问题就在主函数里面
你的问题我还不是很清楚
如果是:只有按下 0——10 ,液晶才显示,按下其他的键,液晶就不显示
那么处理方法是:当 0——10 时,正常显示,当其余值时,液晶清屏,不然会一直显示之前的
如果是:只有按下 0——10 ,液晶才显示,按下其他的键,液晶不变
那么你的应该就是对的啊
注意一下,while(num!=0) 里面,num++ 你没写上限,所以循环次数是 256 次
当 num 加到 255 时,如果再 +1 ,就会变为 0 ,此时结束 while 循环
你的问题我还不是很清楚
如果是:只有按下 0——10 ,液晶才显示,按下其他的键,液晶就不显示
那么处理方法是:当 0——10 时,正常显示,当其余值时,液晶清屏,不然会一直显示之前的
如果是:只有按下 0——10 ,液晶才显示,按下其他的键,液晶不变
那么你的应该就是对的啊
注意一下,while(num!=0) 里面,num++ 你没写上限,所以循环次数是 256 次
当 num 加到 255 时,如果再 +1 ,就会变为 0 ,此时结束 while 循环
展开全部
if(0<temp1<10) //纠结的地方
这一句if(0<temp1<10) 后有空行了,把“{”放在"if(0<temp1<10)"后,紧跟着;
也可以把“{”放在"if(0<temp1<10)"后,紧跟着,然后把光标放在“{”前,再回车Enter。
两种方法都试试。“{”后也不要空行,试试看。
因为if(0<temp1<10)语句为真时,紧跟着执行下一行语句
这一句if(0<temp1<10) 后有空行了,把“{”放在"if(0<temp1<10)"后,紧跟着;
也可以把“{”放在"if(0<temp1<10)"后,紧跟着,然后把光标放在“{”前,再回车Enter。
两种方法都试试。“{”后也不要空行,试试看。
因为if(0<temp1<10)语句为真时,紧跟着执行下一行语句
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
if(0<temp1<10) //纠结的地方
{
……
应该改为:
if((0 < temp1) && (temp1 < 10)) //纠结的地方
{
……
应该改为:
if((0 < temp1) && (temp1 < 10)) //纠结的地方
追问
哎呀!低级错误啊!多谢!!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接改为if(temp1<=10)就行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询