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

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

[复制链接]
wamcncn 发布时间:2015-1-27 20:38
人机交互的界面,其中之一就是键盘.键盘扫描的方法很多,状态机是其中一种,调试了好几天,终于调好了. 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

! a7 r2 [- F+ ^; [  O8 I$ x   
# f6 @$ I$ g) y; B switch(KeyStateTemp)- c) A+ m6 i5 k5 z0 a
{
' @7 J9 N. M# L7 _! }* U8 u# \( x  case StateInit:      % z1 _6 M& Z8 k6 k& \
   if(!KEY1_USER)                                              //判断按键是否按下
& L3 t- x8 L) s5 x, ~    KeyStateTemp = StateAffirm;
$ y& u7 N2 N/ C/ }  `( i   break;* C$ [# o; @9 W/ ]& P
  case StateAffirm:     
2 j7 l' V9 p( l: ]- @! R5 x% b   if(!KEY1_USER)    , Q, y) I7 |" {3 U5 G3 x
   {0 X8 P6 Y& n1 k
    KeyTime = 0;
. _1 M2 v/ u/ x( d: W    KeyStateTemp = StateSingle;
& n1 ]0 A7 x7 r+ U+ ~3 X) }   }
0 e& [* ]% ]' f+ v   else KeyStateTemp = StateInit;  
) u- x* K9 b( e& e& o* \4 _   break;% g5 w2 v; }: T* P0 d
  case StateSingle:     
1 i7 P+ p1 l, q   if(KEY1_USER )   
  a* \8 K) n8 w% s% N- @( f   { % 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);                                  //把转换的按键次数显示到液晶上                 
7 `+ ^# d; o3 m! k    if(125== num)  num = 0;
7 y6 _$ b" Z" m) w) Q   }9 \( l$ n/ H: c) x
   else if(++KeyTime> 50)  //如果按键时间大于50*20MS
+ _  S2 c! O( H% E; i   {   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
            }
6 p. L3 Q( c  C( |. q" m# o: S% M   break;
% o3 U5 e1 d8 R4 p1 P" k/ c) Z  case StateRepeat:     - r$ T( d$ [  H  r; Z5 e5 U
   if(KEY1_USER )
" ?; F6 ~2 @7 a: x9 i/ E6 G3 l    KeyStateTemp = StateInit;
7 H+ S% t; i- j   else if(++KeyTime> 10)   //如果按键时间大于10*20
& _1 E6 R/ y+ h$ e& W    {      ) e. {0 C  X5 W' k2 @" Q
                    KeyTime = 0;
3 |" g, G7 K/ T: P- z+ @                   num++; ; k: F/ W( z8 @# U. z
                    sprintf(buffer,"%-16d",num);! F1 h  i2 q% @4 \9 u
              display_x(0x98,buffer);  
6 C/ j% i( W( c7 g$ s- i     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;
9 x  b' o% i/ i/ g. l3 ]) ^ }
( H9 Y9 ^; J  }& i% y% f  : e" `. _3 w6 n6 d+ q6 y5 R
}" I$ H, @% Z( |

- B4 Y- R0 u% e中断函数的设置3 F5 @' o8 I1 @  L3 N9 B( X/ @
void SysTick_Handler(void)
' {8 p/ M0 W7 M" x{       n5 c1 W' K+ w* a2 {! I
   
! R7 J& H. X, y" k$ [       systick_num++;$ L3 d4 s7 [# f. }9 _" g
    if(systick_num==20)
- G# O0 `: w+ f' U7 h  q7 L8 [$ Q   {  $ _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
   }
1 y+ V" }+ V1 D0 q$ R}
7 K8 f' v3 d1 {) L! E- Z. _6 Q. j2 r! H8 P1 e

5 B8 h, F4 S$ ^: L
赞 收藏 1 评论17 发布时间:2015-1-27 20:38

举报

17个回答
wamcncn 回答时间:2015-1-31 09:21:34
本帖最后由 wambob 于 2015-1-31 09:32 编辑 ; L; d" Y8 p2 ^, d. ?4 D4 G+ x
holts1 发表于 2015-1-31 09:12
* U5 i; T/ q9 h& a/ y/ }抖动的时候仍会进中断,状态也跟着抖,如何消抖。

# z* A# G" v# W- Z+ ~* ^! Y
, Y, W- L, b3 ^7 a) ?; ]5 E  w抖动有20MS长吗,第1次中断后,假如是抖动的话,第2次进入中断,如果按键状态保持,就认为是按键了,否则认为是抖动
wamcncn 回答时间:2015-1-31 09:35:17
holts1 发表于 2015-1-31 09:26* b0 C; W6 k+ {( d
在20MS内会多次触发你的键盘中断,每次进去你的状态机的值都在变,你如何判断哪次是有效的 ? ...
( m( Y& S. v% Y- |* O6 }0 i/ Y
是20MS进入中断检测一下键盘,不是触发键盘中断
holts1 回答时间:2015-1-29 08:10:11
wambob 发表于 2015-1-28 08:53
' A: F# s+ R- d8 T- k进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
, R! Q" R( A" b# B! S; F
你的键盘处理也在中断中,这个有点不合理
holts1 回答时间:2015-1-28 08:10:33
为什么放中断里 ?
wamcncn 回答时间:2015-1-28 08:53:02
holts1 发表于 2015-1-28 08:10  y0 K. x  ?) f, w: i1 i* m+ h, d
为什么放中断里 ?
9 s% ^& b, y& l- P
进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
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' f4 L1 n; p" m8 X而且你用键盘中断,消抖如何处理 ?
  k: g) k- V: x  K# Y! J" z9 p
关于消抖,建议你看看状态机按键原理就明白了
holts1 回答时间:2015-1-30 08:17:28
wambob 发表于 2015-1-29 12:115 i0 Q: U2 C1 g
关于消抖,建议你看看状态机按键原理就明白了

3 P. B; S; m. V7 g* c$ {你在键盘中断中处理按键,状态机原理有冲突啊?
拼命三郎 回答时间:2015-1-30 08:26:16
stm32.jpg
wamcncn 回答时间:2015-1-30 13:11:06
holts1 发表于 2015-1-30 08:170 B- }( T+ \. G8 r) B8 P6 T6 }
你在键盘中断中处理按键,状态机原理有冲突啊?

3 x9 f0 n' p" d9 J请问冲突在哪
holts1 回答时间:2015-1-31 09:12:30
wambob 发表于 2015-1-30 13:11
* E# D0 S& n$ L1 ?- L1 o/ z请问冲突在哪
, B" F9 n) O* C+ a/ L
抖动的时候仍会进中断,状态也跟着抖,如何消抖。
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版