请大家不要再对这个100ms发起讨论,前面说过这个可以调整。还有,有的情况下是不需要检测按键放开的。
七楼大哥 说用其他程序段代替延时程序也可取,关键这个代替延时的程序段每次执行所花费的时间固定吗? 我的意思是用 时基 来计时 ,设定一个变量 cnt 假如程序的主时基是4ms的话 当检测到按键按下的时候 inc cnt 下一个回圈 再检测按键,如果还按下的话,cnt 再加一 ,当加到某个值的时候 可以认为 按键确实按下了这期间如果检测到又一次没按下,则clr cnt 重新开始。如果取cnt=10 则消抖时间是10*4=40ms
贴出小弟的一段程序, 时基是2ms key_scan: mov a,#01110000b or p0,a mov a,#01111000b mov p0ur,a mov a,#10000000b mov p0m,a mov a,#00000111b or p4,a mov p4ur,a mov a,#00000000b ;com3输入,关led mov p4m,a jmp $+1 jmp $+1 jmp $+1 mov a,p4 and a,#00000111b mov new_key,a bclr fc rlcm new_key rlcm new_key rlcm new_key mov a,p0 and a,#01110000b mov r,a bclr fc rrcm r rrcm r rrcm r rrcm r mov a,r or new_key,a;00******=00seg6 seg5 seg4 seg3 seg2 seg1 bts0 f_key_rel jmp key_scan10 ;检测放键 jmp key_scan20 ;检测按键 key_scan10: mov a,new_key cmprs a,#00111111b jmp key_scan30 incms key_cnt mov a,key_cnt cmprs a,#15 ;30ms jmp key_scan90 bclr f_key_rel jmp key_scan30 key_scan20: mov a,new_key cmprs a,old_key jmp key_scan21 incms key_cnt mov a,key_cnt cmprs a,#30 ;60ms jmp key_scan90 clr key_cnt jmp key_scan40 key_scan21: mov_ old_key,new_key key_scan30: clr key_cnt jmp key_scan90 key_scan40: mov a,new_key cje a,#00111111b,key_scan90 ;无键按下不作处理 cje a,#00111110b,key_scan41 cje a,#00111101b,key_scan42 cje a,#00111011b,key_scan43 cje a,#00110111b,key_scan44 cje a,#00101111b,key_scan45 cje a,#00011111b,key_scan46 cje a,#00001111b,key_scan47 jmp key_scan90 key_scan41: mov_ event_buf,#1 ;POWER键键值1 jmp key_scan80 key_scan42: mov_ event_buf,#2 ;osc键键值2 jmp key_scan80 key_scan43: mov_ event_buf,#3 ;HI/LOW键键值3 jmp key_scan80 key_scan44: mov_ event_buf,#4 ;timer键值4 jmp key_scan80 key_scan45: mov_ event_buf,#5 ;+auto键键值5 jmp key_scan80 key_scan46: mov_ event_buf,#6 ;-auto键键值6 jmp key_scan80 key_scan47: mov_ event_buf,#7 ;+-auto同时键值7 key_scan80: bset f_key_rel call wrt_FIFO ;将键值写入event_FIFO key_scan90: ret |