
人机交互的界面,其中之一就是键盘.键盘扫描的方法很多,状态机是其中一种,调试了好几天,终于调好了' T; F9 P( ?2 F! |) q void Key_Scan(void): j( Q+ q& P- L$ h+ a1 x( i- Y9 w; @+ T! _ { 2 Y- W* }2 f5 E9 q2 i: `8 Q5 w static unsigned int KeyStateTemp = 0; //初始化键盘状态变量 static unsigned int KeyTime=0; //初始化按键时间变量# J9 x: a! f) o) e switch(KeyStateTemp)1 E# P! ~% M6 z% W/ U { case StateInit: if(!KEY1_USER) //判断按键是否按下 KeyStateTemp = StateAffirm; break;! n1 N6 `/ X% }2 r case StateAffirm: $ Z3 N7 q$ B" L if(!KEY1_USER) { S) r5 z% q7 a; i KeyTime = 0;) I; p4 m" R. `2 i- f0 L4 h6 ^ KeyStateTemp = StateSingle; 0 z+ u/ u/ D9 y } else KeyStateTemp = StateInit; break; case StateSingle: if(KEY1_USER ) $ ^2 r( O) O& A6 Y, g& _) z { KeyStateTemp = StateInit; ; @% ?9 E7 ~3 d0 K9 K% } num++; j0 z+ ~4 ?& w( ] sprintf(buffer,"%-16d",num); //把按键次数转换成字符 display_x(0x98,buffer); //把转换的按键次数显示到液晶上 if(125== num) num = 0;! m- e4 _# ~3 T4 r* p0 W }) U3 G5 \, u5 H4 T+ A else if(++KeyTime> 50) //如果按键时间大于50*20MS { 1 @0 q- i+ r( \- \' R7 r: d v5 k+ b+ Z: L6 b; V( w KeyStateTemp = StateRepeat; KeyTime = 0; 3 W6 u3 k8 ]4 J. |6 y0 ` }7 L' \$ v4 H9 r; o* h break;! k+ L6 ?4 f& [1 |9 X7 [* a case StateRepeat: 2 b2 F% J7 I' m" Z( h W! s if(KEY1_USER ) KeyStateTemp = StateInit; else if(++KeyTime> 10) //如果按键时间大于10*20( d2 S' K1 m! t. [1 w( ` { % _% ]2 d2 W3 b KeyTime = 0; num++; r1 F- L8 e2 P! n/ U7 \ sprintf(buffer,"%-16d",num);) q$ c+ U; r% w* i ^ display_x(0x98,buffer); % p3 h) d4 U$ B/ k0 Z4 S if(125== num) num = 0; }0 o- N1 S: z' R+ g break; default: KeyStateTemp = KeyStateTemp = StateInit; break;, h( ~. x Z8 S* ^ } }- D( ]9 T$ a* E7 J0 D% M& D 中断函数的设置! X; n2 A4 E- a6 j6 g) y% Z2 B, h1 |0 Y void SysTick_Handler(void)7 o: i, N( H9 K. [4 l { 3 d0 T4 S' B) @2 e systick_num++;6 \8 S% y9 H* S( O2 i( i if(systick_num==20) { 0 p: g4 o9 a9 B Key_Scan(); systick_num =0; } }2 o4 c6 b2 e( L7 C4 }( ^ |
抖动有20MS长吗,第1次中断后,假如是抖动的话,第2次进入中断,如果按键状态保持,就认为是按键了,否则认为是抖动
是20MS进入中断检测一下键盘,不是触发键盘中断
你的键盘处理也在中断中,这个有点不合理
进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
关于消抖,建议你看看状态机按键原理就明白了
你在键盘中断中处理按键,状态机原理有冲突啊?
请问冲突在哪
抖动的时候仍会进中断,状态也跟着抖,如何消抖。