
人机交互的界面,其中之一就是键盘.键盘扫描的方法很多,状态机是其中一种,调试了好几天,终于调好了 void Key_Scan(void) { + W3 C8 K8 }0 A3 d& `8 X static unsigned int KeyStateTemp = 0; //初始化键盘状态变量 static unsigned int KeyTime=0; //初始化按键时间变量 % n. w0 { O) g$ O# l switch(KeyStateTemp)! y: R% H4 f. d0 H; A8 @# g1 X { w/ D2 H# N. ~6 ^. l9 F/ ^- | case StateInit: if(!KEY1_USER) //判断按键是否按下 KeyStateTemp = StateAffirm; break;0 V( t. S( r& z% G S case StateAffirm: ) S l; o, u2 z) s8 F if(!KEY1_USER) { KeyTime = 0; KeyStateTemp = StateSingle; } else KeyStateTemp = StateInit; 7 o% h2 @1 U% L, Y break; case StateSingle: + \) c; R0 y/ x4 Z- C1 j if(KEY1_USER ) 1 Y5 X/ u7 I7 K+ Z { KeyStateTemp = StateInit; - K- {9 U. w# V1 `4 k8 {9 a num++; + Z% x6 {/ ?; q/ F0 u2 O# d sprintf(buffer,"%-16d",num); //把按键次数转换成字符% n* c, S$ S. {5 p display_x(0x98,buffer); //把转换的按键次数显示到液晶上 7 y9 N6 q7 w, Y. A* e4 b8 h if(125== num) num = 0;5 u! J$ M4 D% t& m1 g1 u, O }: P4 P. A7 b) F6 u( u1 F4 m else if(++KeyTime> 50) //如果按键时间大于50*20MS# H, r# o6 _6 q/ t: `4 o { 5 q$ O8 L6 {1 c KeyStateTemp = StateRepeat; KeyTime = 0; }/ B- \5 n z* c7 ~( ~ break;% |& `1 {9 Z* I case StateRepeat: 0 h3 r4 C$ L* m if(KEY1_USER ) 9 L# w- v6 r. r KeyStateTemp = StateInit; else if(++KeyTime> 10) //如果按键时间大于10*20 { 4 O+ q. n! [6 V$ d% Y m2 h, u KeyTime = 0; num++; & e! V1 _: P& {, R4 c( x sprintf(buffer,"%-16d",num); display_x(0x98,buffer); if(125== num) num = 0;! R' }) E( n) ~; E Z! n( m& Z } break; 8 U4 s6 }3 _4 {7 a; t5 ~$ G8 C default: KeyStateTemp = KeyStateTemp = StateInit; break;: I) i' _+ F% \6 | } $ u# J" W4 r' g } 中断函数的设置 void SysTick_Handler(void) { . ]; s" O6 Q8 Y* o$ U( z2 Q, i/ i# z systick_num++;& v# J1 U- L' U% t/ @" X if(systick_num==20)6 t9 ?$ X g, H3 K' u { Key_Scan(); systick_num =0; }4 q8 K9 g4 W' U5 n2 J( c9 d) C }1 s4 O+ F( j. q$ D, u! D l; h k/ @) K- L 3 I( e* h2 R: [5 y( `0 T( n |
抖动有20MS长吗,第1次中断后,假如是抖动的话,第2次进入中断,如果按键状态保持,就认为是按键了,否则认为是抖动
是20MS进入中断检测一下键盘,不是触发键盘中断
你的键盘处理也在中断中,这个有点不合理
进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
关于消抖,建议你看看状态机按键原理就明白了
你在键盘中断中处理按键,状态机原理有冲突啊?
请问冲突在哪
抖动的时候仍会进中断,状态也跟着抖,如何消抖。