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

【经验分享】STM32f1之4*4矩阵键盘

[复制链接]
STMCU小助手 发布时间:2022-5-14 22:00
前言( \+ }4 h" h# @4 W6 X& T- Q
4*4矩阵键盘对于实验来说必不可少,那么如何实现矩阵键盘基本功能呢?今天就简单地介绍一下如何利用矩阵键盘和LCD显示出对应的键值,直接进入主题。
- \# D& N% N1 C& T/ Y
4 v4 u) H) J! J, T" X% A! M7 Q一、4*4矩阵键盘的使用. n# q6 l0 j: Y. l
首选,了解它的原理很重要,但在了解它的原理之前,先来看看它的样子。8 ?! y8 Z1 o3 d4 X, R
- T8 o  G, s) V" j. I1 \/ S
92SFT$XD[ZI46C09)Z1DO.png " y: s3 `1 k0 R+ D
. ^4 r" q0 a) s' X1 h7 P
我们可以看到,4*4的矩阵键盘对应有16个按键,分别对应键值0~15(也可以自己设定),然后你会看到它有8个引脚,其中四个是行控制引脚,四个是列控制引脚 ) z% s" `1 r$ _& X# f1 ^7 U* _0 L

8 N0 E7 G& h6 _- C; { 2U`{5JF8ELACUMF_)NWUC}A.png
$ P/ Y" @4 R) F% E- N$ k/ v6 z" q& n- e3 K, R2 k3 _
上面就是它的主要原理图了
* |1 M+ K1 b- Y" v0 c9 A4 R. B- _+ M1 S
9 l) c) b) ~/ n) e  R" e在8个接口上,很明显的标出来C1~4和R1~4,C是column(列),R是row(行), J- ~) w6 ]' W8 `

8 ]! K; h7 c* |它的扫描原理就是通过高四位输出高电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一行按键被按下。: _) B4 n. A. I2 i# J
2 s) g4 h: C; t5 _( |8 ^
二、代码部分) W, d7 _8 `7 `
下面这个代码部分比较简单,就不一一详解了,大家可以自己解读一下,或者在评论区发表
( ?) Q6 Y6 D0 ?, x# I' J2 `; ?, y' d. f  e6 }7 C
  1. #include "sys.h"' [- v6 H0 R1 |4 E% ?2 s" {
  2. #include "kyscan.h"
    ' H6 s- g1 H# @; \8 H7 M, z/ a
  3. #include "delay.h"  K' ^* ^# M: K: D$ I! S
  4. #include "lcd.h"5 I1 w( S- K$ f9 d9 W
  5. ! s0 }& u5 d: g3 M3 n2 [

  6. 6 M7 A" ~% ?. q7 @
  7. void KEY1_Init(void)( Y: l7 X8 \5 s1 Y2 E
  8. {3 E( r% P) N" g3 F$ x) p7 `
  9.    GPIO_InitTypeDef GPIO_InitStructure;( Y2 ?4 }0 g6 z- J% K6 I6 N
  10.         
    , H5 b! s5 a# M# N& I0 v/ S
  11.    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//??GPIOA?B/ t6 A7 }7 x: R' }# e
  12.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//????  
    ! o5 m2 g! t5 Z6 y. x9 g
  13.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;    @; a2 m  i" D5 R
  14.    GPIO_Init(GPIOB,&GPIO_InitStructure);
    + Z/ |* X( r! S: G! s, J
  15.         
    * s* N; T6 v9 x1 E8 M
  16.         
    2 Q  Z" @$ i0 B, Z6 Y3 K+ d) G
  17.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //????
    ' A& I& H  R( }5 r/ \) m! x
  18.    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;      ! B. M- a8 l+ W* _3 ]% [) t& Z
  19.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;1 J/ z0 A( M! W, a  U
  20.    GPIO_Init(GPIOA,&GPIO_InitStructure);      
    ) i" T$ D+ U6 x- V/ B5 a/ r( J# P
  21.    GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //??????,???
    $ I9 W. r, l; L; P
  22. }1 c- s: v4 q7 e5 O$ u  I4 H
  23. void KEY2_Init(void)! A/ y5 \: Y+ r& X( T* F8 g* a+ b. l
  24. {
    7 n6 ~0 t6 C9 w0 K  \# A
  25.    GPIO_InitTypeDef GPIO_InitStructure;6 c, B7 ~& n# ~: j
  26.    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
    8 N& K! _0 g# z: e7 P& u

  27. 9 X* t. h" P8 @7 h
  28. ! D& V7 k0 o1 d  S" O, F
  29.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //????
    / P9 i6 E2 |! F8 F# }7 ]' s+ U
  30.    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;5 T4 [9 u* Q% i8 a9 j( [2 e
  31.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    / W# _' K' R: d3 B+ m
  32.    GPIO_Init(GPIOB,&GPIO_InitStructure);
    ! a8 f) @5 k9 u# O0 V- g
  33.    GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //???
    & z( W: J8 v; M
  34.         
    " f; j- Z1 P: m  W9 x
  35.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;   //????! \5 m2 v: Z2 I" [
  36.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;6 m+ \  @- ]. D2 M+ ^: ~( ]0 m
  37.           GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;3 q7 f% S0 A& R5 U/ M
  38.    GPIO_Init(GPIOA,&GPIO_InitStructure);  
    1 J: L. O6 V( j6 H3 Z. R4 |/ s
  39. }0 L* i7 F% G: _* g6 I' W  m8 V0 b! g
  40. int KeyScan(void). ]8 n8 s0 z6 [: S
  41. {- C3 b. u$ U/ v+ y& t
  42. u8 column=0;0 L& m, I4 Z! _3 o, e8 g/ A
  43. u8 KeyValue=0;8 P3 p; ^) S6 H( x/ v3 X* Y
  44.     KEY1_Init();    //??????,???& X0 Q( J$ M# h0 ]
  45.         8 j. [% M- [4 I
  46.   if(PBin(12)==0)! v, p5 \2 S2 u  |3 u: e4 G: }
  47.   {
    . W1 |, A/ g9 ]. R. Q
  48.    delay_ms(50);2 f' F9 P3 O! z0 q# E* F
  49.    if(PBin(12)==0)
    7 E' r( G# p& F& O3 X9 a
  50.    {7 G  I& L3 P8 k* H) U/ W
  51.     column=1;        //???
    # @) {- q$ H: G9 `9 E/ |
  52.    }
    1 Z$ f  y5 B" l) ?
  53.   }
    & A: }6 W$ S3 M5 |
  54.   if(PBin(13)==0)
    . C4 b$ i1 A, M$ u; _7 F  J
  55.   {
    , }7 P8 Y7 g9 S& @
  56.    delay_ms(50);
    4 H( ?# a, j, d: I5 c2 A- H
  57.    if(PBin(13)==0)1 i6 E4 ~9 k+ H% e
  58.    {; l9 B$ `# |* w: p
  59.     column=2;        //???) g+ x4 u9 W5 j
  60.    }2 O# [+ A2 K2 t4 M- [
  61.   }
    0 }) Y/ J  a6 D$ J; ?  m  h# g
  62.   if(PBin(14)==0)
    * ?- R. R8 \, A3 X. L
  63.   {
    7 [* u+ I$ S. G( [3 ?
  64.    delay_ms(50);8 }5 q( m# N, s- J9 {
  65.    if(PBin(14)==0)
    + D4 E# \+ V5 K
  66.    {3 i4 f# A& t, G2 C# l5 G# \& R# \; O/ P
  67.     column=3;        //???
    # r9 m4 K2 x7 d2 }9 }$ A2 }
  68.    }
      N7 L) k5 d* ]+ ?, Q
  69.   }/ s4 [7 X7 v! n; k% G) ~
  70.   if(PBin(15)==0)' a+ v3 h+ `. n) T# v* l- E' f
  71.   {
    ' I% [% h8 a: [" D
  72.    delay_ms(50);( F/ V' v( s+ ]5 v! u/ R" A2 K
  73.    if(PBin(15)==0)2 T, {6 h  H: e* _3 E9 W, J
  74.    {
    ) r0 x) ?/ i' g8 F' Y* o
  75.     column=4;        //???4 A( k* q6 h$ z. |' {+ h
  76.    }
    8 X0 v0 x. F" a
  77.   }  
    , E; P. Q$ u( w) `, L# \7 P1 y
  78.   if(column==1)  3 P1 A  U& p, c; T: I$ x7 U0 p
  79.   {7 p0 ~  I% y, I, J% Z
  80.     KEY2_Init();     //??????,???             * A+ z. p. ?  p. _" k% x+ o6 N
  81.      if(PAin(7)==1) //??????1 t: J5 @+ L# r. h* \
  82.      {' x- U  v3 J9 f3 o
  83.       KeyValue=0;  
    + y; Y* J# }; m
  84.      }8 M( E% z) G! S* x1 o3 Y/ n  J4 [
  85.      if(PAin(6)==1) //??????
    ( U; C8 H& O+ J0 A( ]
  86.      {
    ; N: `4 N! }4 R$ d% c: p% S2 `5 `
  87.       KeyValue=4;2 p* t7 A* Y. G8 L. _0 I0 {

  88. 8 q0 D. o. i  E8 B6 K1 u, l. L% H
  89.      }
    ) L$ V* M( X% }* Y3 D% D
  90.      if(PAin(5)==1) //??????9 Y/ D1 m  v9 C+ t) R0 I% a3 \
  91.      {
    ; r  g  w8 T5 M/ Y3 N8 Y
  92.       KeyValue=8;
    1 I/ P2 ]+ _: O! M

  93. % k. }2 c& K- B: M4 W
  94.      }
    % F' G7 x! q3 d. ~1 o5 E
  95.      if(PAin(4)==1) //??????
    - d: p/ |2 E8 x8 F& \' g% P. q
  96.      {2 k0 ]# G, A' ?
  97.       KeyValue=12;
    : @5 n, w" |! z# V" B
  98. ! h) O8 d, s, K  ~* ^8 ?
  99.      }% ~3 c9 L# u7 ~; E% w/ q! o

  100. 0 H. S+ m( H; q
  101.   }
    " o& F6 C3 c" d+ Q- v0 a+ W

  102. # t; B; B( }8 W; ~& R  T8 e1 b1 [/ l
  103.   if(column==2)
    ) z5 R9 H, Q  ]
  104.   {, T- ]: T+ |( p0 s6 a3 L, U
  105.     KEY2_Init();     //????               
    8 K+ M4 a! G, [  o; q: g" W
  106.      if(PAin(7)==1)' Y$ V+ h' b  g
  107.      {( D* v1 c1 E5 j# q
  108.       KeyValue=1;* l- z% I! t- r' v  I1 S
  109. 4 h, D$ V# X6 G, X. Q6 F  T3 L( z
  110.      }
    % ~! r/ L. A9 s0 t- F
  111.      if(PAin(6)==1)$ E2 P( M. z' c' s! }8 y1 F
  112.      {/ k; p1 K* Z& f5 m0 u4 {+ B
  113.       KeyValue=5;
    / }5 @  ]; L  X$ z& J

  114. ; D" L! b$ @7 t6 I! F" y2 A' X+ `1 G
  115.      }
    - s* _" v: }* u" F9 ?: _/ }
  116.      if(PAin(5)==1)6 a+ o/ q9 R; Z: s2 l
  117.      {
    " V+ `% d. V0 `( }+ W
  118.       KeyValue=9;6 i8 s% j- J* t' P- o

  119. # ]' |, H( ^) V' V( U; X
  120.      }' u, a3 W+ c' W; h' `
  121.      if(PAin(4)==1)0 n8 r$ n9 m; u" \
  122.      {
    ' ~: L. Y  _  J2 ?3 k( v$ S
  123.       KeyValue=13;
    ; I& `) T0 C6 D1 s- I7 W9 _6 s
  124. . y) {! `$ W9 ^9 r8 v! z) m
  125.      }0 t" a; a7 p0 r- M

  126. 5 T) N+ Z* k; W5 h
  127.   }  
    4 R# v+ T/ E* c% {6 j
  128.   if(column==3)
      U* p+ |5 p5 v* }2 W$ w
  129.   {
    : w" |  o; B% j% T4 Y, D
  130.     KEY2_Init();                  
    ) \0 R+ L& c" v4 n# H
  131.      if(PAin(7)==1)
    . A. I2 g- z' {4 c
  132.      {
    " q) O+ e1 U9 z( T) z9 i/ n
  133.       KeyValue=2;
    ) {+ U# L* k' v% W* Y7 I4 `
  134. # ?9 x2 @1 H1 j7 [
  135.      }
    / Z% S6 y1 L5 |! R
  136.      if(PAin(6)==1)# l1 [& W( c0 K1 h! W" L
  137.      {# h' M0 k% I0 c; P0 I) `2 [
  138.       KeyValue=6;/ q: x8 m7 c! @/ P( n* j4 V3 c

  139. ' u) n4 s6 E+ B- u; g) l! H% B1 @
  140.      }
    ' S2 R: g: a* e0 i* U( G# Y6 N- }4 R
  141.      if(PAin(5)==1)& l" b6 t! f' |! O4 O
  142.      {
    7 I5 E8 D; Q: S, X2 S- @- w) P  R% y
  143.       KeyValue=10;
      Z0 c1 L9 e1 z7 C

  144. " G9 L4 ^# s$ O5 q! m& j, p
  145.      }+ F& D, j: k3 P7 v
  146.      if(PAin(4)==1)! q4 u) ^# F7 _
  147.      {6 N$ j: R& S9 ^5 a
  148.       KeyValue=14;9 j: E$ G0 }) ^4 B) L9 c
  149. , Q! U' u$ [* o0 F4 ]3 D
  150.      }
    5 ]! [2 `% U! K

  151. " {* Z% z5 p8 D. J; O3 {
  152.   }
    / p- P; z" q' N# ?
  153. 1 P7 e$ s0 K) {8 E$ a
  154.   if(column==4)
    5 q) x6 _0 @9 H  V+ m  D/ _; K) c
  155.   {8 r$ H7 Y) P; ^2 B  R8 _1 A
  156.     KEY2_Init();             ! L8 g* @5 c* T) B3 ?7 \# r9 o
  157.      if(PAin(7)==1)) \4 h5 n  ^+ S6 a0 O9 v1 n
  158.      {
    : N! K( Y0 J( I0 Z. d) v# a7 i
  159.       KeyValue=3;. m( n# @$ `; |1 r1 U
  160.                  }. z0 J* K8 ]9 O% c# m# {3 E  \
  161.      if(PAin(6)==1)
    / |0 r) D6 V! ~+ m1 V  s  z$ N2 C
  162.      {! I/ _% J# g7 K  R
  163.       KeyValue=7;
    3 Z% S) e* i* R& [) I8 F* _: V- `
  164. ;   - u" i# T8 L4 P( [9 S
  165.      }' C3 P5 Q6 i% b- F# a# C8 Y. i
  166.      if(PAin(5)==1)
    5 G( f2 ~, S1 D. q
  167.      {1 o9 @' [& [( O
  168.       KeyValue=11;
    ' T3 M( T2 W+ N
  169. % E' F5 f1 E0 {6 F* r; v
  170.      }
    ; _9 {# |6 Y+ B  c1 r) b
  171.      if(PAin(4)==1)( F+ s$ ?* g7 w7 W6 K
  172.      {1 l$ f& G' y" V. q
  173.       KeyValue=15;% y$ }1 K2 ~6 Z' `/ a
  174. + J" M/ R$ _3 Q* ?
  175.      }    * p/ L; s, j4 u$ L7 D
  176.   }( I5 t" }- Y! O" b+ J/ v
  177.     return KeyValue;+ r( y% G) o0 T  J8 S( M
  178. }
复制代码

% h+ `6 F8 q, e: J; K! a, H这里其实就是采用了扫描的方式,所以可能会有一定的延迟,大家可以采用中断的方式会更快。$ n, z$ w: B4 Y3 p# p9 r

1 c' p* T0 u& Y& a对了,我定义是先扫描列,因此这里列我是接PB12~15。8 t% y6 ?- q* f. t" A5 X' z2 f
+ r$ t; o1 J* x6 P: h
下面附上头文件
0 ^7 D& A8 s  T, {7 e
& h# I' h" M  P) ~9 [" }4 G( M/ Q
  1. #ifndef __KY_H: |# c: c6 O. m1 @8 a7 S4 n
  2. #define __KY_H  , G) a  Q& S' A: U8 h! E' }+ M
  3. #include "sys.h"
    & U3 Z$ `* ?) o5 {
  4. / N6 L. a2 m+ K) \
  5. 5 m5 E/ B& a: y& U
  6. void KEY1_Init(void);
    : l! h# h0 ]3 e2 l# L
  7. void KEY2_Init(void);
    0 j( X/ }  d* _: S- i; A+ K; b
  8. int KeyScan(void);
    0 ?4 {2 W  a$ W  u
  9. int KeyScan2(void);: q: G& ?& b) v  i
  10. / ?2 ^% d% q, h6 t
  11. #endif
复制代码

# o! X4 R2 I! _9 F: A. _三、总结
4 c1 I3 X: p- M/ Q0 g& I: D今天这一讲是比较简单的,下面会附上实现图,希望对大家有所帮助,谢谢每一位访客
4 i6 H/ l7 u/ ~: o; l* t# H$ F8 k; y1 B2 A7 D" U7 z2 W* M6 O
如图,按下键后返回键值并显示出来,大家可以尝试一下。欢迎收藏关注!
! i8 I& p. g& z, G& ]
; }! _9 ?) a5 j `6J2XM`ZGV@)OX(~M{4MJIR.png
0 t2 @- K/ ?# W; |. {3 F& _+ g2 c5 S! K# p1 \- l- o( l1 {

+ Z# v: t! ~- M8 m. n4 R$ ]
收藏 评论0 发布时间:2022-5-14 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

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