51单片机读取键盘的按键问题
时间:10-02
整理:3721RD
点击:
51单片机读取74c922键盘的按键,在12864进行显示,程序:
/*------------------键盘读值-----------------*/
uchar key1(void)
{ uchar keyk;
//KDA=keyDA;
if(KDA==1)
{ //P2=0x00;
delay_key(20);
if (KDA==1)
{
delay_key(20);
keyk=P2&0xf0;
next++;
P2=0xf0;
}
switch(keyk)
{
case 0x00:k=7; break;
case 0x10:k=4; break;
case 0x30:k=1; break;
case 0x20:k=0; break;
case 0x40:k=8; break;
case 0x50:k=5; break;
case 0x70:k=2; break; case 0x80:k=9; break;
case 0x90:k=6; break;
case 0xb0:k=3; break;
case 0x60:k=10;break;//光标
case 0xa0:k=11;break;//确定
case 0xc0:k=12;break;//复位
case 0xd0:k=13;break;//通信
case 0xf0:k=14;break;//设置
case 0xe0:k=15;break;//测量
}
}
return k;
}
void main ()
{
//delay_lcd(2000);
//P2=0x00;
init_lcd ();
init();
KDA=keyDA;
shen=0;
time=0;
KDA=0;
counter=0;
clrram ();
wc(0x80);
wh("速度");
wd(0x3a);
wc(0x90);
wh ("深度");
while(1)
{
KDA=keyDA;
delay_lcd(100);
k=key1();
sushen();
if(0<=k<=9)
{wc(0x88);
wd(0x30+k);
}
if(k==14)
{
s=1;
shezhi();
}
if(k==12)
{
soft_reset();
}
}
}
/*------------------设置子程序-----------------*/
void shezhi(void) //;
{
uchar a,b,shejishu;
shejishu=0;
a=1;
b=1,s=0,x=1;
clrram();
while(shejishu==0) //设置1
{ delay_key(100);
// uchar k;
wc(0x81);
wh("测量方式:");
wc(0x91);
wh("1:磁法");
wc(0x89);
wh("2:电法");
wc(0x99);
wh("选择:");
wc(0x9c);
wc(0x14);
// wc(0x0c);
wd(a+0x30);
k=key1();
if(1<=k<=2)
{
a=k;
if(a==1)
{ c=1;
d=0;
}
if(a==2)
{
c=0;
d=1;
}
}
if(k==11) //设置1完成,跳出
{shejishu++;
clrram();
break;
}
}
while(shejishu==1) //设置2
{
// uchar k;
next=0;
wc(0x81);
wh("起始深度:");
wc(0x89);
// wc(0x0f);
k=key1();
if(0<=k<=9)
{
if(next>=2)
{next=0;}
wu[next]=k;
}
wd(wu[0]+0x30);
wd(wu[1]+0x30);
wc(0x8a);
// wc(0x0f);
wd(wu[2]+0x30);
wd(wu[3]+0x30);
shen=wu[0]*1000+wu[1]*100+wu[2]*10+wu[3];
if(k==11)
{shejishu++;
clrram();
break;
}
}
不知道为什么设置1的循环能正常,设置2的循环只是执行一次就跳出了?感觉还是键值读取的K=11这个值,有没有办法当K值读完就不再去读了,或着KDA不等于1时不去跳过 k=key1();这个语句,
http://bbs.elecfans.com/forum.php?mod=viewthread&tid=267398 按键
可以通过设置标志位来进行切换,当得到你想要的值后就给标志位赋个值,然后判断哪些你想根据这个值来执行的程序是否需要执行
建议再看看课本按键处理相关知识