你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于SYSTICK中断的键盘状态机扫描

[复制链接]
wamcncn 发布时间:2015-1-27 20:38
人机交互的界面,其中之一就是键盘.键盘扫描的方法很多,状态机是其中一种,调试了好几天,终于调好了
( b  o* e- d; ]! J. b! T1 j: Lvoid 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;             //初始化按键时间变量
0 r! N; N8 z6 e- Y 7 |% I6 [7 S  V2 W8 t
    + y5 n# _& c" K( V$ S) c6 @% h9 V
switch(KeyStateTemp)
& D0 |! N' K3 y$ G4 W! `' ~ {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;
' W5 O% q( V2 Z; y   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;
  ?* V7 l  o  H" ?9 _    KeyStateTemp = StateSingle;
" t) u1 x" X) t7 H1 e' G   }
# Y5 ]  O' c: J. l  P( {, ^   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++;
# k* i0 d. G( A* Q                sprintf(buffer,"%-16d",num);                   //把按键次数转换成字符
& z, s9 h  B. U& r4 G$ L4 Z          display_x(0x98,buffer);                                  //把转换的按键次数显示到液晶上                 " Q6 M9 H. d$ _& q
    if(125== num)  num = 0;
4 S) A$ I. v, ]% v, Z( N3 {6 P   }
/ P/ t# g3 `1 C' q! i. u   else if(++KeyTime> 50)  //如果按键时间大于50*20MS0 _# Z  U# k9 _' P
   {   
. k' K% C! ^  A               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
            }
3 C3 X) o; ^" Q( `/ J" I: Z7 e5 b   break;
0 t; \! |4 {& M+ d  case StateRepeat:     , m& m( ?) ]4 \
   if(KEY1_USER )
- g  f  ~$ C3 B8 A& I. E    KeyStateTemp = StateInit;
  n1 C+ D& B% `   else if(++KeyTime> 10)   //如果按键时间大于10*207 J% }4 Y8 _0 k, V
    {      
0 `0 t, h9 E+ }2 p% l                    KeyTime = 0;
3 i! q% O; k9 t' ?6 K* q1 x/ j                   num++; # ~/ V, @" P0 t) t/ I
                    sprintf(buffer,"%-16d",num);' B; a; e0 l' B8 _0 T
              display_x(0x98,buffer);  
$ t2 L/ u/ {# x# O( q     if(125== num)  num = 0;
& I: F0 {* K% b& F: V7 Y    }: B3 u# p6 i- F; c/ ?
                break;
! C! u. x+ V9 j  
  v" f/ \: s! O3 d* e        default: KeyStateTemp = KeyStateTemp = StateInit; break;1 L( `/ o. M; ~4 E9 C
}. O5 c8 `4 r$ }7 M8 `
  
6 R1 \! n( ?$ F1 _& C$ d# z% y}
7 A- @5 z2 W- F" b2 e1 c% \) c# 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
   {  
9 k3 k: {+ d4 f# V; d$ h- L        Key_Scan();. K$ D7 ^" ]1 f5 F' w8 w
      systick_num =0;           * m: ?8 _: \3 F8 s6 X
   }
4 {: S0 |; n) t& y}! ^2 n' a- p' @- |  _6 s2 q' p

3 l( s$ U" t# z$ t' a/ @
. z) n0 p! j6 o. W8 I  C0 O
赞 收藏 1 评论17 发布时间:2015-1-27 20:38

举报

17个回答
wamcncn 回答时间:2015-1-31 09:21:34
本帖最后由 wambob 于 2015-1-31 09:32 编辑
( I% @2 Q7 _3 Z3 y( n% _
holts1 发表于 2015-1-31 09:12% N# Y6 N; x4 @2 X; \
抖动的时候仍会进中断,状态也跟着抖,如何消抖。

0 c. \* z- M6 H; T, f' M  J3 m! s& d
抖动有20MS长吗,第1次中断后,假如是抖动的话,第2次进入中断,如果按键状态保持,就认为是按键了,否则认为是抖动
wamcncn 回答时间:2015-1-31 09:35:17
holts1 发表于 2015-1-31 09:26" d0 q! ^7 T( B  T4 u
在20MS内会多次触发你的键盘中断,每次进去你的状态机的值都在变,你如何判断哪次是有效的 ? ...

# D1 a5 f0 p  u& o5 |& h/ Q是20MS进入中断检测一下键盘,不是触发键盘中断
holts1 回答时间:2015-1-29 08:10:11
wambob 发表于 2015-1-28 08:53
6 V# a0 ^- w2 L/ {9 L: r进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
6 a* P9 J' o7 x7 r: S
你的键盘处理也在中断中,这个有点不合理
holts1 回答时间:2015-1-28 08:10:33
为什么放中断里 ?
wamcncn 回答时间:2015-1-28 08:53:02
holts1 发表于 2015-1-28 08:10
% ?7 }* r! R2 i- G为什么放中断里 ?

& D. Z9 W% C: s. N6 k: ~8 ~3 f: |进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
feel-376797 回答时间:2015-1-28 08:55:49
这办法好,省定时器
拼命三郎 回答时间:2015-1-28 09:26:21
谢谢分享
党国特派员 回答时间:2015-1-28 09:36:11
记得Atmel有硬件消抖。
wyxy163@126.com 回答时间:2015-1-28 15:08:58
提示: 作者被禁止或删除 内容自动屏蔽
holts1 回答时间:2015-1-29 08:11:15
而且你用键盘中断,消抖如何处理 ?
wamcncn 回答时间:2015-1-29 12:11:41
holts1 发表于 2015-1-29 08:11
- U- m& [) D+ `& K1 u而且你用键盘中断,消抖如何处理 ?

$ P$ N: o" b1 X6 O8 K% M关于消抖,建议你看看状态机按键原理就明白了
holts1 回答时间:2015-1-30 08:17:28
wambob 发表于 2015-1-29 12:11
9 k; ?2 i1 y8 g" a1 N+ ^关于消抖,建议你看看状态机按键原理就明白了
; A( p4 ], \( W$ Y1 o
你在键盘中断中处理按键,状态机原理有冲突啊?
拼命三郎 回答时间:2015-1-30 08:26:16
stm32.jpg
wamcncn 回答时间:2015-1-30 13:11:06
holts1 发表于 2015-1-30 08:171 j) q8 T' D: C- f4 G
你在键盘中断中处理按键,状态机原理有冲突啊?

) d2 `; d  L& w2 I5 L请问冲突在哪
holts1 回答时间:2015-1-31 09:12:30
wambob 发表于 2015-1-30 13:11
! J) E; v/ B+ S9 G  Q9 f2 L请问冲突在哪

9 s4 S! f! ^* b' L5 V& x+ Q抖动的时候仍会进中断,状态也跟着抖,如何消抖。
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版