|
人机交互的界面,其中之一就是键盘.键盘扫描的方法很多,状态机是其中一种,调试了好几天,终于调好了 void Key_Scan(void)) ^7 `. T& i* H' `' v; X' ]1 P { 7 q- i$ q( P* V. Q F; ] static unsigned int KeyStateTemp = 0; //初始化键盘状态变量2 Y" D. d& Y: N; h$ m% I static unsigned int KeyTime=0; //初始化按键时间变量 7 |% I6 [7 S V2 W8 t + y5 n# _& c" K( V$ S) c6 @% h9 V switch(KeyStateTemp) {6 ^1 H: Q, N D e2 y: S case StateInit: + N& j+ ~# i# W$ F# l8 k: F2 q if(!KEY1_USER) //判断按键是否按下- y' z$ u4 t# W' i7 T u5 ? H3 C KeyStateTemp = StateAffirm; break;4 g W' K' O! W0 Q# O/ q case StateAffirm: , b5 R4 M: k& w1 ?9 N, E if(!KEY1_USER) . \/ G" k) h/ Q6 I- X3 Z, ]2 V {6 i0 W C% O& F( K' L* {/ q1 } KeyTime = 0; KeyStateTemp = StateSingle; } else KeyStateTemp = StateInit; 1 a! g# C; [% M+ ?! ]( ?4 G, u break;) X- x* p: M8 v& k4 c1 Y case StateSingle: & I9 W( m8 M2 d* q4 g- | if(KEY1_USER ) 8 T b; U( |# w, i1 y7 T { ; B" B& o' H/ D0 X3 d4 ]/ X KeyStateTemp = StateInit; + {" {7 O/ @# F8 w( D( J num++; sprintf(buffer,"%-16d",num); //把按键次数转换成字符 display_x(0x98,buffer); //把转换的按键次数显示到液晶上 " Q6 M9 H. d$ _& q if(125== num) num = 0; } else if(++KeyTime> 50) //如果按键时间大于50*20MS0 _# Z U# k9 _' P { 4 ~* H+ g; `# Z- @/ | KeyStateTemp = StateRepeat; ! n: a; X4 m& r: R' f1 x KeyTime = 0; , z" d5 m0 v/ _4 Y: C' J # P, N0 e; a1 o+ _8 x7 o9 R. S } break; case StateRepeat: , m& m( ?) ]4 \ if(KEY1_USER ) KeyStateTemp = StateInit; else if(++KeyTime> 10) //如果按键时间大于10*207 J% }4 Y8 _0 k, V { KeyTime = 0; num++; # ~/ V, @" P0 t) t/ I sprintf(buffer,"%-16d",num);' B; a; e0 l' B8 _0 T display_x(0x98,buffer); if(125== num) num = 0; }: B3 u# p6 i- F; c/ ? break; default: KeyStateTemp = KeyStateTemp = StateInit; break;1 L( `/ o. M; ~4 E9 C }. O5 c8 `4 r$ }7 M8 ` } # K7 k/ l/ K. R3 e 中断函数的设置/ T$ T( N. ?' _4 C& n void SysTick_Handler(void)- v8 P0 R/ ]4 _, g& Z8 V { 1 r& N& d; u& r, [! j / _4 P" j! q2 S systick_num++;# z6 C8 A7 Z7 b1 F* V0 s% S if(systick_num==20); l2 x; K# R3 g3 X+ K { Key_Scan();. K$ D7 ^" ]1 f5 F' w8 w systick_num =0; * m: ?8 _: \3 F8 s6 X } }! ^2 n' a- p' @- | _6 s2 q' p |
微信公众号
手机版
; T, f' M J3 m! s& d
抖动有20MS长吗,第1次中断后,假如是抖动的话,第2次进入中断,如果按键状态保持,就认为是按键了,否则认为是抖动
是20MS进入中断检测一下键盘,不是触发键盘中断
你的键盘处理也在中断中,这个有点不合理
进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
关于消抖,建议你看看状态机按键原理就明白了
你在键盘中断中处理按键,状态机原理有冲突啊?
请问冲突在哪
抖动的时候仍会进中断,状态也跟着抖,如何消抖。