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

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

[复制链接]
STMCU小助手 发布时间:2022-5-14 22:00
前言. j8 I8 S; ~, r
4*4矩阵键盘对于实验来说必不可少,那么如何实现矩阵键盘基本功能呢?今天就简单地介绍一下如何利用矩阵键盘和LCD显示出对应的键值,直接进入主题。3 v+ r5 U, ~3 `  r% j
0 M9 a2 D! B2 t" S$ ?" q( i- z
一、4*4矩阵键盘的使用# K7 z3 R" N7 Z
首选,了解它的原理很重要,但在了解它的原理之前,先来看看它的样子。6 Y9 c5 |7 L0 F
, B% b5 \* b7 r( r7 b) d6 L  v
92SFT$XD[ZI46C09)Z1DO.png $ u3 Q4 P" T, H0 v0 I0 S5 B! S
8 A# y' d5 Z+ E7 S% c% @
我们可以看到,4*4的矩阵键盘对应有16个按键,分别对应键值0~15(也可以自己设定),然后你会看到它有8个引脚,其中四个是行控制引脚,四个是列控制引脚 6 O2 b. a1 H3 o" M" O

9 z- c: `: o6 a, |6 o: ~' | 2U`{5JF8ELACUMF_)NWUC}A.png 5 L; B, }- Z0 a6 n( Y
/ d% x/ r# w0 _) B* v& u
上面就是它的主要原理图了7 e- l3 ~" ^, O! P& _

- Z/ o% }- p& M( [9 ^# {/ ]. S在8个接口上,很明显的标出来C1~4和R1~4,C是column(列),R是row(行)
+ B4 {, {: k" W, f8 T6 U" ]3 I
  D4 j, \% w- E3 w, ^7 F1 `它的扫描原理就是通过高四位输出高电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一行按键被按下。
1 K8 F$ B$ B- y) s
' o$ a- Z2 Q; x; x; v' ?二、代码部分
4 g. x# `/ A8 ]下面这个代码部分比较简单,就不一一详解了,大家可以自己解读一下,或者在评论区发表6 E" g( l( k! o& O8 Y( K
6 b; ]! K, t4 L6 ?' Q- f
  1. #include "sys.h"$ j% [  s, z4 ^7 ^& {5 l0 m! f# \; w* R
  2. #include "kyscan.h"( T& N# g) n  M7 \. S
  3. #include "delay.h"
    : p3 |1 @+ I2 G6 T- s" B! D8 M+ [: R4 m# b
  4. #include "lcd.h"
    ; q3 }  l3 j+ x! X

  5. . }2 F" c* r7 Y- n) x6 y
  6. 6 s4 q" @* ^4 z0 p3 p+ K8 C4 Q
  7. void KEY1_Init(void)" t$ l& d1 I2 I" V1 w
  8. {
    9 K8 t! }" b+ k" q7 N3 N
  9.    GPIO_InitTypeDef GPIO_InitStructure;
    ( K* x2 B/ Z2 [+ M  t. `
  10.         
    4 t, E8 ]  f* l6 E
  11.    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//??GPIOA?B( k3 h' i# }7 z6 S1 V. y7 K
  12.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//????  $ O8 L6 ?7 b0 P% q
  13.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;  
    , o; z- t( f6 ]8 W6 S+ p0 `7 G
  14.    GPIO_Init(GPIOB,&GPIO_InitStructure);
    + ?1 s+ M+ M6 a
  15.         
    8 m* X' x/ O. }( G
  16.         
    8 O1 \$ Z$ R. f: f
  17.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //????: X5 }* _3 H3 ?4 B9 i1 T
  18.    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;      7 x- X* T; P* t9 A: F% W6 t
  19.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;0 Z2 q) ^! u/ e) }
  20.    GPIO_Init(GPIOA,&GPIO_InitStructure);       1 Q6 Z* W0 F+ {4 M; p! U1 X
  21.    GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //??????,???& P" W0 n2 d: P2 `2 u8 k
  22. }- [) l2 {0 G# ]& x" I& _: W% \
  23. void KEY2_Init(void)
    # z5 A0 \* k1 X
  24. {
    ; K% e: o9 e+ j# F7 `
  25.    GPIO_InitTypeDef GPIO_InitStructure;4 l. S% N! _* E1 ~3 D# Q& [
  26.    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);% i+ X. s# l- x& G! W

  27. 1 J7 ]0 d8 q" I4 u8 k
  28. 3 ]  U+ e4 ~( J3 ^# A; H* P/ y
  29.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //????
    . d. f! x! A* ^: w  m8 @+ q
  30.    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    ; e/ r. q( {# B' K/ t- _: l
  31.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;; J) H: s( G1 k
  32.    GPIO_Init(GPIOB,&GPIO_InitStructure);
    " q! e; U/ ~6 L. d2 Y3 ?- J
  33.    GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //???
    4 F$ L" y0 C: O6 N! _+ |
  34.         
    4 B7 @" I9 C/ q- b- L0 Y
  35.    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;   //????" }8 l0 T6 o  f# |/ ]; K
  36.    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;2 r* K1 [7 _2 o6 l9 U8 `: S6 R
  37.           GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;5 M7 A6 t/ \" J" t  Y: p! W: P
  38.    GPIO_Init(GPIOA,&GPIO_InitStructure);  3 F/ k; y  C1 U& a! h
  39. }0 ]/ p- H$ L' }" c4 o
  40. int KeyScan(void)1 X' m1 O6 t  M1 W& Y9 J5 m
  41. {
    " n( O$ a2 J, W1 j% v6 e
  42. u8 column=0;4 ]  t3 q4 G9 i1 ]9 d. |, `0 J
  43. u8 KeyValue=0;( ~9 m" j) m* H; p7 `) k( q
  44.     KEY1_Init();    //??????,???+ [+ W' p) \# ?8 m
  45.         * i$ L: r, d; J9 Z9 M7 J; [
  46.   if(PBin(12)==0)
    - {% J) v1 W; x6 A/ L
  47.   {
    ) x- ~, d1 x4 `  t% s
  48.    delay_ms(50);" l- q+ x, m0 @' H; x( V
  49.    if(PBin(12)==0)
    * n6 L6 q5 Z0 R6 Z9 Z: Y7 |
  50.    {" P3 k5 N( ?( ^! S1 |
  51.     column=1;        //???" b6 K( s* S5 k7 T8 K
  52.    }
    ! O) j6 a$ a$ X9 u4 ~
  53.   }
    5 W6 ?6 Q# a2 m, |% F
  54.   if(PBin(13)==0)
    " J, G' [' b' s
  55.   {! u& `  r. z. K
  56.    delay_ms(50);
    0 L& {8 t" k* r7 c" L
  57.    if(PBin(13)==0)  w9 i+ j: w: d3 e/ l" M4 f8 {
  58.    {! s+ y$ U: C1 U1 e" @7 ]% `
  59.     column=2;        //???& x: B5 N! ]$ r6 c
  60.    }
    3 E# S  v: V' E1 Q5 M0 G6 i) H
  61.   }
    ( b2 E2 C8 M* O6 D5 Q
  62.   if(PBin(14)==0)
    6 O; ?' g6 h+ Z7 o# c( p
  63.   {2 w) h7 C$ |* ]- z! ?7 M
  64.    delay_ms(50);
    4 ]( @/ G8 f- I, }, D1 k& I
  65.    if(PBin(14)==0)
    ; ]7 Z) ~6 c. i) B' @8 }
  66.    {. i0 F% B/ {! g2 V% U/ s
  67.     column=3;        //???1 a/ F+ r7 Y" N" t( J/ |
  68.    }/ l" p4 G7 q# z$ S1 V; \
  69.   }7 B9 T8 I( h/ v% v& T( B% z8 C
  70.   if(PBin(15)==0)5 _9 j5 X4 F% \2 L# V
  71.   {
    . _* P* Y2 e# l/ [1 V
  72.    delay_ms(50);& k) D! K8 [0 t/ f1 L! {2 r
  73.    if(PBin(15)==0)
    ' s/ t$ |  O; Y* t2 V$ s
  74.    {
    # |7 e8 L: f8 L" |7 I( `2 j
  75.     column=4;        //???
    5 Y% b' `. g, Z+ l2 ?% k
  76.    }4 ]! B& M' C- @0 [/ N* x
  77.   }  . F5 U% |5 t9 f3 D$ s. e) }
  78.   if(column==1)  / z; e$ i% y: p1 E
  79.   {; W7 O& T0 x% M( }9 g
  80.     KEY2_Init();     //??????,???            
    2 E& ?: d" O( }) l5 c
  81.      if(PAin(7)==1) //??????
    , }2 ~7 N6 X! X- j/ B% m& |
  82.      {. V4 @/ c) Y, E5 ^* i) k
  83.       KeyValue=0;  
    # V) }/ {) _, {
  84.      }
    - U! {  v- p" s7 t1 S' t, S5 y9 k
  85.      if(PAin(6)==1) //??????9 V- L9 R* K$ o: w" j
  86.      {
    1 ]. x  ^* u) i+ s. }, T  n8 I
  87.       KeyValue=4;* T9 F/ l$ ~/ e& o% i( ^& {

  88. ) O8 K1 ?3 }- J
  89.      }
    & ]0 O2 m: M: M: E: q
  90.      if(PAin(5)==1) //??????! t- |9 [- q! p$ R) y! s6 }
  91.      {; {1 @8 `+ R) d0 P% |
  92.       KeyValue=8;. w- m' T1 t$ x0 I, M, ]  J) B7 x1 n& V

  93. 7 t" p/ P1 y$ ~* I8 G0 ]: ^
  94.      }
    ; `, ?4 G: j, E% g
  95.      if(PAin(4)==1) //??????
    % F# {+ ]# V; C( b& I- U& L8 k
  96.      {9 A& {2 V) m; a5 Z5 V  q1 Z4 P% q
  97.       KeyValue=12;
    6 `9 ]( J; T+ f) l2 _
  98. 4 f$ O0 E' G0 _0 l: j
  99.      }
    2 V0 U0 L; g$ T! `2 X; S  n

  100. " Z0 A* \/ \2 P9 U
  101.   }
    4 v# Y* a, C+ U
  102. : E2 p5 r/ Q4 c; J3 k' q
  103.   if(column==2)
    ; X- `0 i1 u8 F2 S
  104.   {
    5 `% h; s! t# B' H+ C8 s0 k
  105.     KEY2_Init();     //????               
    # H# n1 T3 B+ V3 P. Q
  106.      if(PAin(7)==1)9 R3 u+ }/ r1 c: n8 b
  107.      {- J* [0 a, g& ]" w) f
  108.       KeyValue=1;) K# H* B& W* [% s" Y7 ^5 g
  109. ' _" Z+ O: x7 p* j; H
  110.      }
    ) @" `9 ^8 z) }) H! r& s
  111.      if(PAin(6)==1)
    ! y/ b6 z4 q2 B3 ]! o  j2 q( o
  112.      {4 `  }, L* _) K
  113.       KeyValue=5;
    ) {) g+ o% G( Q+ c$ c

  114. $ O" z/ v) Q9 S8 @4 ~8 M2 v! X. ^
  115.      }; k! @; m* w' v$ w% ~$ A/ b, H: P! l' [% \
  116.      if(PAin(5)==1)
    # Z3 A+ M% O& J' `
  117.      {
    * c0 |6 {4 k. [1 m2 \& s
  118.       KeyValue=9;
    ) I+ W( c3 A& y8 ]  H
  119. % r! A! n9 H' l, t
  120.      }: h0 B: b# ^$ H' ^
  121.      if(PAin(4)==1)
    $ Z6 D5 k: M9 T# j6 p! q
  122.      {
    , {. R# \8 u- \$ ]3 B
  123.       KeyValue=13;
    8 B5 Q: M" C+ v2 `. W

  124. 1 i2 y; Y& X' |" h) O# ]3 u1 R
  125.      }' U4 s# b8 x' Q1 \4 F9 @( @

  126. . d4 w: t% r. U5 k( F6 [. t
  127.   }  
    3 `$ p8 O8 n3 E9 n  n  B
  128.   if(column==3)
    0 m$ z& a; j/ G& z! c. L
  129.   {/ Y3 n. u# ^6 \  z: [3 K
  130.     KEY2_Init();                  
    / W2 ^; t# O9 ]( p& E! h
  131.      if(PAin(7)==1)
    : v# E7 X" e! q/ f( \9 H
  132.      {, E# v, v' o3 i) M: U+ B
  133.       KeyValue=2;: w3 N3 o. b9 {6 M; H
  134. % {4 P. u# H8 _9 Q3 K; d
  135.      }
    * E5 M. L7 l/ r* x
  136.      if(PAin(6)==1)
    ) P+ q4 Q& U3 D+ X4 J4 C' v5 U6 [+ a
  137.      {# v+ W  i3 z1 a, B' Q
  138.       KeyValue=6;. i- `% G+ H/ N" j  H; \
  139. # M) H! a3 S& E% K& @
  140.      }
    & G6 h! k' {+ O# A. t! R7 r/ U
  141.      if(PAin(5)==1)  R' d- B* T8 r5 c7 s5 G
  142.      {- B1 B" d! t" r1 f
  143.       KeyValue=10;( g# p% h4 N* V3 H- O0 `9 ]
  144. + t5 v: y8 e% L  s1 y
  145.      }' W9 S+ v* O# A5 p
  146.      if(PAin(4)==1)
    9 s1 c2 ^; `& L+ z. `( G$ j  T
  147.      {
    ' W! b. M& G; E# T9 F: s
  148.       KeyValue=14;
    $ s! m1 R6 I+ D4 C" d; {7 e+ |

  149. 5 l; [7 p, G# z* g- n9 m7 A
  150.      }! A! ~* F) X# X" g1 O- Y2 P

  151. 7 T9 N( J+ J4 e1 z0 ~# n2 J; I5 M
  152.   }
    ; [( a; `; H# U9 o2 `6 z

  153. & S: C% w7 Y- D
  154.   if(column==4)
    . x* u5 |0 `6 Q6 [$ x" u4 v
  155.   {4 J9 f& r& d' D+ |
  156.     KEY2_Init();             - U9 T1 f: ~2 Y
  157.      if(PAin(7)==1)
    " n8 H1 Q* \* z+ M: [& B, j
  158.      {$ x, `1 V+ P7 M. y( P+ D: s
  159.       KeyValue=3;5 I+ |. ~% p) d& X. u+ d
  160.                  }
    - ]+ k5 _" r4 `- k, e+ v5 h
  161.      if(PAin(6)==1)# ^, E. S- M9 F# L/ B
  162.      {- r9 s+ a% B6 }9 w, X) X
  163.       KeyValue=7;
    , C, f( r& l# M
  164. ;   9 f4 A: H, G! |
  165.      }
    7 P$ W" E4 o# S+ A
  166.      if(PAin(5)==1)( \  F" P- Q( h( h; z
  167.      {
    : I, A$ o( \" c. Y8 @2 w; ~
  168.       KeyValue=11;5 ~# x2 _/ f3 ~! Q) x
  169. 5 \- p- l7 e/ J4 |
  170.      }/ g0 W4 e& F3 N: {% V( _" o9 ~
  171.      if(PAin(4)==1)
    ( R5 c# m: O7 V6 k$ |/ V
  172.      {
    ! ]7 M% p) z1 O, J
  173.       KeyValue=15;
    ! A: K% ^$ m/ d% l* n" \# b
  174. / q* R  y2 M- f
  175.      }   
    - i; l% {* L3 Q+ [' h
  176.   }
    6 u& O1 p0 s3 l3 F! F
  177.     return KeyValue;
      U8 D. ?) v) \9 |
  178. }
复制代码
1 g4 [9 x1 _% A/ U: u' Z7 q! F
这里其实就是采用了扫描的方式,所以可能会有一定的延迟,大家可以采用中断的方式会更快。. W/ H  T  i. v5 N! P2 p& d7 u
2 f  e4 e0 H" B/ ?
对了,我定义是先扫描列,因此这里列我是接PB12~15。5 _' w& t% C7 T9 }+ y3 L. H/ p: @, _

. T, |" l, b# e. S' D下面附上头文件8 c/ R' d2 L- E1 J! @, T

/ y: |& x% D: C* p* d
  1. #ifndef __KY_H+ g9 @" E6 {/ E* p) Q
  2. #define __KY_H  " m  G4 o9 X' D* `; O% J
  3. #include "sys.h"3 ^' K' n% L" K4 Z5 e

  4. # J$ n2 `5 V4 r/ J% T- H

  5. 0 c: b: l7 S9 s/ k
  6. void KEY1_Init(void);* F; `2 y! @! {; P  n  G
  7. void KEY2_Init(void);
    * `$ Z! y. Q0 {' o/ r+ ^8 l
  8. int KeyScan(void);
    + H, N, |3 P& b& Q8 z
  9. int KeyScan2(void);, F  Z+ k8 I0 e4 a( u. d( Y

  10. / Q  c1 l  U# Q1 Z
  11. #endif
复制代码
/ @0 q1 f: k3 O& a/ c" E
三、总结$ k% w7 ~; o. A% k, ?" U' w& C
今天这一讲是比较简单的,下面会附上实现图,希望对大家有所帮助,谢谢每一位访客
* s  ?. q% U( V) X9 z, n
" w% k" S- o  @+ E7 |# j如图,按下键后返回键值并显示出来,大家可以尝试一下。欢迎收藏关注!
0 r- m  b5 A4 X# M  O# P4 _$ I4 K/ r7 r  B9 Z& e. l$ p
`6J2XM`ZGV@)OX(~M{4MJIR.png , M/ u6 q8 i1 S* S

* I* }0 G7 c; P4 _; C! A$ C3 w, a$ @2 K
收藏 评论0 发布时间:2022-5-14 22:00

举报

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