单片机外设矩阵键盘之线反转法识别原理与示例

单片机外设矩阵键盘之线反转法识别原理与示例

1.概述

这篇文章主要介绍单片机接收 4X4矩阵键盘发出的指令,做出对应的反馈。其中主要介绍矩阵键盘线反转方式的识别原理和实操。

2.矩阵键盘线反转识别原理

2.1.矩阵键盘硬件接线原理

矩阵键盘的硬件接线方式有多种,下面介绍的是常用的矩阵式接线。
4X4矩阵键盘由4行和4列构成,行和列分别为两层金属线的薄膜,中间加一层绝缘层,在每个按键的位置有一个开孔,当按下某个位置的按键的时候行薄膜片和列薄膜片就会相贴合,此时就会有电流导通。通过检测导通电流的行和列的位置确定该按键被按下。
在这里插入图片描述

2.2.线反转识别原理

1.线反转识别原理介绍

线反转识别的设计非常巧妙,简化了代码的复杂度和冗余度。首先识别列号,然后在识别行号,经过两次识别确定按键位置,因此称为线反转识别。

线反转识别步骤如下

  1. 设置列识别模式
    • 行为低4位,列为高4位,将行全部设置为0,列全部设置为1,十六进制值为 0xf0
  2. 识别列号
    • 当按键按下的时候,某列的值就会变为0,因此可以获取对应列号,例如按下第一列 1110
  3. 反转 设置行识别模式
    • 行为低4位,列为高4位,将行全部设置为1,列全部设置为0,十六进制值为 0x0f
  4. 识别行号
    • 当按键按下的时候,某行的值就会变为0,因此可以获取对应行号,例如按下第一行 1110
  5. 行号 + 列号 = 按键号
    • 将行号与列号做或运算得到一个8位二进制数值,转为十六进制就是按键对应的键码
2.线反转识别举例说明

上面介绍了线反转识别的原理后,下面在通过一个例子掌握如何从原理转化为实际结果,示例中用1号按键举例,其他按键码值计算方式相同。

计算1号按键键码示例
根据上图的4X4接线图计算1号按键的键码,图中 KEYIN1~KEYIN4 是行,KEYOUT1~KEYOUT4是列。

  1. 设置列识别模式

    • KEYIN1~KEYIN4 全部设置为低电平模式,二进制就是 0000KEYOUT1~KEYOUT4全部设置为高电平模式,二进制就是 1111,列为高4位,行为低4位,因此组合后一个8位二进制就是:1111 0000
  2. 识别列号

    • 按下1号按键,1号按键的接线是第一列,得到的列二进制就是 1110,行的二进制还是0000, 组合后一个8位二进制就是:1110 0000
  3. 反转 设置行识别模式

    • KEYIN1~KEYIN4 全部设置为高电平模式,二进制就是 1111KEYOUT1~KEYOUT4全部设置为低电平模式,二进制就是 0000,列为高4位,行为低4位,因此组合后一个8位二进制就是:0000 1111
  4. 识别行号

    • 按下1号按键,1号按键的接线是第一行,得到的行二进制就是 1110,列的二进制还是0000, 组合后一个8位二进制就是:0000 1110
  5. 行号 + 列号 = 按键号

    • 将行号与列号做运算(1110 0000 | 0000 1110)得到一个8位二进制数值 1110 1110 ,转为十六进制 0xEE

3.矩阵键盘点亮LED灯实验

实验目标

在程序中接收键盘按键的码值,对码值进行判断,控制LED灯打开和关闭。

硬件电路原理
  • LED灯正极接20号VCC引脚,负极接11号P3.7引脚
  • 键盘排线上有标号,1号对应12号P1.0引脚依次递增,8号对应19号P1.7引脚
    在这里插入图片描述
核心代码介绍

KEY()函数的作用就是通过线反转法识别按键的键值,然后通过程序作出相应的动作。该函数将上面线翻转原理做了实现。

/*
函数名:线翻转法读取键盘按键值
调  用:? =  Key (void);
参  数:无
返回值:0~0xff
结  果:连接Px接口的键盘读出返回值
备  注:
*/
unsigned char Key (void){//键盘处理函数
	unsigned char a,b,c;//定义3个变量
	//设置列识别模式:行为低4位,列为高4位,将行全部设置为0,列全部设置为1,二进制为:11110000,十六进制值为 0xf0
	KEY = 0xf0;
	if(KEY != 0xf0){ //查寻键盘口的值是否变化
		DELAY_MS (20);//延时20毫秒,去除按键抖动
   		if(KEY != 0xf0){//有键按下处理
	  		a = KEY;//键值放入寄存器a
		}
		//翻转设置行识别模式:行为低4位,列为高4位,将行全部设置为1,列全部设置为0,二进制为:00001111,十六进制值为 0x0f
		KEY = 0x0f;
		c = KEY;//将第二次取得值放入寄存器c
		a = a|c;//将两个数据相或
		switch(a){//对比数据值
			case 0xee: b = 1; break;//对比得 到的键值给b一个应用数据
			case 0xed: b = 2; break;
			case 0xeb: b = 3; break;
	   		case 0xe7: b = 4; break;
	   		case 0xde: b = 5; break;
	   		case 0xdd: b = 6; break;
	   		case 0xdb: b = 7; break;
	   		case 0xd7: b = 8; break;
	   		case 0xbe: b = 9; break;
	   		case 0xbd: b = 10; break;
	   		case 0xbb: b = 11; break;
	   		case 0xb7: b = 12; break;
	   		case 0x7e: b = 13; break;
	   		case 0x7d: b = 14; break;
	   		case 0x7b: b = 15; break;
	   		case 0x77: b = 16; break;
			default: b = 0; break;//键值错误处理
	   }
	}
	return (b);//将b作为返回值
}
完整代码
/*
程序名:线翻转法操作矩阵键盘   
编写人:bruce     
编写时间:2023年12月
硬件支持:STC12C2052AD系列  
接口说明:    
修改日志:  
  NO.1-								
*/

#include <STC12C2052AD.H> //STC12Cx052或STC12Cx052AD系列单片机头文件


sbit LED = P3 ^ 7;

#define KEY P1 

/*
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
*/
void DELAY_MS (unsigned int a){
	unsigned int i;
	while( a-- != 0){
		for(i = 0; i < 600; i++);
	}
}


/*
函数名:线翻转法读取键盘按键值
调  用:? =  Key (void);
参  数:无
返回值:0~0xff
结  果:连接Px接口的键盘读出返回值
备  注:
*/
unsigned char Key (void){//键盘处理函数
	unsigned char a,b,c;//定义3个变量
	//设置列识别模式:行为低4位,列为高4位,将行全部设置为0,列全部设置为1,二进制为:11110000,十六进制值为 0xf0
	KEY = 0xf0;
	if(KEY != 0xf0){ //查寻键盘口的值是否变化
		DELAY_MS (20);//延时20毫秒,去除按键抖动
   		if(KEY != 0xf0){//有键按下处理
	  		a = KEY;//键值放入寄存器a
		}
		//翻转设置行识别模式:行为低4位,列为高4位,将行全部设置为1,列全部设置为0,二进制为:00001111,十六进制值为 0x0f
		KEY = 0x0f;
		c = KEY;//将第二次取得值放入寄存器c
		a = a|c;//将两个数据相或
		switch(a){//对比数据值
			case 0xee: b = 1; break;//对比得 到的键值给b一个应用数据
			case 0xed: b = 2; break;
			case 0xeb: b = 3; break;
	   		case 0xe7: b = 4; break;
	   		case 0xde: b = 5; break;
	   		case 0xdd: b = 6; break;
	   		case 0xdb: b = 7; break;
	   		case 0xd7: b = 8; break;
	   		case 0xbe: b = 9; break;
	   		case 0xbd: b = 10; break;
	   		case 0xbb: b = 11; break;
	   		case 0xb7: b = 12; break;
	   		case 0x7e: b = 13; break;
	   		case 0x7d: b = 14; break;
	   		case 0x7b: b = 15; break;
	   		case 0x77: b = 16; break;
			default: b = 0; break;//键值错误处理
	   }
	}
	return (b);//将b作为返回值
}

void main (void){ //主程序 
	while(1){
		if(Key() == 1){
			LED = 0;		//取LED相反状态
		}
		if(Key() == 2){
			LED = 1;		//取LED相反状态
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/289237.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx 中的日志

目录 1.定制访问日志记录格式 1.1 全部日志记录 1.2 每个网站独属一份日志 2.日志路径 3.错误日志 1.定制访问日志记录格式 1.1 全部日志记录 该配置处于nginx.conf 文件中 log_format compression $remote_addr - $remote_user [$time_local] "$request" $sta…

源支付V7最新修复版,V2.7.9最新版

源支付V7最新修复版&#xff0c;V2.7.9最新版 注&#xff1a;开发不易&#xff0c;仅限交流学习使用&#xff0c;如商业使用&#xff0c;请支持正版&#xff01; 轻量化的界面 UI, 提供更加便捷的操作体验&#xff0c;让您的系统一目了然 推荐支付宝当面付 - 免 CK - 商家版&a…

【ZYNQ入门】第三篇、双核AMP运行模式程序开发

目录 第一部分、基础知识 1、多核CPU三种主要运行模式 2、ZYNQ内部FSBL涉及到的启动过程 2.1、BootRom是啥&#xff1f; 2.2、FSBL是啥&#xff1f; 2.3、ARM与cortex的关系 2.4、本次实验的启动流程 第二部分、FSBL环境配置过程 1、vivado配置硬件 2、SDK新建FSBL配…

8天狂收6000+⭐️,可商用的开源Stream Diffusion

加州大学伯克利分校、东洋大学、东京工业大学、麻省理工学院和筑波大学等研究人员&#xff0c;联合开源了一款创新性实时交互图像生成框架——Stream Diffusion。 Stream Diffusion的技术创新点在于&#xff0c;将传统的顺序去噪变成流批处理去噪&#xff0c;消除了漫长的等待…

大模型实战营第二期——1. 书生·浦语大模型全链路开源开放体系

文章目录 1. 实战营介绍2. 书生浦语大模型介绍2.1 数据2.2 预训练2.3 微调2.4 评测2.5 部署2.6 智能体(应用) 1. 实战营介绍 github链接&#xff1a;https://github.com/internLM/tutorialInternLM&#xff1a;https://github.com/InternLM书生浦语官网&#xff1a;https://in…

使用Vue3开发学生管理系统模板7 科目信息的实现

字段设计 IDname&#xff1a;课程名称&#xff0c;字符串&#xff0c;最大36字符start_time&#xff1a;开设时间&#xff0c;日期类型teacher_total&#xff1a;该科目老师人数&#xff0c;数字类型master_id&#xff1a;负责人ID&#xff0c;字符串&#xff0c;最大36字符ma…

二、UI文件设计与运行机制

一、UI文件设计与运行机制 1、创建工程 2、添加控件&#xff0c;实现按钮点击 &#xff08;1&#xff09;添加控件 &#xff08;2&#xff09;添加信号和槽 2、分析项目结构 test_02test_02.pro Qt工程文件Headerswidget.h 设计的窗体类的头文件Sourcesmain.cpp 主程序入…

印象笔记03 衍生软件使用

印象笔记03 衍生软件使用 Verse 以下内容来源于官方介绍 VERSE是一款面向未来的智能化生产力工具&#xff0c;由印象笔记团队诚意推出。 你可以用VERSE&#xff1a; 管理数字内容&#xff0c;让信息有序高效运转&#xff1b;搭建知识体系&#xff0c;构建你的强大知识库&am…

高防ip适合防御网站和游戏类的攻击吗?

​  作为站长&#xff0c;要学会并承受得住网站外来攻击的压力&#xff0c;尤其是所属为 DDoS 攻击高发行业的网站类业务及游戏行业&#xff0c;是很容易被竞争对手或者一些伪黑客爱好者盯上的。 加上&#xff0c;有些站长并没有提前了解&#xff0c;就盲目进军了这两个行业&…

看板表格样式,去掉element表格背景

<div class"ml-20"><el-input v-model.trim"queryParams.wipOrderNo" size"small" clearable style"width:150px" placeholder"请输入工单号" /><el-select class"ml-20" v-model"queryParam…

[数据结构 C++] AVL树的模拟实现

文章目录 1、AVL树1.1 AVL树的概念 2、AVL树节点的定义3、AVL树的插入和旋转3.1 左单旋左旋代码实现 3.2 右单旋右旋代码实现 3.3 右左双旋右左双旋的代码实现 3.4 左右双旋左右双旋的代码实现 3.5 insert接口实现 4、判断是否为AVL树判断AVL树的代码实现 5、AVL树的性能 问题引…

金和OA c6 uploadfileeditorsave接口存在任意文件上传漏洞

产品简介 金和网络是专业信息化服务商&#xff0c;为城市监管部门提供了互联网监管解决方案&#xff0c;为企事业单位提供组织协同OA系统升开发平台&#xff0c;电子政务一体化平台智慧电商平合等服务 漏洞概述 金和-c6 uploadfileeditorsave 任意文件上传&#xff0c;攻击者…

计算机网络(9):无线网络

无线局域网 WLAN 无线局域网常简写为 WLAN (Wireless Local Area Network)。 无线局域网的组成 无线局域网可分为两大类。第一类是有固定基础设施的&#xff0c;第二类是无固定基础设施的。所谓“固定基础设施”是指预先建立起来的、能够覆盖一定地理范围的一批固定基站。 …

6个关键词,回顾网络安全行业的 2023!

话不多说&#xff0c;直接上 01 生成式人工智能 AIGC 热度&#xff1a;⭐️⭐️⭐️⭐️⭐️ AIGC 的发展不仅降低了内容创作的门槛&#xff0c;还为聊天机器人、数字人、元宇宙等领域提供了新的发展机遇。2023 年 8 月&#xff0c;首届人工智能生成内容国际会议在上海落地&…

Paddle3D 2 雷达点云CenterPoint模型训练

2 Paddle3D 雷达点云CenterPoint模型训练–包含KITTI格式数据地址 2.0 数据集 百度DAIR-V2X开源路侧数据转kitti格式。 2.0.1 DAIR-V2X-I\velodyne中pcd格式的数据转为bin格式 参考源码&#xff1a;雷达点云数据.pcd格式转.bin格式 def pcd2bin():import numpy as npimport…

C++面向对象语法总结(三)

目录 《C面向对象语法总结(一&#xff09;》《C面向对象语法总结(二&#xff09;》 二十一、多继承 C允许一个类可以有多个父类&#xff08;不建议使用&#xff0c;会增加程序设计复杂度&#xff09;在多继承中&#xff0c;会按照继承顺序将父类的成员变量放到子类成员变量的…

踩坑Vant组件 Dialog的组件调用

今天踩了一个非常蠢的坑&#xff0c;自己给自己蠢死的坑 在使用组件调用时自己没引入Dialog组件导致一直报错 不知道为什么全局引入不好使&#xff0c;后来使用了局部引用 现在没问题了 就这样局部引入一个Dialog.Component就可以了

CEEMDAN +组合预测模型(Transformer - BiLSTM+ ARIMA)

目录 往期精彩内容&#xff1a; 前言 1 风速数据CEEMDAN分解与可视化 1.1 导入数据 1.2 CEEMDAN分解 2 数据集制作与预处理 3 基于CEEMADN的 Transformer - BiLSTM 模型预测 3.1 定义CEEMDAN-Transformer - BiLSTM预测模型 3.2 设置参数&#xff0c;训练模型 4 基于A…

【日积月累】Java Lambda 表达式

目录 【日积月累】Java Lambda 表达式 1.前言2.语法3.应用场景3.1简化匿名内部类的编写3.1简化匿名内部类的编写3.2简化集合类中的操作3.3实现函数式接口3.4简化多个方法的调用3.5简化异步编程 4.总结5.参考 文章所属专区 日积月累 1.前言 Lambda表达式是一个匿名函数&#…

数据库索引、三范式、事务

索引 索引&#xff08;Index&#xff09;是帮助 MySQL 高效获取数据的数据结构。常见的查询算法,顺序查找,二分查找,二叉排序树查找,哈希散列法,分块查找,平衡多路搜索树 B 树&#xff08;B-tree&#xff09;。 常见索引原则有 选择唯一性索引&#xff1a;唯一性索引的值是唯…
最新文章