zoukankan      html  css  js  c++  java
  • 51单片机 | 矩阵键盘行扫描

    ————————————————————————————————————————————

    分类:

    • 按结构原理分:
      • 触点式开关按键
      • 无触点开关按键
    • 接入方式
      • 独立式按键
      • 矩阵式键盘

    ————————————————————————————————————————————

    矩阵式键盘识别方法(行扫描法)

    • 检测列线的状态:

      列线Y4~Y7置高电平,行线Y0~Y3置低电平。只要有一列的电平为低,则表示键盘该列有一个或多个按键被按下。若所有列线全为高电平,则键盘中无按键按下。

    • 判断闭合按键所在的位置:

      行线置高电平,列线置低电平。检测行线的状态。

    • 举例:当按下第一行第一列的按键时
      • 行扫描,行线为低电平,列线为高电平,得到 1110 0000
      • 列扫描,行线为高电平,列线为低电平,得到 0000 1110
      • 将得到的结果进行或运算,得到 1110 1110,对应第一行第一列,十六进制为0xEE
    • 按键表

    bin

    hex

    1

    1

    1110 1110

    0xEE

    1

    2

    1101 1110

    0xDE

    1

    3

    1011 1110

    0xBE

    1

    4

    0111 1110

    0x7E

    2

    1

    1110 1101

    0xED

    2

    2

    1101 1101

    0xDD

    2

    3

    1011 1101

    0xBD

    2

    4

    0111 1101

    0x7D

    3

    1

    1110 1011

    0xEB

    3

    2

    1101 1011

    0xDB

    3

    3

    1011 1011

    0xBB

    3

    4

    0111 1011

    0x7B

    4

    1

    1110 0111

    0xE7

    4

    2

    1101 0111

    0xD7

    4

    3

    1011 0111

    0xB7

    4

    4

    0111 0111

    0x77

    ————————————————————————————————————————————

    矩阵式键盘应用实例

    实现结果:

    通过4*4矩阵键盘对应数码管显示0~F

     

    设计思路:

    • 当检测到按键被按下时,将此时行扫描的结果存入临时变量,再进行列扫描,得到的结果和临时变量进行或运算。
    • 通过数组存放按键和数码管编码,行列扫描得到结果后遍历数组,找到对应的编码位置并显示数码管编码

    实现代码:

     

     1 #include <reg52.h>
     2 typedef unsigned char uchar;
     3 typedef unsigned int uint;
     4 uchar code KEY_TABLE[] =
     5 {
     6     0xEE, 0xDE, 0xBE, 0x7E,
     7     0xED, 0xDD, 0xBD, 0x7D,
     8     0xEB, 0xDB, 0xBB, 0x7B,
     9     0xE7, 0xD7, 0xB7, 0x77
    10 };
    11 uchar code TABLE[] =
    12 {
    13     0x3F, 0x06, 0x5B, 0x4F,
    14     0x66, 0x6D, 0x7D, 0x07,
    15     0x7F, 0x6F, 0x77, 0x7C,
    16     0x39, 0x5E, 0x79, 0x71,
    17 };
    18 void Delay(uchar m)
    19 {
    20     --m;
    21 }
    22 void main()
    23 {
    24     uchar temp, key, i;
    25     while(1)
    26     {
    27         P3 = 0xF0;
    28         if (P3 != 0xF0)
    29         {
    30             Delay(2000);
    31             if (P3 != 0xF0)
    32             {
    33                 temp = P3;
    34                 P3 = 0x0F;
    35                 key = temp | P3;
    36                 for (i = 0; i < 16; ++i)
    37                     if (key == KEY_TABLE[i])
    38                         break;
    39                 P2 = TABLE[i];
    40             }
    41         }
    42     }
    43 }

     

     

       

       

  • 相关阅读:
    比特币全节点(bitcoind) eth 全节点
    Knowledge Tracing -- 基于贝叶斯的学生知识点追踪(BKT)
    trate
    spark
    linux 切换c++版本
    查找两个数组的相同字符(两个超大文件的相同字符)
    作业调度框架FluentScheduler
    .net与js数据交换中文乱码问题解决
    数据库死锁问题
    Service Fabric service 根据环境变量读取配置文件
  • 原文地址:https://www.cnblogs.com/hughdong/p/6879891.html
Copyright © 2011-2022 走看看