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

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

[复制链接]
STMCU小助手 发布时间:2022-5-14 22:00
前言1 W) m$ a2 s: z, N) D/ b9 p8 O% h
4*4矩阵键盘对于实验来说必不可少,那么如何实现矩阵键盘基本功能呢?今天就简单地介绍一下如何利用矩阵键盘和LCD显示出对应的键值,直接进入主题。
; ]4 ^4 ?' h$ M# b; Z. s7 G  d. ?7 p% p: M% m" H0 p2 K
一、4*4矩阵键盘的使用, Q1 y/ k( t6 F! P
首选,了解它的原理很重要,但在了解它的原理之前,先来看看它的样子。
* d- v  |3 m) [
; j* I7 T7 E# M' H' Q 92SFT$XD[ZI46C09)Z1DO.png 8 H! G7 u! Z( C8 B; N2 |* c8 k

, Z- Y; r6 {) r: \2 V我们可以看到,4*4的矩阵键盘对应有16个按键,分别对应键值0~15(也可以自己设定),然后你会看到它有8个引脚,其中四个是行控制引脚,四个是列控制引脚
' [! o$ E% a, c  H9 C8 L, V1 T7 `' \# ?7 V4 P8 j6 \
2U`{5JF8ELACUMF_)NWUC}A.png
0 E0 D9 ~: y! D- z9 S, J
9 k* ?, i& J; m% d" e上面就是它的主要原理图了0 Z1 E# ~4 D. l9 J/ ?4 M

  _" h! O; _: [0 y8 J) w, m在8个接口上,很明显的标出来C1~4和R1~4,C是column(列),R是row(行)0 d. F" B% s  y3 }

! E( x* c) T. a8 [# I" _* h它的扫描原理就是通过高四位输出高电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一行按键被按下。
2 p+ v( {- E0 E0 B. C9 T% i- q% J8 A. u1 Q! L* W
二、代码部分
  X( q7 u; Z- i, @下面这个代码部分比较简单,就不一一详解了,大家可以自己解读一下,或者在评论区发表
; d' ]- x* ]$ l. O8 c) H" e0 c6 z& I0 u, }0 f
  1. #include "sys.h"4 N7 Y+ F- \. z+ I) L
  2. #include "kyscan.h"( u3 H$ D5 Q# _% z/ X& X
  3. #include "delay.h"' f( @8 s' d+ R; Q( d% w* e3 i1 a
  4. #include "lcd.h"& z9 ^6 ?5 S# x9 p( \
  5. " q* I  T' H4 i9 B$ C

  6. 3 v4 m+ B8 X% r; a
  7. void KEY1_Init(void)
    ) X: R, @. z( d  C- V3 \5 [
  8. {
    7 t7 q; o' [- E& o
  9.    GPIO_InitTypeDef GPIO_InitStructure;
    4 g5 F9 O) `* a5 f' l0 x  C
  10.         
    9 a9 M+ b% T8 p) y) Z" }. O3 {
  11.    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//??GPIOA?B$ f. e5 g$ `2 a
  12.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//????  2 w; L' l3 O& Q; t
  13.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;  % y; e4 J9 x+ d# e! a2 s
  14.    GPIO_Init(GPIOB,&GPIO_InitStructure); 3 J) Z& {0 {5 `8 F& l0 O& }# v
  15.         4 L& ]5 ?0 j6 r7 G! u' \3 Z4 U- x' [
  16.         8 n% W4 M& S) G) Q5 O
  17.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //????
    5 L$ C- y! L0 k. B8 e
  18.    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;      5 g/ ]7 }' L7 }3 l
  19.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;; O. Y( E' y; r5 `% k* {
  20.    GPIO_Init(GPIOA,&GPIO_InitStructure);       4 C: k4 V6 `- o, ~2 ~& K; @+ R4 b
  21.    GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //??????,???5 _) ^! O# h6 c
  22. }. Z  q, W, M" Y* l; M& s, e
  23. void KEY2_Init(void)* n& _9 J* s( L' Q
  24. {  E; }' m* z7 @$ |0 Z# e4 s, H1 v# A
  25.    GPIO_InitTypeDef GPIO_InitStructure;5 F* [6 F$ u! D4 {+ b0 b# g
  26.    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);0 {4 s& E4 c+ S7 t
  27. # H8 N) M% l3 ^  b
  28. & D- ]  i& `0 L2 t, G$ @. ~
  29.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //????# b# f8 H3 Y; X$ ~' P7 e- I' n
  30.    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    $ l2 I) |" J  `* y: Z% q% n
  31.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;! m6 K. Z* n( B' ?" D) ~& T
  32.    GPIO_Init(GPIOB,&GPIO_InitStructure);
    % ^  ^  q- C# @" L6 `
  33.    GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //???
    ' L5 q0 B# ]6 o! a1 o0 O+ x
  34.         
    9 Y- P+ U$ R  o- s$ _# h
  35.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;   //????
    - K. o! ?+ l$ g  C
  36.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;$ H2 d9 r+ _/ q, s4 J
  37.           GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    6 ~% N7 C. N/ j7 a; Y
  38.    GPIO_Init(GPIOA,&GPIO_InitStructure);  2 A* Q, G) y9 q2 W, f1 f
  39. }
    4 [  Z& Z( g& G4 C
  40. int KeyScan(void)
    : {) o* G# N0 }; p* ^: o1 U3 _0 x
  41. {1 Q# s' z7 ]6 u  G
  42. u8 column=0;7 q9 G# b( d0 b- Y" U* K
  43. u8 KeyValue=0;
    2 E& ^8 k! o" M
  44.     KEY1_Init();    //??????,???
    / j4 M( Y+ S' G6 H/ j- N
  45.         5 h% v8 A! [$ y5 O5 M% V6 k; [( s
  46.   if(PBin(12)==0)$ Z; C5 B: `: f6 R& n0 f
  47.   {
    : ^" B7 K. d6 U  Q* ?) h) l
  48.    delay_ms(50);
    5 Q" n$ t3 L/ j' _# ~9 Z% Y& Y6 b
  49.    if(PBin(12)==0)
    3 k2 E7 t8 O- E. C1 n
  50.    {1 _& f+ C) \% D: a& J2 o
  51.     column=1;        //???
    ! G8 t2 T  g* f+ X2 U2 i3 Z7 ]
  52.    }2 d& M! F. A) R5 c. B
  53.   }9 _4 P7 O' x! N* T" Z" ]
  54.   if(PBin(13)==0)& E6 X, N  t- p, R+ z
  55.   {
    1 z; s/ v1 L+ v0 E% L
  56.    delay_ms(50);
    & q# s# `' P8 L5 O
  57.    if(PBin(13)==0)
    + ~( l/ Z9 q  u" A9 z
  58.    {" j, x3 [, Y$ ]# h
  59.     column=2;        //???& D7 ]# d+ K2 _5 F& K* c
  60.    }: p/ T% h: R+ Z0 Q' ?
  61.   }& A, F/ ^7 p0 i3 T
  62.   if(PBin(14)==0)
    % ^8 a0 C! G3 O% V/ c: l3 R
  63.   {
    9 L: l0 \" ]% u: Q8 f3 G3 Z
  64.    delay_ms(50);
    7 A; J6 y) f5 Y4 J3 m
  65.    if(PBin(14)==0)# L9 ^: Y5 |. r# a; r& `
  66.    {
    9 q) {; k5 N* B: ]
  67.     column=3;        //???
    ( F- r7 N+ v* W
  68.    }9 `* Y! k# p% ^" i0 D; u6 r7 x
  69.   }: _- ]0 e0 u3 c- Y
  70.   if(PBin(15)==0)
    7 O+ k& \. L+ `: Z
  71.   {
      w9 g8 N, w. O0 w$ ]( X
  72.    delay_ms(50);
    0 X6 J2 S: f. B4 z& n5 {4 d, U% `
  73.    if(PBin(15)==0). S7 S# k8 ?  |' K; \) @- Y" F
  74.    {
    $ z. i- H# N$ m1 [2 o7 n2 ~/ k
  75.     column=4;        //???
    ) E( B3 L2 i" C4 G
  76.    }
      B# ~) T& G3 e* [
  77.   }  
    3 h/ u3 o. H  \
  78.   if(column==1)  7 w7 s) k* C. \; x  D
  79.   {/ R$ z0 o) k. P+ V* o8 x* @
  80.     KEY2_Init();     //??????,???             ' K$ ]! ]$ u" v9 k
  81.      if(PAin(7)==1) //??????5 e, U8 }7 E6 g" l9 v* O! [
  82.      {" i* t  a1 D, O
  83.       KeyValue=0;  1 ~/ T8 c2 }" M- ^# \  I
  84.      }
    1 V/ x* V* I; z3 O% ~! J
  85.      if(PAin(6)==1) //??????+ J$ A4 F9 ?* D; B; \
  86.      {
    ) q$ P3 ~; C# a8 I. I$ y
  87.       KeyValue=4;- R) z  P6 t6 R* f3 j
  88. + g8 O' E$ I8 B7 Y  y6 W+ e; l3 |9 Z
  89.      }& ?: \% S! M; s6 Z
  90.      if(PAin(5)==1) //??????
    6 Q9 N' D, f% g$ v
  91.      {' k2 ]. F' a' j; K. v6 p
  92.       KeyValue=8;
    3 W% h" R8 h) J1 J# A
  93. & [- v$ [0 x4 l0 n3 N" P- y/ n
  94.      }
    " j4 r& h' X) `2 [) z0 }* C1 p9 p
  95.      if(PAin(4)==1) //??????
    9 X. b5 L9 P9 x: W: q0 o+ x' c
  96.      {
    ( a" R% y2 _4 J
  97.       KeyValue=12;1 N# B7 Z8 W. `+ k( H9 K

  98. , a2 n* v8 l# e; v- S2 j$ V' N
  99.      }( \! M. n# c/ O+ P! b' b
  100. : M$ p0 X- g3 l) v3 ]1 [' U0 X
  101.   }
    6 j; w1 j2 D' [- y0 l

  102. 5 A6 p9 b' l: _# \! }( z
  103.   if(column==2)" `. ?* Z1 |& e) ^, {3 Y- a# E' y# h
  104.   {
    $ T& R& l  o4 g& T  C! R4 {& T. i
  105.     KEY2_Init();     //????               5 C3 Z  O+ Y5 C( x6 i# x
  106.      if(PAin(7)==1)
    $ ?/ o+ t3 U6 H- i' e! B) h+ X
  107.      {
    2 U5 U, E+ m1 `. S0 V! ~
  108.       KeyValue=1;
    2 j4 @' W$ |) u) e! C: m/ I
  109. 0 ], ?( h0 F6 j: G
  110.      }
    1 b5 K, ^1 d3 a! `' D
  111.      if(PAin(6)==1)
    ( w0 s. F0 J2 R* U
  112.      {( X" D. n8 ]9 \: W& u9 Y
  113.       KeyValue=5;
    1 N5 M, S0 E& h9 o9 ~# ~

  114. * E7 |7 m1 O) f& @, X
  115.      }
    " G$ k) n; B8 C1 e/ d* A; k9 Z
  116.      if(PAin(5)==1)
    3 j) B/ t0 L7 u
  117.      {
    3 B7 [1 ~( W  f2 C, `; H  W& ]& ^
  118.       KeyValue=9;
    $ o9 M5 C. \$ `" ~; `3 l

  119. / {; W  d5 O- N6 U: w; {5 c9 v
  120.      }
    1 d: P% s2 z0 e% F2 N& B# k* t
  121.      if(PAin(4)==1)" n0 m* h! m& V- W, \; y( B# D2 f
  122.      {* _2 D  z# P6 N
  123.       KeyValue=13;
    4 m% k5 W* j& r1 V& g2 I2 `

  124. 6 N) C( d% F9 P6 s6 ]  S
  125.      }% L" u: e0 N/ W$ V* }* w

  126. . k7 R8 F- K+ T7 l# y! F* C/ Z: A
  127.   }  8 w3 E% i" \. O5 w! C/ w5 \" v  i
  128.   if(column==3)6 P7 F5 z" y. j$ L- @. t: B
  129.   {4 {) ^+ \: I  T: L. e
  130.     KEY2_Init();                  % q" n$ w: h( J+ t9 M
  131.      if(PAin(7)==1)
    ) t: T/ P2 \- [. ~+ \% y$ s
  132.      {# ]4 `' q5 ?6 |# v
  133.       KeyValue=2;+ f4 y$ a5 m8 j# w

  134. ' c. W, G$ c1 @' a! I
  135.      }6 a& H: {4 O7 \4 u1 d. S  j
  136.      if(PAin(6)==1); y, d& p; z3 N1 R  a! D5 p" l
  137.      {& h% X( D0 z0 H) W+ r
  138.       KeyValue=6;: s# e3 {! f# v+ d7 E
  139. ) _2 Y9 `3 _0 S2 w% c8 T; ?
  140.      }5 ], o4 t9 m% K/ t  d2 Y! M
  141.      if(PAin(5)==1)( o4 H8 `$ {2 }8 Z% l" X* `
  142.      {! o9 }, ?; `" L; M$ }9 b
  143.       KeyValue=10;' f# z1 s& ?4 ?1 s4 W# p

  144. 1 m6 I) ]1 F: u+ g
  145.      }
    1 h. |; o( {- A
  146.      if(PAin(4)==1)$ T4 p0 C) [4 t, j) P
  147.      {4 ^4 {: z  E9 K4 w4 Z9 h
  148.       KeyValue=14;
    3 a3 O# U7 r8 F; B! Y
  149. : n" x: i# F) |  p
  150.      }* a" m1 Q0 U% r, H. h# K- W' q/ p
  151. % D8 A4 l$ l( L& {0 m
  152.   }
    2 Z! S  r# D5 w  z" W3 H* v: R+ Y

  153. 6 h% I; G, S) Y' P7 b
  154.   if(column==4)
    1 [5 r1 [. z, v% d
  155.   {$ V! Z- h/ I( s- K  u% S+ l+ X3 r3 [) @
  156.     KEY2_Init();             5 p* f  |1 N$ ]$ v8 |7 b
  157.      if(PAin(7)==1)' x! i2 h& r/ `
  158.      {
    ; S2 N3 c  R! o/ h% |
  159.       KeyValue=3;
    6 y# d5 u$ @. e2 H9 I
  160.                  }1 h8 ]6 g  B8 ^2 P1 U
  161.      if(PAin(6)==1)
    1 H" N- }7 l+ P5 z! @
  162.      {5 B  |8 A. c( C
  163.       KeyValue=7;" Z# B) i/ ?& V* a  X  A
  164. ;   
    % {9 h/ J6 w8 `
  165.      }
    4 I( G4 N7 G1 k1 F5 Z
  166.      if(PAin(5)==1)
    1 e- X; S* t  J& x
  167.      {6 ~) q1 B/ j/ J- e2 R* b
  168.       KeyValue=11;
    9 V" s( g& Q. |1 q

  169. * \3 Q+ }: r9 i# Z( N7 k
  170.      }  ~$ D, H0 }6 v' ]# T% R% y! ~
  171.      if(PAin(4)==1)$ L- v; R% s. u& v
  172.      {
    : m( D: ?' p2 t& ^  d! ~  `* A
  173.       KeyValue=15;
    1 S( t' w- }2 ^& ?8 @4 N
  174. . N. r6 U+ |7 a$ v1 ?. k0 v
  175.      }   
    1 c) @$ M7 f1 k" S! f
  176.   }, W, Z1 d- ?; A
  177.     return KeyValue;
    % u4 R7 Z8 F6 S. z
  178. }
复制代码
4 T  G# A0 @1 }
这里其实就是采用了扫描的方式,所以可能会有一定的延迟,大家可以采用中断的方式会更快。
; A% |. q) T& S& a+ e; Q* z7 g  [
( a; c; \% c2 S. E# O对了,我定义是先扫描列,因此这里列我是接PB12~15。. n$ [: l' H0 b+ G0 @% Y2 W

9 a3 D+ P& u) ]; c7 ?; X. Y下面附上头文件
3 w4 l' F9 v7 M5 T/ Z% Q* s4 D9 q
7 ~$ H- e$ g6 H8 w. y
  1. #ifndef __KY_H
    ( ]3 G% S1 F& H  v
  2. #define __KY_H  0 i. T. B1 }6 ]3 H9 c7 p% P
  3. #include "sys.h", G  M4 M1 c. ?+ ^4 X( J% t

  4.   M/ ]. ?% C" r# n2 H

  5. ! `# K; J( t5 c0 p7 m8 B: w+ n
  6. void KEY1_Init(void);/ Z7 c4 t/ E$ Z6 ^' i4 q
  7. void KEY2_Init(void);
    6 n, U- ~/ X- ^, X2 ~  h
  8. int KeyScan(void);  x( o3 k1 r. K
  9. int KeyScan2(void);2 c1 R7 X8 B$ Y3 p: B

  10. 6 H! ]! a- K* B
  11. #endif
复制代码

- V$ @$ x. W+ G9 s7 h三、总结7 H! o& c6 s/ F
今天这一讲是比较简单的,下面会附上实现图,希望对大家有所帮助,谢谢每一位访客
" F) X8 x4 P1 _- O
1 s$ u9 f5 Q& Q如图,按下键后返回键值并显示出来,大家可以尝试一下。欢迎收藏关注!. R! H0 @$ y+ D6 @
$ v2 D$ e3 v% w) r2 m: Y$ y' O
`6J2XM`ZGV@)OX(~M{4MJIR.png ! `( b) C( M- p- W/ L
& B( |4 K* H) X8 e; U

0 A5 J- E2 b$ K9 [5 y0 ?
赞 收藏 评论0 发布时间:2022-5-14 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版