请教下矩阵键盘程序加了去抖程序哪里错误。
个人用的反转法,发现不加去抖程序的时候运行正常。加了去抖反而检测不出按键了,求教。
程序如下,“//”后面的内容加了为去抖的。
uchar scan()
{
// P1=0xf0;
// temp=P1;
// if(temp!=0xf0)
// {
// delay(5);
// temp=P1;
// if(temp!=0xf0)
// {
P1=0xf0;
delay(5);
temp=P1&0xF0;
temp=~((temp>>4)|0xf0);
switch(temp)
{
case 8:key=1;break;
case 4:key=2;break;
case 2:key=3;break;
case 1:key=4;break;
default:key=17;
}
P1=0x0f; //低四位输入
delay(5);
temp=P1&0x0f;
temp=~(temp|0xF0);
switch(temp)
{
case 8:key=key+0;break;
case 4:key=key+4;break;
case 2:key=key+8;break;
case 1:key=key+12;break;
default:key=17;
}
// }}
return key;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
今天试了下在scan()前独立出一个keydown()检测程序,只要一加,就又不行了。
还是把整个程序贴出来吧(LED灯的目的我只是用来检测按键1~8)
#include <STC89.H>
#define uchar unsigned char
#define uint unsigned int
uchar temp,key;
uchar scan();
void delay(uint c)
{
uint x,y;
for(x=0;x<c;x++)
for(y=0;y<110;y++);
}
void keydown()
{
P1=0xf0;
temp=P1;
if(temp!=0xf0)
{
delay(5);
temp=P1;
if(temp!=0xf0)
key=scan();
}
}
uchar scan()
{
// P1=0xf0;
// temp=P1;
// if(temp!=0xf0)
// {
// delay(5);
// temp=P1;
// if(temp!=0xf0)
// {
P1=0xf0;
delay(5);
temp=P1&0xF0;
temp=~((temp>>4)|0xf0);
switch(temp)
{
case 8:key=1;break;
case 4:key=2;break;
case 2:key=3;break;
case 1:key=4;break;
default:key=17;
}
P1=0x0f; //低四位输入
delay(5);
temp=P1&0x0f;
temp=~(temp|0xF0);
switch(temp)
{
case 8:key=key+0;break;
case 4:key=key+4;break;
case 2:key=key+8;break;
case 1:key=key+12;break;
default:key=17;
}
// }}
return key;
}
void main()
{
keydown(); //这里如果我换成key=scan();,即跳过keydown直接scan就没问题
switch(key)
{
// case 0:
// P2=0xee;
// delay(2000);
// P2=0xff;
// break;
case 1:
P2=0xfe;
delay(2000);
P2=0xff;
break;
case 2:
P21=0;
delay(2000);
P21=1;
break;
case 3:
P22=0;
delay(2000);
P22=1;
break;
case 4:
P23=0;
delay(2000);
P23=1;
break;
case 5:
P24=0;
delay(2000);
P24=1;
break;
case 6:
P25=0;
delay(2000);
P25=1;
break;
case 7:
P26=0;
delay(2000);
P26=1;
break;
case 8:
P27=0;
delay(2000);
P27=1;
break;
default:
P2=0x00;
break;
}
}
个人用的反转法,发现不加去抖程序的时候运行正常。加了去抖反而检测不出按键了,求教。
程序如下,“//”后面的内容加了为去抖的。
uchar scan()
{
P1=0xf0; //P1输出0xf0
temp=P1; //读出P1端口的值赋给变量temp
if(temp!=0xf0) //如果有按键按下
{
delay(5); //延时
temp=P1; //再次读取P1的值
if(temp!=0xf0) //确实有按键按下
{
// P1=0xf0; //问题应该出在这里,将这条语句去掉。把0xf0赋给p1后,
delay(5);
temp=P1&0xF0; //P1&0xf0永远等于0xf0
temp=~((temp>>4)|0xf0); //~((temp>>4)|0xf0)永远等于0x00
switch(temp)
{
case 8:key=1;break;
case 4:key=2;break;
case 2:key=3;break;
case 1:key=4;break;
default:key=17;
}
P1=0x0f; //低四位输入
delay(5);
temp=P1&0x0f;
temp=~(temp|0xF0);
switch(temp)
{
case 8:key=key+0;break;
case 4:key=key+4;break;
case 2:key=key+8;break;
case 1:key=key+12;break;
default:key=17;
}
// }}
return key;
}
{
P1=0xf0; //P1输出0xf0
temp=P1; //读出P1端口的值赋给变量temp
if(temp!=0xf0) //如果有按键按下
{
delay(5); //延时
temp=P1; //再次读取P1的值
if(temp!=0xf0) //确实有按键按下
{
// P1=0xf0; //问题应该出在这里,将这条语句去掉。把0xf0赋给p1后,
delay(5);
temp=P1&0xF0; //P1&0xf0永远等于0xf0
temp=~((temp>>4)|0xf0); //~((temp>>4)|0xf0)永远等于0x00,后面的自己分析吧
switch(temp)
{
case 8:key=1;break;
case 4:key=2;break;
case 2:key=3;break;
case 1:key=4;break;
default:key=17;
}
P1=0x0f; //低四位输入
delay(5);
temp=P1&0x0f;
temp=~(temp|0xF0);
switch(temp)
{
case 8:key=key+0;break;
case 4:key=key+4;break;
case 2:key=key+8;break;
case 1:key=key+12;break;
default:key=17;
}
// }}
return key;
}
一周热门 更多>