你可以用定器,分时去读KEY的状态,读了就离开,并记录KEY状态维持的时间,来断别是否有按键按下,
检测上升沿,与下降沿,如下程序
unsigned char KeyScan( bit key )
{
static bit KeyStatus=1; //记录上一次的状态
bit j,btmp;
j = key;
if( KeyStatus == j )
{
return 0x00; //无按键操作
}
KeyStatus = j; //记录本次按键状态
if( KeyStatus =1 )
{
return 0x01; //按键释放
}
else
{
return 0x02; //按键按下
}
}
return 0x00;
}
这样不是很好吗,按下只要没放就在那等待,如果不等待,又会进入下一次按键的判断,这样可能不是我们想要要的结果,如果你不想在那等,就不用while(!KEY),程序执行完这个Key的过程后,可能会立马又进入了Key函数,那么,你本来想要加1的,可能在你按的那一下,就加到5、6了。
但是,如果你一定要像你说的那样的程序,也并不是不行,简单可行的办法就是中断加查寻的方法,中断的目的是在下降沿时触发,由于单片机的外中断很少,不可能独立做n多个按键,那么,按键还要通过与门连到其他I/O口,有了中断做为触发前提,再通过其他I/O口查寻,就可以获得当前是哪个键了。由于中断是下降沿触发,所以,每一次按键只会出现一个下降沿,反以不管你按下多久,程序执行完了都会立马退出,而且不会有下一次的误判。不过这样做的缺点就是,按键越多,硬件(与门)就会用的越多,电路会复杂一些,当然,成本也会相应增加。
你又想不停的+1,又想不循环,好像不可能吧。