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

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

[复制链接]
wamcncn 发布时间:2015-1-27 20:38
人机交互的界面,其中之一就是键盘.键盘扫描的方法很多,状态机是其中一种,调试了好几天,终于调好了
# T5 F9 j( K4 A. X  H+ {void Key_Scan(void)
' X: S/ z& K9 A8 y+ t{      + W3 C8 K8 }0 A3 d& `8 X
    static unsigned int KeyStateTemp = 0;   //初始化键盘状态变量
7 F  N! S2 E% V5 ?; |- G! }    static unsigned int KeyTime=0;             //初始化按键时间变量
0 T% M( N; Y' U
4 y) t8 o. C9 ]" k1 Z! y    % 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:      
- G0 ~, D  ]2 E$ }, e  f5 D" O   if(!KEY1_USER)                                              //判断按键是否按下
1 S' r/ N3 o6 o7 J) b    KeyStateTemp = StateAffirm;
- |! p7 F. m( D5 Q# Z( b# M" @& E   break;0 V( t. S( r& z% G  S
  case StateAffirm:     ) S  l; o, u2 z) s8 F
   if(!KEY1_USER)   
3 M, s7 z8 i2 U- ]! P% ~  g   {
5 L( {+ n1 k% o, R$ J! W* e    KeyTime = 0;
. w1 {  x4 f1 p    KeyStateTemp = StateSingle;
1 K7 ]7 {0 @0 }. ]- W   }
7 J( y' f0 k/ y   else KeyStateTemp = StateInit;  7 o% h2 @1 U% L, Y
   break;
# b/ Q% p' q( I! Q  case StateSingle:     + \) c; R0 y/ x4 Z- C1 j
   if(KEY1_USER )    1 Y5 X/ u7 I7 K+ Z
   {
5 ^; T  F! X7 V) o0 |8 y    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
   {   
; e6 U' D$ n2 v* |               5 q$ O8 L6 {1 c
                    KeyStateTemp = StateRepeat;
" M$ l: a; ?7 r% L4 d: r                    KeyTime = 0;
- a& b! f/ o9 a) l6 W7 b      
+ x9 l4 l+ I' r# ^            }/ 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;
$ b3 g. p6 ~% P5 P; A3 c   else if(++KeyTime> 10)   //如果按键时间大于10*20
, X; s- Y" A' F$ n( g8 B& c( o# \    {      4 O+ q. n! [6 V$ d% Y  m2 h, u
                    KeyTime = 0;
: `/ l, m1 S- O( l( l                   num++; & e! V1 _: P& {, R4 c( x
                    sprintf(buffer,"%-16d",num);
. j6 ~! o6 v4 u$ F$ d              display_x(0x98,buffer);  
- f+ J9 U' X! M! K- p' I     if(125== num)  num = 0;! R' }) E( n) ~; E  Z! n( m& Z
    }
8 j. X) y( ?0 b& `                break; 8 U4 s6 }3 _4 {7 a; t5 ~$ G8 C
  
" A' Y$ \# V5 n, ?        default: KeyStateTemp = KeyStateTemp = StateInit; break;: I) i' _+ F% \6 |
}
) O& y0 ]. [, k# t  $ u# J" W4 r' g
}
2 x8 D: k4 F& d* \  r
% d2 |* r$ c4 P- q8 {# }9 c9 ?中断函数的设置
* ?1 X* O9 [) p: Y8 qvoid SysTick_Handler(void)
+ v% {8 k. p% j+ c{     
- D* P0 \  t1 ^5 H% [: }- z   . ]; 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
   {  
; E' [, N8 B3 h1 B5 K4 X        Key_Scan();
# d* a$ x- B; x% U      systick_num =0;           
5 }. [! q5 D5 y* J$ x. M& l1 x, S1 _   }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
收藏 1 评论17 发布时间:2015-1-27 20:38

举报

17个回答
wamcncn 回答时间:2015-1-31 09:21:34
本帖最后由 wambob 于 2015-1-31 09:32 编辑 ! p. [! H2 n# t. ?, b+ i7 @0 r
holts1 发表于 2015-1-31 09:12& {3 ]8 ^( q  s
抖动的时候仍会进中断,状态也跟着抖,如何消抖。
- Z5 Q0 w  {* T) ~. Z# z- A

. }- y) [4 F$ m( E3 P# f# x# r抖动有20MS长吗,第1次中断后,假如是抖动的话,第2次进入中断,如果按键状态保持,就认为是按键了,否则认为是抖动
wamcncn 回答时间:2015-1-31 09:35:17
holts1 发表于 2015-1-31 09:264 f7 m3 E# r+ D1 l6 P7 c( N! H
在20MS内会多次触发你的键盘中断,每次进去你的状态机的值都在变,你如何判断哪次是有效的 ? ...

/ {7 Y" A' d5 a  [是20MS进入中断检测一下键盘,不是触发键盘中断
holts1 回答时间:2015-1-29 08:10:11
wambob 发表于 2015-1-28 08:53
) |; ]) _" x3 q5 T* ]$ r! [进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉

/ c7 k3 n0 g9 [你的键盘处理也在中断中,这个有点不合理
holts1 回答时间:2015-1-28 08:10:33
为什么放中断里 ?
wamcncn 回答时间:2015-1-28 08:53:02
holts1 发表于 2015-1-28 08:10
8 G- ~7 J+ U: }0 a- W. u为什么放中断里 ?
. n2 [8 c- w' W( A7 Z1 ?
进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
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
: [5 p1 t- x- W而且你用键盘中断,消抖如何处理 ?

& I/ Z4 X- t" L2 O% L关于消抖,建议你看看状态机按键原理就明白了
holts1 回答时间:2015-1-30 08:17:28
wambob 发表于 2015-1-29 12:11
* i0 e6 D, T! x+ l& R' \- P. f关于消抖,建议你看看状态机按键原理就明白了

; c' m+ b, ~; V7 u你在键盘中断中处理按键,状态机原理有冲突啊?
拼命三郎 回答时间:2015-1-30 08:26:16
stm32.jpg
wamcncn 回答时间:2015-1-30 13:11:06
holts1 发表于 2015-1-30 08:172 D6 o# J# ?1 H9 q
你在键盘中断中处理按键,状态机原理有冲突啊?

9 U. y3 B) t3 H8 z6 I9 i请问冲突在哪
holts1 回答时间:2015-1-31 09:12:30
wambob 发表于 2015-1-30 13:11
- O# i: [# C6 S7 n. \请问冲突在哪

2 _/ ~9 q5 x+ G  d. E抖动的时候仍会进中断,状态也跟着抖,如何消抖。
12下一页

所属标签

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