用定时器,定时1ms一次中断,在定时器中断中检测按键.首先定义两个全局变量:<br /><br />unsigned char LastKey; //最后按下的键值,初始化为无效键值即可.例如0xFF<br />unsigned char CheckCount; //计数器,初始化为0<br /><br /><br />//中断处理<br />if( LastKey!=0xFF ) //此前已经有一键按下<br />{<br /> //检查该键是否仍然按下<br /> if( /*没按下*/ )<br /> {<br /> LastKey=0xFF;<br /> CheckCount=0;<br /> }<br /> else if( LastKey<20 )<br /> {<br /> CheckCount++;<br /> if( CheckCount==20 )<br /> {<br /> //按键处理,或置标志位,供主程序轮询<br /> }<br /> }<br />}<br />else //此前无键按下<br />{<br /> //检查有无键按下<br /> if( /*有键按下*/ )<br /> {<br /> LastKey=/*键码*/;<br /> CheckCount=1;<br /> }<br />}<br /><br />//这么做可以非常好的消除抖动,同时硬件上可以把与门去掉,节省了硬件,也省了一个中断口线.<br />//因为我以前写的按键处理程序都是汇编,不大好读,现写了个C语言的框架,你可以照这个试一下.<br />//这样处理按键,只能对第一个按下的键响应,在响应了一个按键后,除非这个健放开,否则其它任何按键都得不到处理,看似处理的比较弱智,其实在大多数情况下已经可以很好的工作了,除非就有人和你较劲,呵呵~~~~~~
|