嵌入式C编程实践 键盘矩阵

键盘矩阵

  • 键盘矩阵是由多个按键组成的矩阵,这些按键排列在行和列之间。在键盘矩阵中,每个按键的位置由其所在的行和列决定。当按键被按下时,相应的行和列会被检测到,从而确定被按下的按键的位置。
    在这里插入图片描述

键盘矩阵代码

我的想法是直接读取

方法一

#include <REGX52.H> // STC89C52单片机头文件 

#define uchar unsigned char
#define uint unsigned int

#define KEYS_PER_ROW 4  // 每行按键个数预留定义
#define ROWS 4 // 键盘行数

// 定义键盘矩阵的行列位置
int keypad[4][4] = { 
    {'1', '2', '3', 'A'},
    {'4', '5', '6', 'B'},
    {'7', '8', '9', 'C'},
    {'*', '0', '#', 'D'}
};

// 键值对应数据,方便扫描判断
unsigned char keypad_data[4][4] = {
    {0x31, 0x32, 0x33, 0x41}, 
    {0x34, 0x35, 0x36, 0x42},
    {0x37, 0x38, 0x39, 0x43},
    {0x2A, 0x30, 0x23, 0x44},
};

// 延时函数,用于键盘扫描去抖动
void delayms(uint ms){
  uint i;
  while(ms--)
    for(i = 0;i < 123;i++); 
}

// 键盘扫描函数  
int keyscan()
{
  // 记录上一次扫描值
  static int scan = 0xff;
  
  int i,j;
  
  // 当扫描值变化时进行判断 
  if (scan != P3) {
    for (i = 0; i < ROWS; ++i) {
      for (j = 0; j < KEYS_PER_ROW; ++j) {
        // 遍历按键值矩阵,找到与扫描值相同的键 
        if (scan == keypad_data[i][j])
          return keypad[i][j]; // 返回键盘矩阵中的键值
      }
    }
  }
  
  // 恢复扫描值
  scan = P3 = 0xff; 
  delayms(3); // 去抖动
  scan = P3;
  
  return '\0'; // 无键按下时返回0
}

void main()
{
  int key_id = '\0';
  
  // 循环调用扫描函数
  while(1){   
    key_id = keyscan(); 
  }
}

代码解释:

包含头文件<REGX52.H>:这是一个STC89C52单片机的头文件。
定义宏uchar和uint:它们分别表示无符号字符和无符号整数。
定义键盘矩阵的行列位置:这里定义了一个4x4的键盘矩阵,每个元素是一个字符,代表一个按键。例如,第一行代表键盘的’1’,‘2’,‘3’和’A’键。
定义键值对应数据:这里定义了一个和键盘矩阵同样大小的数组,用来存储每个按键对应的编码值。例如,‘1’对应于0x31。
定义延时函数delayms:这个函数用来产生毫秒级别的延时,用于键盘扫描时的去抖动。
定义键盘扫描函数keyscan:这个函数用来扫描键盘,当扫描值变化时,遍历按键值矩阵,找到与扫描值相同的键,并返回这个键的值。如果找不到对应的键,或者上一次扫描的值和这次相同(即没有键被按下),那么就返回空字符’\0’。
主函数main:在这个函数中,使用一个无限循环来调用键盘扫描函数。当有键被按下时,扫描函数会返回对应的键值,这个值会被存储在key_id变量中。如果没有键被按下,那么key_id将保持为空字符’\0’。
这个程序的主要功能是读取用户的键盘输入,当有键被按下时,它会把对应的键值存储起来,然后可以用来驱动其他设备或者执行特定的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值