普中51-矩阵按键

news2024/9/28 19:26:43

矩阵按键

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

行列扫描

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

线翻转法

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

#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{
		//如果没有按下则返回0
		key_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.coloradmin.cn/o/1025922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

巨人互动|Facebook海外户Facebook的特点优势

Facebook作为全球最大的社交媒体平台之一,同时也是最受欢迎的社交网站之一,Facebook具有许多独特的特点和优势。本文小编将说一些关于Facebook的特点及优势。 1、全球化 Facebook拥有数十亿的全球用户,覆盖了几乎所有国家和地区。这使得人们…

Unity用相机实现的镜子效果

首先登场 场景中的元素 mirror是镜子,挂着我们的脚本,Quad是一个面片。Camera是用来生成RenderTexture给面片的。里面的test1是我用来调试位置的球。 镜子size是大小,x是-2,为了反转一下贴图 相机直接可以禁用掉,用…

无需申请专线、无需改动网络,ERP/MES管理系统如何远程访问?

深圳市某模具公司作为一家以设计、制作五金模具、五金冲压、机加工件、加工经营为主的五金企业。为了实现更为高效的生产管理流程,引入了面向钣金/五金行业信息化建设的ERP/MES管理系统及方案,并将其部署在了企业总部的内网服务器。 除了总部访问需求外&…

ThreeJS入门-创建一个正方体

ThreeJs实际上是WebGL的框架,Three.js是在WebGL的api接口基础上,又进行的一层封装。相当于js和JQuery的关系,学习webgl需要图形学知识,而webgl需要通过js和glsl两种语言。如果我们不通过threejs使用webgl势必逃不过底层知识:你必须…

SSRF漏洞(利用file协议读取本地文件)

简介 当利用SSRF漏洞时,攻击者可以通过构造恶意请求来读取本地文件。其中一种方法是使用file协议来读取本地文件。例如,file:///etc/passwd是一个常见的示例,它用于读取Linux系统上的passwd文件。 passwd文件是Linux系统中用于存储用户账户…

Flink——Flink检查点(checkpoint)、保存点(savepoint)的区别与联系

Flink checkpoint Checkpoint是Flink实现容错机制最核心的功能,能够根据配置周期性地基于Stream中各个Operator的状态来生成Snapshot,从而将这些状态数据定期持久化存储下来,从而将这些状态数据定期持久化存储下来,当Flink程序一…

【C语言】进阶——字符串和内存函数

目录 一:非限制字符串函数 1.strlen 👊模拟实现 方法1:计算器法 方法2.指针-指针 方法3.函数调用 2.strcpy 👊模拟实现 3.strcat 👊模拟实现 4.strcmp 👊模拟实现 二:可限制字符串函…

Echarts 旭日图的详细配置过程

文章目录 旭日图 简介配置过程简易示例 旭日图 简介 Echarts旭日图是一种数据可视化图表类型,用于展示层次关系数据的分布情况。旭日图通过不同的环形区域和扇形区域来表示数据的层次和大小关系,从而形成一个太阳的形状,因此得名旭日图。 E…

WebGL 计算平行光、环境光下的漫反射光颜色

目录 光照原理 光源类型 平行光 点光源 环境光 反射类型 漫反射 漫反射光颜色 计算公式 环境反射 环境反射光颜色 表面的反射光颜色(漫反射和环境反射同时存在时)计算公式 平行光下的漫反射 根据光线和法线方向计算入射角θ(以便…

Intellij IDEA 提效小技巧

快速找到Controller方法 如果你的项目里有非常多的controller,里面有非常多的http或者resful方法。如何快速找到这些方法呢?这个时候,ctrlaltshiftn就可以派上用场了。 比如说,你依稀记得入账单相关的接口,都有个bil…

让Pegasus天马座开发板用上OLED屏

继上篇《让Pegasus天马座开发板吃上STM8S标准库》移植完标准库之后,于是我又想为天马座开发板添加一块屏幕。终于在我的零件箱底下找到了沉入箱底多年的0.96OLED屏幕。 屏幕介绍 这个是128x64像素的屏幕模块,其使用的SSD1306的驱动IC。而目前该模组&…

软件测试为什么外包更好?权威软件测试外包公司应该具备的资质

软件测试外包公司是一家专门从事软件测试服务的企业,其主要任务是帮助公司或个人进行软件产品的测试工作。相比较于自行开设测试部门或雇佣全职测试人员,外包软件测试具有成本更低、灵活性更高的优势。同时,外包公司通常拥有丰富的测试经验和…

Java高级-Junit单元测试框架

单元测试框架 1.介绍2.案例、断言机制3.常见注解 1.介绍 单元测试 就是在针对最小的功能单元方法,编写测试代码对其正确性测试 Junit单元测试框架 可以对方法进行测试,是第三方公式开源出来的 优点 可以灵活的编写测试代码,可以针对某个…

Stable Diffusion 参数介绍及用法

大模型 CheckPoint 介绍 作用:定调了作图风格,可以理解为指挥者 安装路径:models/Stable-diffusion 推荐: AnythingV5Ink_v32Ink.safetensors cuteyukimixAdorable_midchapter2.safetensors manmaruMix_v10.safetensors counterf…

leetcode刷题笔记——位运算

C/C语言中逻辑右移和算数右移共享同一个运算符>> 如果运算数类型是unsigned则采用逻辑右移,而signed则采用算数右移。对于signed类型的数据,如果需要使用算数右移,或者unsigned类型的数据需要使用逻辑右移,都需要进行类型转…

JAVASE---认识异常

在Java中,将程序执行过程中发生的不正常行为称为异常。 1.算数异常 2.数组越界异常 3.空指针异常 java中不同类型的异常,都有与其对应的类来进行描述。 异常的体系结构 1. Throwable:是异常体系的顶层类,其派生出两个重要的子…

阿里云服务器租用费用价格表(2023新版报价)

租用阿里云服务器怎么收费?阿里云服务器配置不同一年价格也不同,阿里云2核2G3M带宽108元一年、2核4G4M带宽297.98元12个月,云服务器u1公网带宽可选1M到5M,系统盘为ESSD云盘40GB起,CPU内存配置可选2核2G、2核4G、4核8G、…

Python爬虫在电商数据获取与分析中的应用

前言 随着电商平台的兴起,越来越多的人开始在网上购物。而对于电商平台来说,商品信息、价格、评论等数据是非常重要的。因此,抓取电商平台的商品信息、价格、评论等数据成为了一项非常有价值的工作。本文将介绍如何使用Python编写爬虫程序&a…

BaseRecyclerView - 一个强大的RecyclerAdapter框架

官网 BRVAH 项目介绍 高效的使用RecyclerView应对项目中的常见需求的Adapter,RecycleView从未如此简单! BRVAH官方使用指南 BRVAH官方使用指南(持续更新) - 简书

智慧交通:连接城市未来的纽带

在当今快节奏的现代生活中,交通问题一直是城市面临的重要挑战之一。拥堵、事故和空气污染等问题不仅影响着居民的日常生活,也对经济和环境产生了负面影响。为了解决这些问题,智慧交通作为一项重要的技术和社会创新出现在我们的视野中。 智慧交…