本帖最后由 bishopcool 于 2016-1-3 21:51 编辑
tc0_intsrv:
b0bclr ftc0irq
mov a,p0
b0bset fp02m;P0.2置为输出
b0bset fp03m;P0.3置为输出
xor a,#11111111b ;
xch a,keyPre ;
xch a,keyPrePre ;
xor a,#11111111b ;
and a,keyPrePre ;
and a,keyPre ;
and a,#00011100b ; 只取P0.2、P0.3和P0.4
mov keyPress,a ; keyPress = !keyPrePre&keyPre&(!P0)&(00011100b);keyPrePre=keyPre;keyPre=!P0
这是我程序按键检测的一小段。是在定时器tc0的中断中实现的。主要是想实现按键按下的一个检测,按键按下时P0对应位为0.程序中keyPre是记录上一次P0端口的按键状态,对应位是1表示按键按下。keyPrepre是记录之前的之前一次。检测三次的目的,一个是防抖,一个是检测按下动作,触发后续处理。
在程序里,同一个引脚既作为输入又作为输出,每隔8ms左右就用32us检测一下输入。其余时间都是输出。
但是这个程序ICE仿真没有问题,烧录到芯片上板子的时候按键检测就不灵了,短按按键还能起点最用,长按就不起作用,反而本来只作为输出的其他引脚上接的LED灯却不停闪烁。搞不懂原因,求教大神! |