|
人机交互的界面,其中之一就是键盘.键盘扫描的方法很多,状态机是其中一种,调试了好几天,终于调好了. o# c) Q M" T, y' A" G8 L void Key_Scan(void)0 z& z2 l( N( T q8 l9 d! a { ) ?( @7 f- F' z! e! t. }6 a0 x% H static unsigned int KeyStateTemp = 0; //初始化键盘状态变量4 b) n& c9 o, I static unsigned int KeyTime=0; //初始化按键时间变量3 q& l8 d$ |: A! r switch(KeyStateTemp)- c) A+ m6 i5 k5 z0 a { case StateInit: % z1 _6 M& Z8 k6 k& \ if(!KEY1_USER) //判断按键是否按下 KeyStateTemp = StateAffirm; break;* C$ [# o; @9 W/ ]& P case StateAffirm: if(!KEY1_USER) , Q, y) I7 |" {3 U5 G3 x {0 X8 P6 Y& n1 k KeyTime = 0; KeyStateTemp = StateSingle; } else KeyStateTemp = StateInit; break;% g5 w2 v; }: T* P0 d case StateSingle: if(KEY1_USER ) { % H' E5 w# d2 v- c KeyStateTemp = StateInit; ' A1 z V9 o+ k6 g/ o num++; $ I H' ] v9 K h+ v sprintf(buffer,"%-16d",num); //把按键次数转换成字符% E% c& \0 K4 ^3 C/ b display_x(0x98,buffer); //把转换的按键次数显示到液晶上 if(125== num) num = 0; }9 \( l$ n/ H: c) x else if(++KeyTime> 50) //如果按键时间大于50*20MS { 8 C9 j1 q. | ^8 d6 H, u" p h Q: _, H) N3 q8 ~ KeyStateTemp = StateRepeat; . l" T6 w# c2 U1 M2 R5 t" p% O KeyTime = 0; % N( A$ g0 T% j* u" B 0 i9 B& H$ S# v2 z } break; case StateRepeat: - r$ T( d$ [ H r; Z5 e5 U if(KEY1_USER ) KeyStateTemp = StateInit; else if(++KeyTime> 10) //如果按键时间大于10*20 { ) e. {0 C X5 W' k2 @" Q KeyTime = 0; num++; ; k: F/ W( z8 @# U. z sprintf(buffer,"%-16d",num);! F1 h i2 q% @4 \9 u display_x(0x98,buffer); if(125== num) num = 0;8 t- Y% h- U/ d$ r; {# `2 b. D% C }: c4 H% {& o7 I, L C% z break; " X5 G. ^) M Y9 ]* ~) M" F % J! c, Q+ v; o8 a default: KeyStateTemp = KeyStateTemp = StateInit; break; } : e" `. _3 w6 n6 d+ q6 y5 R }" I$ H, @% Z( | 中断函数的设置3 F5 @' o8 I1 @ L3 N9 B( X/ @ void SysTick_Handler(void) { n5 c1 W' K+ w* a2 {! I systick_num++;$ L3 d4 s7 [# f. }9 _" g if(systick_num==20) { $ _8 b. r6 C" z' A& k. u8 N/ g Key_Scan();: A0 @# C7 ~ t systick_num =0; 8 q5 X) f; k, U# v } } ! E- Z. _6 Q. j2 r! H8 P1 e |
微信公众号
手机版
抖动有20MS长吗,第1次中断后,假如是抖动的话,第2次进入中断,如果按键状态保持,就认为是按键了,否则认为是抖动
是20MS进入中断检测一下键盘,不是触发键盘中断
你的键盘处理也在中断中,这个有点不合理
进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
关于消抖,建议你看看状态机按键原理就明白了
你在键盘中断中处理按键,状态机原理有冲突啊?
请问冲突在哪
抖动的时候仍会进中断,状态也跟着抖,如何消抖。