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

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

[复制链接]
STMCU小助手 发布时间:2022-5-14 22:00
前言& k( p1 y6 w$ ^
4*4矩阵键盘对于实验来说必不可少,那么如何实现矩阵键盘基本功能呢?今天就简单地介绍一下如何利用矩阵键盘和LCD显示出对应的键值,直接进入主题。
% l. ^4 |+ [( @# h9 B0 s8 H; u! l( E3 G: B# K8 v7 ?* o0 H# q
一、4*4矩阵键盘的使用
8 a% v5 B; B1 j# q2 r& ?; w首选,了解它的原理很重要,但在了解它的原理之前,先来看看它的样子。& a( X) R4 M6 s' v+ N! ~) P7 ?

1 a0 U% f9 @& ]- X0 m1 Q- o 92SFT$XD[ZI46C09)Z1DO.png
, e" Z% ]0 I6 t# b0 C6 z5 l1 ^! q0 _0 P
我们可以看到,4*4的矩阵键盘对应有16个按键,分别对应键值0~15(也可以自己设定),然后你会看到它有8个引脚,其中四个是行控制引脚,四个是列控制引脚
+ H" B9 z5 F$ e& \& A$ e
$ N7 _' ^1 ^, b/ @ 2U`{5JF8ELACUMF_)NWUC}A.png 4 i7 Z" y) p, Z

8 j  P* \" G$ Q6 J( a上面就是它的主要原理图了% [: s7 p; v9 P: I: Q
% W7 M/ q+ n. u& `6 T( e
在8个接口上,很明显的标出来C1~4和R1~4,C是column(列),R是row(行)
3 v1 v/ G  V2 @
/ g$ z. r. b2 @; a1 }( B它的扫描原理就是通过高四位输出高电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一行按键被按下。
5 r$ K( K  B: b
6 A& O1 g4 @; u" \' h二、代码部分
; f' r; v1 e, `  W$ w$ Q3 b下面这个代码部分比较简单,就不一一详解了,大家可以自己解读一下,或者在评论区发表
! m$ l/ B3 m4 k* e6 Z
/ r# f% p! R% ]2 p5 z* F$ Q4 h: f
  1. #include "sys.h"
    ! \( u9 f1 K# M: B$ d6 x
  2. #include "kyscan.h"
    3 h5 ?, G; Z2 P5 v
  3. #include "delay.h"
    ; X/ _6 J* S* W$ W0 ?
  4. #include "lcd.h"
    6 i/ T1 ]  T) ^: c' }

  5. 1 K1 ~) E  O3 R. e

  6. & J( ^3 w, X, d; O; K! B; x# k
  7. void KEY1_Init(void)
    4 K# ?( R- A- I
  8. {
    7 j& q8 D* s3 k
  9.    GPIO_InitTypeDef GPIO_InitStructure;. t5 c) n0 C9 e- W
  10.         # a- s5 g5 i2 h3 W
  11.    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//??GPIOA?B
    & B+ I# T) y; @: r# w. H
  12.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//????  
    6 v; Z2 x4 W; D: k& d. g! V3 Z' r
  13.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;  
    6 a& W6 j$ a) ?
  14.    GPIO_Init(GPIOB,&GPIO_InitStructure); " T9 a* [7 M9 [* S7 d! d
  15.         
    3 k' F1 T7 Z+ U) \* }  U
  16.         
    + E) O# j# m- E- a/ T- u" O% x
  17.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //????
    8 P( }/ k% Z% K: [  X3 Y3 }
  18.    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;      . F" Q% G; m* K  E2 A
  19.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;' l, [' Z, k' d
  20.    GPIO_Init(GPIOA,&GPIO_InitStructure);      
    2 e! y6 E# s" n: k0 u+ y0 x# d* r
  21.    GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //??????,???$ f+ E8 \" |& X7 I3 m
  22. }
    $ [* L  _# {0 F( L
  23. void KEY2_Init(void)
    , {$ f5 z& L: K* o8 D6 d" F& s
  24. {
      }/ H$ ^. J0 h  B- N4 X. ^3 {
  25.    GPIO_InitTypeDef GPIO_InitStructure;6 ~" f5 d/ c5 ~. [! @
  26.    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
    ! p/ D# I3 M1 K* v

  27. 7 i- ^. X. d: J; a0 l5 D3 F
  28. , U9 V8 ]+ w3 ]% z2 }0 Z7 U
  29.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //????
    6 U; |$ K% ]* c) q
  30.    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;5 g3 i& q7 P& ]/ v: d( W& p
  31.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    + \) ]% N% A7 v# D8 c
  32.    GPIO_Init(GPIOB,&GPIO_InitStructure);* p0 Z+ u+ M6 u! q: j) A( J7 t9 I4 m
  33.    GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //???2 l/ d3 [3 m' y0 k
  34.         
    $ `' R4 M( B4 x% a# D
  35.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;   //????6 f  B  J- _! y' `% t: P1 u" i
  36.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    % G& g; l+ y' V" ?" D
  37.           GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    8 [0 ]5 a5 C# d+ y  a
  38.    GPIO_Init(GPIOA,&GPIO_InitStructure);  
    , [) n  N% h+ f& i! G
  39. }4 h% N/ }. A* H
  40. int KeyScan(void)
    & @$ K4 G0 I/ z
  41. {
    * ?" t! c; {! o' j/ v/ e! x
  42. u8 column=0;
    8 y, w( d$ }3 L' W7 P
  43. u8 KeyValue=0;
    ) b; u$ }5 z, h$ L( h3 @! f! ?. q
  44.     KEY1_Init();    //??????,???
    ' @) M- d- L; U! U4 i+ Q
  45.         . v0 l8 T6 E6 o( ?
  46.   if(PBin(12)==0)
    , w9 X; T6 B1 N  l5 W2 v
  47.   {9 L2 H9 [+ q+ _* R  X% A
  48.    delay_ms(50);' N6 P7 x3 Z& W
  49.    if(PBin(12)==0); s1 Q9 T5 D" b  L9 C2 P- D
  50.    {9 g, ~; A; l! U* g1 L
  51.     column=1;        //???; \! s) V/ P* K. w8 R! D
  52.    }* I5 x8 V; v+ j" m- Q
  53.   }
    " d7 K- j. \. R% h% }/ L  [! e1 v+ r
  54.   if(PBin(13)==0)
    . w7 T* k/ m! `. F
  55.   {
    , u9 f8 }$ ~& @! o( J( J# c( y2 D: y
  56.    delay_ms(50);
    % ^  E( B" ?; A0 }. h9 Y  `. b* `
  57.    if(PBin(13)==0)
    ) x% S+ c" `3 [' C, \: S& D
  58.    {
    8 [% P& ?  I7 U0 I' Z- E
  59.     column=2;        //???
    + }- N3 ]7 F! T9 f8 p3 C1 n% A  o
  60.    }2 A( y: U  V" o3 o& y, W. I
  61.   }# b% C; V& ^) J9 C! H
  62.   if(PBin(14)==0)
    6 A$ ^! E2 P1 F% o
  63.   {8 ]! ]/ ?8 ~" T1 {  o
  64.    delay_ms(50);, n2 v9 B/ `3 d# u& d7 F3 E
  65.    if(PBin(14)==0)5 O2 S5 C* b6 ^, D( K
  66.    {* ?+ j! m# A& D% ^
  67.     column=3;        //???( S' h9 [6 `+ v3 [3 b
  68.    }
    8 r; x/ r% J3 \
  69.   }
    1 ~" x% U2 u% }( {
  70.   if(PBin(15)==0)
    ( L/ L3 H: c; }5 x" l3 H2 o, w
  71.   {
    * @) T0 b$ h1 R7 [( G  V2 T
  72.    delay_ms(50);7 K2 \0 u) Y  |: `2 K
  73.    if(PBin(15)==0)
    1 U: c, L3 u* w% }! I( b# I
  74.    {8 I& C! q, o3 D- F. ^6 X% x
  75.     column=4;        //???
    5 r5 P2 q- L3 y& M# z3 [1 s8 \
  76.    }
    1 h  {1 k/ D9 K6 K% G  B
  77.   }  
    & L) d3 k8 {6 k# ?; [5 V& _, `; p9 [
  78.   if(column==1)  
    . o( r2 c5 ]# |, Y
  79.   {
    , G' ?4 `. S2 P6 R8 N
  80.     KEY2_Init();     //??????,???             # W8 x& S" n( {7 h! ~7 U" ?
  81.      if(PAin(7)==1) //??????. u0 n" t8 q0 A: {; j
  82.      {  y3 I* M. r, L/ n
  83.       KeyValue=0;  $ Q; d6 s  k& w# z* j, `
  84.      }0 \5 p+ F9 K# Z9 q! q
  85.      if(PAin(6)==1) //??????
    ' f2 Q4 o( c( o' s" d
  86.      {% c' N  W9 X  R! ^  j6 r
  87.       KeyValue=4;0 Q' `9 W2 B" `4 g* a6 X& i

  88. 5 ]& {2 g9 R' z6 n/ e) Z/ d
  89.      }
      T1 [* m. i" S. J" h0 `2 i
  90.      if(PAin(5)==1) //??????
    2 c, ^2 n9 ~. v: t8 G
  91.      {6 B2 |1 k: ?5 [- v  Y' H8 l
  92.       KeyValue=8;
    " c4 q* t) J' r8 _  \" w  C5 l
  93. + [+ t" ^2 i: p6 W
  94.      }9 n7 f( F. `2 c4 H8 q8 z2 n
  95.      if(PAin(4)==1) //??????1 ]0 t1 Q3 Q# O& x9 E. i
  96.      {
    5 f* P* x& ~: G. k4 k+ w& a
  97.       KeyValue=12;
    9 Q6 Z# c  A2 I  e1 M9 k
  98. " r8 z$ |3 U0 c9 h# m5 t
  99.      }
    4 k/ X$ z0 F* j  Y! P8 k( T
  100. . ^  ^0 R8 v' g) V5 q0 j
  101.   }
    . B  V4 e$ e7 R; T5 n4 x" _

  102. + p+ V7 ]1 ]  ~* g) G" q5 W. {7 W
  103.   if(column==2)
    6 w  b6 ^8 W7 k$ R7 p, c
  104.   {3 ^) i4 g9 L$ ~# n
  105.     KEY2_Init();     //????               ( c- e( b! t$ P: f# H
  106.      if(PAin(7)==1), R9 T1 y8 I* A- V* I
  107.      {# P% j# ?* L7 F1 K; H4 m8 M* B
  108.       KeyValue=1;
    $ h' }' u; Y$ d% a9 W/ M
  109. $ z. M/ d6 z; D( g; l0 b
  110.      }
    : O; @, J8 r) E5 I2 O5 Z1 \
  111.      if(PAin(6)==1)# U3 b! J$ e$ e0 D3 g: d5 n
  112.      {
    ( ^) l& Z3 T$ Z; ]8 Q
  113.       KeyValue=5;
    % Q! n4 P# O8 s$ S

  114. ! m9 i2 s5 |6 z: {1 Y7 o
  115.      }
    ; F9 e" _6 a+ U8 g4 M8 P
  116.      if(PAin(5)==1)
    7 u. V8 J* f  I: U* [2 c6 K+ K
  117.      {
      U& _& d6 Z) X. S  u/ |
  118.       KeyValue=9;
    ; Q7 ^* ~4 t  M+ o. ^  K

  119. # W, ~0 {: N) p1 P
  120.      }
    + B3 d  y2 x) w+ e* A  W+ o- G  @
  121.      if(PAin(4)==1)7 v% Z+ d  e& i4 q) e
  122.      {
    " H3 ~* B/ H3 n4 X5 r& B
  123.       KeyValue=13;& L: ~, \1 e( U& m8 o

  124. 1 j% E% K( y& r+ o3 G" r4 I
  125.      }
    9 T) r) K) o/ x
  126. ( b$ O2 _8 @' E' e- B4 r
  127.   }  
    & G( m0 Q  c0 A7 K; R! U
  128.   if(column==3)  b9 V  U$ d# s; Y9 G
  129.   {& \/ W5 s! }5 z8 s, L1 @0 A
  130.     KEY2_Init();                  
    ; G) _1 g$ h! S8 |) D) r/ W) k
  131.      if(PAin(7)==1)3 L' f4 _4 S4 o, ~. t: j
  132.      {, K. k0 J8 B4 x7 w: Z6 U  O5 i
  133.       KeyValue=2;
    , y1 p2 ^. f' e+ X
  134. 9 u6 O* A* T0 e* o) J
  135.      }& M) x8 s/ J  Q7 h4 I8 |1 v
  136.      if(PAin(6)==1)' ~3 Q( w# C2 K# \+ F
  137.      {
    8 V. s' B* S$ r0 z
  138.       KeyValue=6;! O# m, J% I: E: \$ S  L9 [

  139. 1 N% q& Z; `+ [4 g/ W9 ^
  140.      }
      J  f! R. \+ k* d
  141.      if(PAin(5)==1)
    0 i" W7 s( h& G5 N* v& m/ f$ E+ u
  142.      {" }0 U& q, q4 ]4 v  @+ T  s5 ?' \
  143.       KeyValue=10;
    ' y8 h' q, g! M7 j+ ~# M' }
  144. , A8 f" S3 `; d2 i! A4 M
  145.      }
    3 i' _$ Q& S9 w, Z
  146.      if(PAin(4)==1)
    5 {/ m# x- T  A9 |8 Y
  147.      {
    4 e/ Z  E# M5 i
  148.       KeyValue=14;+ X4 d# \0 L8 c
  149. $ D+ ?0 a1 i" Q; H( {; [
  150.      }
    , M. s# X  t/ Y2 {

  151. ' t, s- I! ~$ l: l  ^
  152.   }
      d! C' p, s  T0 E9 V
  153. " i% ]" [" F0 r* h  I; x1 C
  154.   if(column==4)
    : b1 Y: ]% p1 `+ D7 L0 i
  155.   {( m. Z& E: b) e7 Z6 y* {
  156.     KEY2_Init();            
    2 f6 C1 k2 c7 n; k4 M$ ^
  157.      if(PAin(7)==1)1 `+ s' ~. V# Z; \
  158.      {. g- ^6 u! o; J/ _: }( x
  159.       KeyValue=3;' o+ L) u/ g' h
  160.                  }; [( ]4 r& |# X+ }; c
  161.      if(PAin(6)==1)5 N0 W8 C  z8 V' J+ S& K
  162.      {9 \: w, q2 V5 I) x3 k; y
  163.       KeyValue=7;+ Y3 C6 i/ p  y0 b
  164. ;   
    1 J1 z% Q8 c9 H: w
  165.      }& ?. a% j6 C, Q7 e! S0 h
  166.      if(PAin(5)==1)6 N# k6 C0 Q$ j1 j5 X' \" {
  167.      {" n% C2 x, t6 A
  168.       KeyValue=11;
    + ?/ s, o8 O0 n7 x( o
  169.   z6 r5 X' X% k
  170.      }. l: s! Q! ]5 _7 U
  171.      if(PAin(4)==1)
    # t) t% @) {" V/ t7 r
  172.      {
    - g' R7 {' t$ f- z# z/ W5 K
  173.       KeyValue=15;
    / h' o, m" J( @  @$ f, c- d
  174. 7 e2 r0 j0 i. d$ Y7 B' \
  175.      }    , I4 g/ O+ w; ^& W
  176.   }) Q2 G' S8 B9 u& V2 r, G9 P( _
  177.     return KeyValue;
    # x* H) ~: g# s% a
  178. }
复制代码

4 F. i8 Z* |, D' c& @, t这里其实就是采用了扫描的方式,所以可能会有一定的延迟,大家可以采用中断的方式会更快。  O6 B4 J, i. w! ~/ q* i  _
$ [# r3 W. g. h& [. z
对了,我定义是先扫描列,因此这里列我是接PB12~15。9 C8 v/ ]9 G( O# R; I
* k9 U6 e; j- n' E5 d: x
下面附上头文件4 l2 c8 O5 n+ s% |$ ?
' k! L  @  L+ W9 \% H, p) y* y
  1. #ifndef __KY_H
    4 e3 q2 Y. R+ n( g# z3 O% U
  2. #define __KY_H  
    4 ?4 W' O4 j' Q( d* @9 L1 T6 b
  3. #include "sys.h"
    ) i2 G5 \3 ~3 X0 D* n" V# ?& V

  4. 4 b: u/ {8 X; a; E- _) V* D

  5. 6 i6 D' ~+ Z' V3 P% {; q0 U+ h
  6. void KEY1_Init(void);7 m0 U+ i0 j2 s0 Q% T$ X& i
  7. void KEY2_Init(void);
    , j4 f+ C# v% w& E& H
  8. int KeyScan(void);
    * f( H1 ]" O/ L, i" ?5 p( X
  9. int KeyScan2(void);" M" ?. B7 k) @) s$ T
  10. * L9 v$ o" D$ P4 _4 @
  11. #endif
复制代码

% l$ O" @5 C( V  J& k三、总结7 I  a) k6 O8 X! T
今天这一讲是比较简单的,下面会附上实现图,希望对大家有所帮助,谢谢每一位访客3 K0 P- {* d9 S+ S
3 b: ]- c) p8 ~
如图,按下键后返回键值并显示出来,大家可以尝试一下。欢迎收藏关注!
6 l; |9 e- H$ p/ i" B0 E2 {* i* q
( u2 t+ ~+ n9 y4 i, [& C+ A `6J2XM`ZGV@)OX(~M{4MJIR.png : T: L+ k& `2 P

# W% k: b! a0 H2 B1 ]
8 u0 B" F+ r. K2 i8 ~  T( l: r/ ^, b
收藏 评论0 发布时间:2022-5-14 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

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