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

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

[复制链接]
wamcncn 发布时间:2015-1-27 20:38
人机交互的界面,其中之一就是键盘.键盘扫描的方法很多,状态机是其中一种,调试了好几天,终于调好了' 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;   //初始化键盘状态变量
) p: i2 d& }: Y4 Y4 V    static unsigned int KeyTime=0;             //初始化按键时间变量# J9 x: a! f) o) e

& K1 V3 q7 c; n   
5 }3 e& w( Y: b9 _' s' y switch(KeyStateTemp)1 E# P! ~% M6 z% W/ U
{
; D: F( l5 E7 b  case StateInit:      
- Z9 m( Y2 S! |3 X9 g3 }   if(!KEY1_USER)                                              //判断按键是否按下
% u6 z$ f) Q5 i# G6 G    KeyStateTemp = StateAffirm;
) E7 x, U# N/ u! O   break;! n1 N6 `/ X% }2 r
  case StateAffirm:     $ Z3 N7 q$ B" L
   if(!KEY1_USER)   
  h! n% O5 m, K% P& q' ~6 U2 X   {  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
   }
; _! R( P, {3 `4 j1 j6 p+ \& H" ]   else KeyStateTemp = StateInit;  
9 n) f4 h0 G& j, X   break;
) S2 U) z# G( T8 [* x  case StateSingle:     
# }2 M. }/ v7 H: @   if(KEY1_USER )    $ ^2 r( O) O& A6 Y, g& _) z
   {
0 Z/ K& s6 \0 ?9 {( G- C    KeyStateTemp = StateInit;   ; @% ?9 E7 ~3 d0 K9 K% }
    num++;   j0 z+ ~4 ?& w( ]
                sprintf(buffer,"%-16d",num);                   //把按键次数转换成字符
4 f: D$ l( L. J% D8 Y( \- |          display_x(0x98,buffer);                                  //把转换的按键次数显示到液晶上                 
7 h2 v: g' k5 L1 j    if(125== num)  num = 0;! m- e4 _# ~3 T4 r* p0 W
   }) U3 G5 \, u5 H4 T+ A
   else if(++KeyTime> 50)  //如果按键时间大于50*20MS
) S- ^* L! }2 `) L0 \. i   {   1 @0 q- i+ r( \- \' R7 r: d
                 v5 k+ b+ Z: L6 b; V( w
                    KeyStateTemp = StateRepeat;
7 C9 \: `- G9 r# V5 m0 P* L7 I                    KeyTime = 0;
# r! q7 Y' ~6 T, W) o      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 )
$ P) T2 S. |; X/ e" m    KeyStateTemp = StateInit;
  V: M4 ~* z5 s9 [' A) f5 n6 l   else if(++KeyTime> 10)   //如果按键时间大于10*20( d2 S' K1 m! t. [1 w( `
    {      % _% ]2 d2 W3 b
                    KeyTime = 0;
; U; T: i* J' {! S, K5 J                   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;
5 O" h( F4 S6 \$ X/ n' d+ N3 r) }    }0 o- N1 S: z' R+ g
                break;
/ g  b0 E$ i8 d4 z  J' k" G/ Q  
: A+ }# T. t0 ]4 Y4 j/ @1 Q        default: KeyStateTemp = KeyStateTemp = StateInit; break;, h( ~. x  Z8 S* ^
}
) w# g. @1 T1 _7 u$ O  
1 A  q: g# i' }/ C& Y- V}- D( ]9 T$ a* E7 J0 D% M& D

( o  Q7 F- z% ~  P( n中断函数的设置! 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
   
: X3 V/ ]; s) y       systick_num++;6 \8 S% y9 H* S( O2 i( i
    if(systick_num==20)
) Y: B9 y% P+ h5 i: Z8 n+ G3 I1 t   {  0 p: g4 o9 a9 B
        Key_Scan();
; O4 o0 V* |" c7 j6 z5 P      systick_num =0;           
5 E# C: n6 H6 a8 _   }
9 y! h9 K+ Y2 W}2 o4 c6 b2 e( L7 C4 }( ^

1 j9 `( F5 W" o& I" [8 u
6 b% m. {) H- {/ v# [+ q7 d; b; D
收藏 1 评论17 发布时间:2015-1-27 20:38

举报

17个回答
wamcncn 回答时间:2015-1-31 09:21:34
本帖最后由 wambob 于 2015-1-31 09:32 编辑 0 z1 P0 y6 |6 M) q
holts1 发表于 2015-1-31 09:12" h7 g# t* J% v8 y* m7 W# ~
抖动的时候仍会进中断,状态也跟着抖,如何消抖。
; b4 M3 g. h3 C

7 o* ^: A. _1 r" Y$ ^  d抖动有20MS长吗,第1次中断后,假如是抖动的话,第2次进入中断,如果按键状态保持,就认为是按键了,否则认为是抖动
wamcncn 回答时间:2015-1-31 09:35:17
holts1 发表于 2015-1-31 09:26
. q5 d- V, r* y- z8 \在20MS内会多次触发你的键盘中断,每次进去你的状态机的值都在变,你如何判断哪次是有效的 ? ...

8 h: _0 r8 J# x是20MS进入中断检测一下键盘,不是触发键盘中断
holts1 回答时间:2015-1-29 08:10:11
wambob 发表于 2015-1-28 08:53- T9 [% B! c) F8 S" P7 W
进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉

; J2 ~* b: [" ?# `7 f/ g你的键盘处理也在中断中,这个有点不合理
holts1 回答时间:2015-1-28 08:10:33
为什么放中断里 ?
wamcncn 回答时间:2015-1-28 08:53:02
holts1 发表于 2015-1-28 08:101 r/ S3 ]  ?! Z, D' f
为什么放中断里 ?

% e: C$ V6 Y7 l- v) w2 s进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
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
% M4 H# P; _9 D- V+ k1 R$ K而且你用键盘中断,消抖如何处理 ?
' O9 F  H' J* f3 T" I- G
关于消抖,建议你看看状态机按键原理就明白了
holts1 回答时间:2015-1-30 08:17:28
wambob 发表于 2015-1-29 12:111 Z" j: g& V3 e
关于消抖,建议你看看状态机按键原理就明白了
5 z8 h$ t* I+ N2 u* u  q
你在键盘中断中处理按键,状态机原理有冲突啊?
拼命三郎 回答时间:2015-1-30 08:26:16
stm32.jpg
wamcncn 回答时间:2015-1-30 13:11:06
holts1 发表于 2015-1-30 08:17
# p9 o7 `( k1 P6 m5 h# t. Y你在键盘中断中处理按键,状态机原理有冲突啊?

- |+ M: Z, U4 u+ _  N* x请问冲突在哪
holts1 回答时间:2015-1-31 09:12:30
wambob 发表于 2015-1-30 13:11$ [$ i  W  |# i9 l+ ]2 \
请问冲突在哪

# _9 V' o9 n2 _) e9 f抖动的时候仍会进中断,状态也跟着抖,如何消抖。
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版