普中51-矩阵按键

矩阵按键

原理图如下:
在这里插入图片描述

行列扫描

行列扫描法检测时,先送一列为低电平,其余几列全为高电平(此时我们确 定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电 平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列 的,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平, 这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。 当然我们也可以将行线置低电平,扫描列是否有低电平。从而达到整个键盘的检 测。

线翻转法

线翻转法,就是使所有行线为低电平时,检测所有列线是否有低电平,如果 有,就记录列线值;然后再翻转,使所有列线都为低电平,检测所有行线的值, 由于有按键按下,行线的值也会有变化,记录行线的值。从而就可以检测到全部 按键。

#include "reg52.h"typedef unsigned int u16;
typedef unsigned char u8;#define SMG_A_DP_PORT P0  //共阴极接法-高电平有效
#define KEY_MATRIX_PORT P1 u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/** 延时函数**/
void delay_10us(u16 num){while(num--);
}/** 行列扫描法*/
u8 key_matrix_ranks_scan(void){u8 key_value = 0;//返回值,0表示没有按键按下KEY_MATRIX_PORT=0xf7;//先将第一列设为低电平if(KEY_MATRIX_PORT!=0xf7){delay_10us(1000);//消抖switch(KEY_MATRIX_PORT){//保存第一列的键值case 0x77: key_value=1;break;case 0xb7: key_value=5;break;case 0xd7: key_value=9;break;case 0xe7: key_value=13;break;}}while(KEY_MATRIX_PORT!=0xf7);//等待按键松开KEY_MATRIX_PORT=0xfb;//先将第二列设为低电平if(KEY_MATRIX_PORT!=0xfb){delay_10us(1000);//消抖switch(KEY_MATRIX_PORT){//保存第二列的键值case 0x7b: key_value=2;break;case 0xbb: key_value=6;break;case 0xdb: key_value=10;break;case 0xeb: key_value=14;break;}}while(KEY_MATRIX_PORT!=0xfb);//等待按键松开KEY_MATRIX_PORT=0xfd;//先将第三列设为低电平if(KEY_MATRIX_PORT!=0xfd){delay_10us(1000);//消抖switch(KEY_MATRIX_PORT){//保存第三列的键值case 0x7d: key_value=3;break;case 0xbd: key_value=7;break;case 0xdd: key_value=11;break;case 0xed: key_value=15;break;}}while(KEY_MATRIX_PORT!=0xfd);//等待按键松开KEY_MATRIX_PORT=0xfe;//先将第四列设为低电平if(KEY_MATRIX_PORT!=0xfe){delay_10us(1000);//消抖switch(KEY_MATRIX_PORT){//保存第四列的键值case 0x7e: key_value=4;break;case 0xbe: key_value=8;break;case 0xde: key_value=12;break;case 0xee: key_value=16;break;}}while(KEY_MATRIX_PORT!=0xfe);//等待按键松开return key_value;
}/**
* 函 数 名 : key_matrix_flip_scan
* 函数功能 : 使用线翻转扫描方法,检测矩阵按键是否按下,按下则返回对应键值
* 输 入 : 无
* 输 出 : key_value:1-16,对应 S1-S16 键,
*0:按键未按下
*/u8 key_matrix_flip_scan(void){u8 key_value = 0;KEY_MATRIX_PORT = 0x0f;//先给所有行设为低电平if(KEY_MATRIX_PORT!=0x0f){//判断按键是否按下delay_10us(1000);//消抖if(KEY_MATRIX_PORT!=0x0f){//消抖之后再次判断按键是否按下//测试列KEY_MATRIX_PORT=0x0f;switch(KEY_MATRIX_PORT){case 0x07: key_value = 1;break;case 0x0b: key_value = 2;break;case 0x0d: key_value = 3;break;case 0x0e: key_value = 4;break;}//测试行KEY_MATRIX_PORT = 0xf0;switch(KEY_MATRIX_PORT){case 0x70: key_value = key_value;break;//如果是第一行,那么列值就是所在的键位case 0xb0: key_value = key_value+4;break;//如果是第二行,那么列数+4就是所在的键位case 0x0d: key_value = key_value+8;break;//如果是第三行,那么列数+8就是所在的键位case 0x0e: key_value = key_value+12;break;如果是第四行,那么列数+12就是所在的键位}while(KEY_MATRIX_PORT!=0xf0);//等待按键松开}}else{//如果没有按下则返回0key_value=0;}return key_value;}/* 
* 主函数
*/
void main(){u8 key = 0;while(1){key = key_matrix_ranks_scan();if(key!=0){P0 = gsmg_code[key-1];//得到的按键值减 1 换算成数组下标对应 0-F 段码}}}

本实验核心代码为 key_matrix_ranks_scan 函数和 key_matrix_flip_scan 函数,前者是使用行列式扫描方式实现,而后者是使用线翻转式扫描方式实现, 实现功能一致,二者可选其一。对于初学者,可能行列式扫描方式更易于理解, 因为比较接近独立按键的编程方式。 行列式扫描原理比较简单,与独立式按键操作类似,即给每一列赋值 0,此 时的矩阵按键就被分割成独立按键,然后再判断每一列中的按键按下情况,并返 回对应的键值。如此循环 4 组,就可将 4 列 4 行按键按下键值全部得到。 而线翻转式扫描相对较难理解,不过静下心,在纸上画画,列举几个数据也是比较容易理解的!!!

结束!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卓越领先!安全狗入选2023年福建省互联网综合实力50强

近日,福建省互联网协会在2023年东南科技论坛——智能算力助力数字经济产业融合发展论坛上正式发布2023年福建省互联网综合实力前50家企业最终评定结果。 作为国内云原生安全领导厂商,安全狗凭借突出的竞争力和市场表现入选综合实力50强。 厦门服云信息科…

Cesium 空间量算——高度量算

高度量算 需求分析 需求 测量两个点之间的高度 分析 直线,水平,垂直测量我们也叫高度的测量,大概原理就是空间两点垂直与地面画一个直角三角形,分别标出每条线的长度 // 添加标签 addLabel(centerPosition, text) {return this.viewer.entities.add(new Cesium.Entity({pos…

创邻科技,位居IDC MarketScape中国图数据库市场领导者类别

图数据库,正进入市场发展的新阶段。 随着中国经济社会数字化转型加速,数据成为新型生产要素。如何存储并管理海量数据,挖掘数据价值,打破原有增长天花板,成为企业重塑商业价值的关键。存量经济时代更需要深层关系挖掘&…

npm、yarn、pnpm如何清除缓存?

前端工程化创建项目会经常使用各种安装包管理工具,安装各种前端依赖包。例如,npm、yarn、pnpm等。时间一长,各种安装包管理工具的在安装依赖时,留下的缓存文件就会变得很大,以至于影响系统的运行,因此必要时…

6- 华为云查看容器日志

1 查看位置 二 进入容器查看 ls cat main.py # 退出命令是 exit() 或者 quit() cat main.py 在docker使用该命令进入文件后的退出命令

反转了,被嘲讽的苹果“假5G”,却是全球主流5G技术

苹果的5G信号被指造假,而一些业内人士指出苹果的信号显示符合3GPP的要求,面对专业人士的质疑,某项姓专家继续辩解,指5G NSA为假5G,然而笔者查找了全球运营商的5G网络建设却发现5G NSA竟然是主流的5G技术。 其实5G NSA与…

《定位》杂志专访丨中南大学杨泽发:InSAR是大范围矿山边坡监测利器

杨泽发 中南大学地球科学与信息物理学院教授 近日,为有效防范遏制矿山重特大事故发生,国家矿山安全监察局发布了《关于开展露天矿山边坡监测系统建设及联网工作的通知》,对矿山边坡监测建设作了“硬性规定”(点击蓝字详细了解&…

【面试必刷TOP101】链表相加 单链表的排序

目录 题目:链表相加(二)_牛客题霸_牛客网 (nowcoder.com) 题目的接口: 解题思路: 代码: 过啦!!! 题目:单链表的排序_牛客题霸_牛客网 (nowcoder.com) 题目的接口:…

学Python的漫画漫步进阶 -- 第十四步.网络通信

学Python的漫画漫步进阶 -- 第十四步.网络通信 十四、网络通信14.1 基本的网络知识14.1.1 TCP/IP14.1.2 IP地址14.1.3 端口14.1.4 HTTP/HTTPS 14.2 搭建自己的Web服务器14.3 urllib.request模块14.3.1 发送GET请求14.3.2 发送POST请求 14.4 JSON数据14.4.1 JSON文档的结构14.4.…

arcgis拓扑检查实现多个矢量数据之间消除重叠区域

目录 环境介绍: 操作任务: 步骤: 1、数据库和文件结构准备 2、建立拓扑规则 3、一直下一页默认参数后,进行拓扑检查 4、打开TP_CK_Topology,会自动带出拓扑要素,红色区域为拓扑错误的地方&#xff1…

【HarmonyOS】元服务卡片router实现跳转到指定页面

【关键字】 元服务卡片、router跳转不同页面 【写在前面】 本篇文章主要介绍开发元服务卡片时,如何实现从卡片中点击事件跳转到指定的应用内页面功能。此处以JS UI开发服务卡片为例,JS卡片支持组件设置action,包括router事件和message事件&…

windows常见的命令行操作

1.查看网络 ipconfig 2.根据任务id关闭进程 1.模糊搜索服务 tasklist | findstr QQ 2.根据模糊搜索结果,获取对应的pid taskkill /F /PID 5128 其他常见命令 若不清楚参数,使用(命令 /?)即可查看help

Java 华为真题-猴子爬山

需求: 一天一只顽猴想去从山脚爬到山顶,途中经过一个有个N个台阶的阶梯,但是这猴子有一个习惯:每一次只能跳1步或跳3步,试问猴子通过这个阶梯有多少种不同的跳跃方式? 输入描述 输入只有一个整数N&#xff…

Digger PRO - Voxel enhanced terrains

资源链接在文末 Digger PRO​​​ 是一个简单但强大的工具,可以直接从 Unity 编辑器或游戏中创建天然洞穴和悬岩。会让你感觉自己手中握有一个体素地形,且毫无瑕疵。它实际上保持着最新、最快且可靠的 Unity 地形系统,并在你需要的地方无缝创建洞穴/悬岩峭壁网格。Digger 内…

Vue3项目中使用插槽

前言&#xff1a; 此文章仅记录插槽的使用&#xff0c;用于自己后期学习查看。 代码实现过程中&#xff0c;HelloWorld为子组件&#xff0c;HomeView为父组件 <slot></slot>元素&#xff1a; 是一个插槽出口&#xff0c;是写在子组件中的&#xff0c;表示了父组件…

ORM框架的发展历史

文章目录 JDBCJDBC操作的特点JDBC优化1.0JDBC优化2.0JDBC优化3.0 Apache DBUtils初始配置基本操作 SpringJDBC初始配置CRUD操作 HibernateORM介绍Hibernate的使用创建项目配置文件CRUD 操作其他方式 Hibernate总结 MyBatis JDBC JDBC操作的特点 最初的时候是直接通过jdbc来直…

【苹果】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本

前言 &#x1f34a;缘由 Iphone15来了&#xff0c;两年之约你还记得吗&#xff1f; 两年前&#xff0c;与特别的人有一个特别的约定。虽物是人非&#xff0c;但思念仍在。 遂整合之前iphone13及iphone14的相关抢购代码&#xff0c;完成一个SpringBoot监听Iphone15有货邮件提…

Foxit PDF SDK Windows 9.1 Crack

Foxit PDF SDK 变更日志 Windows/Linux/Mac 2023 年 8 月 新功能/增强功能 在开始签名之前设置外观。支持使用共享字典添加签名。允许在调用 Signature::StartSign() 之前增量保存文档。在签名前修改现有未签名分页印章签名的外观。支持使用共享字典添加分页签名。忽略全角…

51单片机项目(13)——基于51单片机的智能台灯protues仿真

本次设计&#xff0c;使用protues软件进行仿真&#xff0c;详情如下&#xff1a; 1.输入部分:由热释电红外传感器、光敏传感器、超声波测距传感器所构成的子电路组成。 2.输出模块:由1602液晶显示及其蜂鸣器报警系统组成。 3.中央处理器:主要有AT89C52单片机构成。 4.工作过…

TF-A如何支持Firmware镜像放回滚的

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈在TF-A中通过FIP工具打包镜像的时候,会在镜像的content cert中打包进一个Non-Volatile counter,即版本号 trus…