【单片机】矩阵按键-线反转法识别

本文详细介绍了矩阵式按键的线反转法识别原理,包括电路连接方式、线反转法的具体步骤及程序实现,通过实例说明如何确定被按下的按键位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学了矩阵式按键,掌握了线反转法识别方法,感觉这方法挺不错,我之前也搜过关于一些矩阵式按键的原理以及程序,有些是找出x,y的坐标,然后通过一个计算公式计算出按键号,具体我也没仔细看,今天就把学到的线反转法分享给大家,大家可以做一下比较呀。

一、电路图

下面是矩阵按键的连接图。
在这里插入图片描述
第一行按键连接P1.0,第二行按键链接P1.1,第三行连接P1.2,第四行连接P1.3(从上到下)
第一列连接P1.4,第二列连接P1.5,第三列连接P1.6,第四列连接P1.7(从左到右)
对按键进性编序,第一行第一列的按键为0号按键,先行后列进行排序,一直到最后一个F号按键。

二、线反转法原理

第一步:P1.0–P1.3输出为0(4行),P1.4–P1.7做输入(4列)。
第二步:读取P1.4–P1.7的数据并保存。
第三步:将第二步中保存的数据从P1.4–P1.7输出,此时P1.0–P1.3做输入。
第四步:读取P1的数据,若无按键按下,此时读取的数据为0xff,若有按键按下,P1.0–P1.3中必定有一个为0(对应着被按下按键的行),P1.4–P1.7中必定有一个为0(对应着被按下按键的列)。
第五步:依据按键数组查找被按下的按键号。
举例说明:
假设0号按键被按下,P1.0–P1.3输出为0(4行),P1.4–P1.7做输入(4列),0号按键按下后,第一列对应的引脚P1.4输入为0,此时得到的P1.4–P1.7数据为0111,将0111数据从P1.4–P1.7输出,此时P1.0–P1.3做输入,由于0号按键被按下,所以P1.0输入为0,则此时P1对应的数据为0XEE(0111_0111),也就是第一行与第一列交叉处的按键被按下了。其他按键同理,不同的按键对应着不同的P1值。

三、程序介绍

#include <REGX51.H>

#define SEGPORT P0
#define KEYPORT P1

typedef unsigned char u8;
typedef unsigned int u16;

//数码管显示按键号,段码
unsigned char code LEDCODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
//查找按键号的数组,行和列与电路图一致
unsigned char KEYCODE[]=
{0XEE,0XDE,0XBE,0X7E,
 0XED,0XDD,0XBD,0X7D,
 0XEB,0XDB,0XBB,0X7B,
 0XE7,0XD7,0XB7,0X77};

//函数声明
void delayxms(u16 s);  //延时函数
u8 KEY_Scan(void);     //按键扫描

//主函数
void main (void)
{
 while(1)
 {
  SEGPORT=~LEDCODE[KEY_Scan()];
 }
}

void delayxms(u16 s)
{
 u16 i,j;
 for(i=0;i<s;i++)
 { 
  for(j=0;j<120;j++)
  {}
 }
}

u8 KEY_Scan(void)
{
 u8 temp,num;
 KEYPORT=0xf0;  //P1.0--P1.3输出0,P1.4--P1.7输出为1,为输入做准备
 temp=KEYPORT;  //读入P1的值
 temp&=0xf0;    //保留P1.4--P1.7的数据
 if(temp!=0xf0) //若P1.4--P1.7输入不全为1,代表有按键被按下
 {
  delayxms(5);  //延时消抖
  KEYPORT=0xf0; //再次判断是否真有按键按下
  temp=KEYPORT; //读入P1的值
  temp&=0xf0;   //保留P1.4--P1.7的数据
  if(temp!=0xf0)  //真有按键按下
  {
   temp|=0x0f;    
   KEYPORT=temp; //将读取的P1.4--P1.7数据从P1.4--P1.7输出,此时P1.0--P1.3做输入
   temp=KEYPORT; //再次读取P1的值,上述原理中的第四步
   for(num=0;num<16;num++)  //查找按键号,
   {
    if(temp==KEYCODE[num])
     break;
   }
   return num;  //对应按键号
  }
  return 16;   //表示无按键按下
 }
 else
  return 16;
} 

四、proteus仿真

由于在家,只能用proteus进行仿真,这里当无按键按下时,我让数码管显示”-“,有按键按下时,显示被按下的按键号。
下面是我仿真的一个视频!!!

[video(video-UUyi5vuo-1592747091116)(type-tencent)(url-https://v.qq.com/txp/iframe/player.html?vid=r3102aep1kd)(image-http://puui.qpic.cn/vpic/0/r3102aep1kd_160_90_3.jpg/0)(title-单片机矩阵按键仿真)]

博客经常在线,大家有什么问题欢迎在评论区留言呀!!!

### Keil 中矩阵键盘线反转的思想 在 Keil C51 编程环境中,针对矩阵键盘的扫描通常采用线反转来检测按键状态。这种方的核心在于分两阶段进行行和列的状态切换与读取。 #### 行优先扫描 初始状态下设置所有的行线为输入模式并配置内部上拉电阻使这些行处于高电平;与此同时,所有列线被设为输出模式并向其施加低电平信号。此时如果没有任何按键按下,则各行列间保持原有电压等级不变。一旦有任意位置上的按钮闭合接触,相应连接此键位的那根行导线将会因为接地而呈现低电平特性[^1]。 ```c // 设置端口方向:行作为输入(带内建上拉),列为输出 P0 = 0xFF; // 假定 P0 的高位用于行,初始化为高电平 P2 = 0x00; // 假定 P2 用于列,全部置为低电平 ``` #### 列优先扫描 紧接着改变上述设定——即把各行改为输出方式且强制写入零值形成逻辑‘0’(低电平),同时将原本负责提供负极性的那些列重新定义成三态门或浮空输入形式等待接收反馈信息。这时若有某个特定交叉点处存在物理连通情况发生的话,那么它所关联的那个列就会表现出不同于其他未激活通道的表现特征,也就是转变为低电平状态。 ```c // 反转操作:行变输出并下拉至低电平,列改回输入准备读取变化 P0 = 0x00; P2 = 0xFF; // 执行一次短暂延时以便稳定总线上新建立起来的数据关系 DelayMs(1); ``` 通过以上两次不同的配置组合以及相应的软件查询过程可以精确得知具体哪一个开关元件正处于活动之中,并据此推算出确切的位置坐标从而完成整个识别流程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ti噗嗤哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值