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

【经验分享】STM32F0 按键程序

[复制链接]
STMCU小助手 发布时间:2021-11-21 21:00
  1. #define     HAVEKEY_PIN    0x0003            //
    7 s- D* {9 g+ {/ x& U$ w/ C- _) G- g4 W
  2. #define     KEYPOP                0x0000( t4 H& Z6 ]8 [1 Y

  3. " B: T$ R' L, y7 K8 j
  4. #define        KEY_START_PRESSED            1            //
    3 E) G1 N! o  G" y4 @

  5. + M, H* l1 G" R( N! }7 I
  6. typedef struct 7 A' g/ n( W* Q& y5 z. g
  7. {3 q/ f/ i! {* d" _+ k& J( ?
  8.     INT8U     bLastValue;                          //
    , C9 A/ a" a; l% n5 R- a( C
  9.     INT8U     bDebunceTime;                        //" D& {! q8 N% z( {9 d
  10.     INT8U     bPressed;                                //
    : [/ I& W/ v6 m# _1 |
  11.     INT8U     bValue;                                    //
    : c4 c/ a% Y& }7 F
  12.     INT8U     bState;                                    //   
    # w) E# f+ w: `# ?3 P: s" S7 t  Z
  13. } tKEY;
复制代码

2 P8 w  `! m* c2 \. S5 m: ~4 Q1. 按键IO口配置
2 `! B9 D% f$ K/ V; s4 q* n$ t- l3 H! P+ b7 z6 E1 k. N
  1. void KEY_Init(void)
    $ o1 W4 E4 q- Y# N- |
  2. {
    2 A% k, ?; K3 m8 ^
  3. / V! N2 p6 l# V0 |) b
  4.         GPIO_InitTypeDef GPIO_InitStruct;. Q6 O4 s( Z3 }+ }( ^: [
  5.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_KEY_PORT, ENABLE);
    7 Y8 I2 ~/ D( l
  6.         GPIO_InitStruct.GPIO_Pin = PAUSE_KEY_PIN | CLEAR_KEY_PIN ;//| ENTER_KEY_PIN | SET_KEY_PIN ;
    * I, F. Z( s5 c) r0 l
  7.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;  //GPIO_Mode_AF,GPIO_Mode_OUT
    0 D9 _/ w( ?" L! Q8 x! {  I+ B
  8.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_2;4 z1 h# |# f5 F. J: ]) ~
  9.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;7 u% e8 M% p4 e4 Q& c; p
  10.         GPIO_Init(GPIO_KEY_PORT, &GPIO_InitStruct);3 h1 |* T7 Z0 b% @
  11. + a. A" p+ I$ S  `) H+ ?* \
  12.         memset(    &KeyCtrl,0,sizeof(tKEY));
    # k& A0 x  \, M; b/ Z: A
  13. }! P% j8 B; d4 y( u
复制代码

: H* i* n; z4 M; @+ J% Q) n2. 按键debunce时间,在timer里调用
7 o; m- t4 L! }/ S7 f3 D9 A0 |+ R, O; A' w/ t/ @" ^! _0 {  q
  1. void    KeyCtrlbDebunceTimeDec(void)
    7 @  y0 }4 L1 h, L, p
  2. {
    1 G+ i" ?0 W% S) `0 F
  3.         if(KeyCtrl.bDebunceTime)
    . c0 r7 D/ B1 y1 J
  4.         {9 K) P5 p/ Y8 d2 A1 m* R8 ?
  5.                 KeyCtrl.bDebunceTime--;
    , {+ r% q6 i( k" D6 e0 @9 M! [: ~" I, p
  6.         }
    ! a$ V" v8 k) _* z0 D
  7.         else
    % O& }" K. h2 G  z
  8.         {
    / ?6 Q9 A# I1 I( y7 Z6 j7 I
  9.                 KeyCtrl.bDebunceTime = 20;
      C7 d8 R; V4 d" L
  10.         }
    " S( p  a; ^- Y
  11. }
复制代码
9 N( t7 _2 g7 A8 Y7 j' H
3. 扫描按键
/ l* g" m9 l8 Z) y% B  N

- W& q8 U3 Q. B# R3 E3 ]9 B+ d
  1. INT8U    KeyScan(u8  *bKeyValue)
    2 d9 n$ J4 M- A" k, c
  2. {
    ; O3 x! b- v0 s" X* G/ I- V2 M
  3.         int TempKeyIn;. \" Y# J2 n3 O
  4.         TempKeyIn = GPIO_ReadInputData(GPIO_KEY_PORT);
    $ l% X) p" k. c( a) b( X9 @/ j

  5. 0 E2 F, Z& o9 `2 d5 N2 g
  6.         TempKeyIn = GPIO_ReadInputData(GPIO_KEY_PORT) & HAVEKEY_PIN;    //get high 8 bit) m9 }1 z& [1 k, {0 z
  7.         TempKeyIn = (TempKeyIn ^ 0xffff) & HAVEKEY_PIN;% `% N. g7 H8 k3 |
  8.         if(TempKeyIn == 0x0000)                                                                     //no key pressed
    1 l/ N9 l  g; n0 s5 d$ G+ w
  9.         {
    , W" I2 P* e7 T) _% Q8 _* w: }
  10.                 memset(    &KeyCtrl,0,sizeof(tKEY));        0 j# _( p0 g$ H/ t/ `
  11.                 return NOKEY_PRESSED;        & g2 G* `, l7 i5 f9 f' O
  12.         }
    - b1 d  `( K7 K! \" u
  13.         else# T! t1 ^2 ?2 G; I, p
  14.         {& V7 q! D& G0 L6 [; y+ q1 C' M, b
  15.                 if(KeyCtrl.bState != KEY_START_PRESSED)        //start key pressed, T  Q8 B" V; ^6 U! O& a
  16.                 {
    ! Z" j" d+ m0 `4 j/ b
  17.                     KeyCtrl.bState = KEY_START_PRESSED;
    % S; m: O1 o, w4 m  |( ~8 W
  18.                     KeyCtrl.bDebunceTime = 20;                            //10ms/ _# c" g5 \( N; b% x5 W5 g6 t9 X
  19.                     return     NOKEY_PRESSED;* `9 C+ [7 b8 y" ^3 w! e4 K$ Y7 W: Z
  20.                 }! k/ M% m, z* q
  21.                 else
    * p. |7 @- F4 g& x' T
  22.                 {4 Y" o  R/ V0 P7 _
  23.                     if(TempKeyIn == KeyCtrl.bLastValue)        //lastkey  D/ `* T2 ~1 K" A! m# e5 e
  24.                     {
    ! Y* K) z, `) [$ ~5 b" m+ U
  25.                         return     NOKEY_PRESSED;& N% f/ F6 P( A+ z% w% Z! z' H
  26.                     }
    ) h4 r  [$ w; Y# Z5 t- H+ `5 r
  27.                     else
    + B- g6 S# Z# Z: C. E( @% U' c
  28.                     {
    % U& N# X8 p* t% p. S7 `% g
  29.                         if(KeyCtrl.bDebunceTime !=0)                //debunce time? 10ms0 D# T" O+ v3 V8 I* R
  30.                         {) ^7 Z5 F7 G, d% u% B
  31.                             return     NOKEY_PRESSED;
    5 C6 Q* l; e$ P9 q# M- ^! d' g
  32.                         }
    2 O9 L. d* P1 j0 `& F
  33.                         else0 Y# o1 U7 W8 @2 \) b% N& O
  34.                         {! \5 v0 v- k- X
  35.                                 KeyCtrl.bLastValue = TempKeyIn;1 G: }) }/ R2 `* }' }
  36.                                 KeyCtrl.bValue = TempKeyIn;
    * c+ [1 K& _% Y' `$ n& D
  37.                                 *bKeyValue = TempKeyIn;
    3 r. k5 K( K7 R; j- \- e; G
  38.                                 return  KEY_PRESSED;
    ) r, g0 t! j/ K
  39.                         }
    : ?+ Q5 Q) b% D3 S. @
  40.                     }
    . G5 X- _  |( |- W5 @
  41.                 }; P8 \4 f' M$ G% ?2 V9 S: K9 R! _
  42.         }
    : Q, i3 O2 g' {; i7 e2 I# x
  43. }
复制代码

; J1 p3 p. }% p  ?+ Y4. 按键处理6 b( e" p8 {4 w3 k/ D$ Z3 M

# ]1 s6 h% p" ~
  1. void    KeyPro(void)
    : ]3 w/ @& N8 @' v
  2. {. C$ ~- |  [9 ?2 A4 I) ^% h+ ^
  3.     u8    KeyValue;" w% k/ l/ F) j1 T" B+ S, V3 C$ R
  4.     if(KeyScan(&KeyValue) == KEY_PRESSED)" l0 |0 ~* w+ ~( J' H3 m% c
  5.     {
    * z6 n/ F6 G. s8 t$ _9 Y
  6.             if(KeyValue == CLEAR_KEY)
    , o  n5 f7 }' w5 d4 }
  7.             {" }4 Y9 e- ]9 e' O2 [
  8.                 ExtiCnt = 0;* w/ s" L0 M9 q- V4 @
  9.             }
    + V8 I% ?# @# `& k0 a2 Q
  10.             else if(KeyValue == PAUSE_KEY)- t) Q0 s& M2 a
  11.             {' E3 k2 F. C% `' f& p" e
  12.                     PauseFlag = ~PauseFlag;/ V9 F0 ^  C' M; ^
  13.             }$ p. x& P( y6 `  F* {
  14.     }
    5 s# q9 f' ~+ ~: K( d( M0 ^9 X
  15. }
复制代码

* I4 r' `/ ^0 Z/ {. O8 O
9 O. h* |7 P' D5 Z2 D' C' S
收藏 评论0 发布时间:2021-11-21 21:00

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版