五、51单片机控制矩阵按键

2023-11-13

1、矩阵按键

1.1、矩阵按键原理分析

这里矩阵按键为4*4的矩阵按键。

(1)矩阵按键横向和纵向分割。

(2)按键两端分别接不同的IO引脚。

(3)按键物理作用不变:按下按键两端接通,弹起按键两端断开。

1.2、矩阵按键的工作过程

JP4接P3端口,JP4_8接P3^7...JP4_1接P3^0。

(1)IO端口(P3)先输出0x0f,按键列的一端为高电平,行的一端为低电平。

(2)读取P3端口引脚,若读到值不是0x0f,则说明有按键按下,判断是哪一列。

(3)P3端口再输出0xf0,按键行一端为高电平,列一端为低电平。

(4)读取P3端口引脚,若读到值不是0xf0,则说明有按键按下,判断是哪一行。

(5)结合两次行和列的位置,计算判断是哪个按键按下。

2、原理图

一般情况下JP4端口的1234或5678需要接一个电阻,不然两个IO口导通会导致短路,电流过大,这里不接是因为单片机IO口接了上拉电阻。

矩阵键盘特点:

优点:矩阵键盘省IO口。

缺点:(1)不能同时按下多个按键,例如同时按下两个按键(不再同一行,不在同一列),会检测到两个行,两个列,对应四个按键,而无法判断是其中的哪两个。(2)不能采用中断检测按键。

3、示例程序

上图中的S1~S16按键,对应1~16的数值。通过8颗LED灯,LED1~LED8表示8位二进制数,亮为1,灭为0,通过LED灯亮灭显示显示按下按键的数值。LDE1为低位,LED8为高位。

#include <reg52.h>


/*实现功能
 *S1~S16按键,对应1~16的数值。
 *LED1~LED8表示8位二进制数,亮为1,灭为0。
 *通过LED灯亮灭显示显示按下按键的数值。
 *LDE1为低位,LED8为高位。
 */

/*硬件连接
 *LED接P0端口,LED1接P0^0、LED2接P0^1...LED8接P0^7。
 *矩阵按键接P3端口,JP4_8接P3^7...JP4_1接P3^0。
 *LED灯为共阴极,高电平点亮。
 */
#define LED P0
#define KEY P3


/*函数声明*/
unsigned char GetKeyValue();   /*获取键值*/ 
void Delay15ms();


void main(void)
{
	unsigned char KeyValue = 0;
	LED = 0x00; 			/*默认所有LED灯熄灭*/
	
	while(1)
	{
		KeyValue = GetKeyValue();
		if(KeyValue != 0)
            LED = KeyValue;
	}
}


unsigned char GetKeyValue()
{
	unsigned char hang = 0;
	unsigned char lie = 0;
	unsigned char KeyValue = 0;
	
	/*检测列*/
	KEY = 0x0f;  
	if(KEY != 0x0f)      /*说明有按键按下*/
	{
		Delay15ms();     /*消抖,等待电平稳定*/							
		switch(KEY)
		{
			case 0x0e: lie = 4; break;    /*第4列有按键按下*/	
			case 0x0d: lie = 3; break;    /*第3列有按键按下*/
			case 0x0b: lie = 2; break;    /*第2列有按键按下*/	
			case 0x07: lie = 1; break;    /*第1列有按键按下*/	
			default:   lie = 0; break;
		}
	}
		
	/*检测行*/
	KEY = 0xf0;          /*从IO口输出*/
	if(KEY != 0xf0)      /*读IO口,说明有按键按下*/
	{
		switch(KEY)
		{
			case 0x70: hang = 1; break;    /*第1行有按键按下*/
			case 0xb0: hang = 2; break;    /*第2列有按键按下*/
			case 0xd0: hang = 3; break;    /*第3列有按键按下*/
			case 0xe0: hang = 4; break;    /*第4列有按键按下*/	
			default:   hang = 0; break;		
		}
	}
		
	if(hang !=0 && lie !=0)
	{
		KeyValue = (hang-1)*4 +lie;
		return KeyValue;
	}
	
	return 0;     /*表示没有程序按下或有多个按键同时按下*/
}


void Delay15ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 30;
	j = 43;
	do
	{
		while (--j);
	} while (--i);
}









本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

五、51单片机控制矩阵按键 的相关文章

  • 你一无所有,你拥有一切

    你一无所有 你拥有一切 当看到这一篇文章标题的时候 会引起你怎样的共鸣呢 人总是需要从别处获得力量的 我想与更多的人分享 以此勉励我们自己 一 嘴上说说的人生 那年我在离家的时候一个劲地往自己的硬盘里塞 灌篮高手 我妈一副嗤之以鼻的表情看着
  • VMware16安装步骤与初步使用避免踩坑的安装教程

    VMware16安装步骤与初步使用避免踩坑的安装教程 一 软件介绍 VMware Workstation 中文名 威睿工作站 是一款功能强大的桌面虚拟计算机软件 提供用户可在单一的桌面上同时运行不同的操作系统 和进行开发 测试 部署新的应用

随机推荐

  • Fisco Bcos区块链三(WeBASE中间件平台一键部署)

    文章目录 区块链开荒 技术文档 https webasedoc readthedocs io zh CN latest index html 二 WeBASE一键部署 1 前提条件 1 检查环境 1 平台要求 2 检查Java 3 检查my
  • EfficientNet详解

    EfficientNets EfficientNets NAS neural architecture search Single Scaling Compound Scaling EfficientNet Rethinking Model
  • TheDAO被攻击事件考察报告

    作者 ChinaLedge联盟 段玺 Andy Dan 简介 北京时间2016年6月17日发生了在区块链历史上留下沉重一笔的攻击事件 由于 其编写的智能合约存在着重大缺陷 区块链业界最大的众筹项目TheDAO 被攻击前 拥有1亿美元左右资产
  • Android-Notes|BottomNavigationView-爱上-Lottie,android高级开发面试题

    复制代码 封装个 BasicData 存放 App 内置的一些基本数据 这里主要针对 Lottie 文件 val mNavigationAnimationList arrayListOf LottieAnimation HOME Lotti
  • ORA-16009 remote archive log destination must be a STANDBY database

    ORA 16009错误处理 问题描述 主备在做Switchover切换时 在切换后的备库报如下错误 Wed Jul 22 04 49 02 2015 Errors in file u01 app oracle admin orcl bdum
  • 监控告警02--夜莺飞书告警-v4版本

    监控告警02 夜莺飞书告警 v4版本 1 介绍 2 方法 2 1 源码改动 2 2 测试效果 3 说明 1 介绍 v4版本的夜莺集成了shell api wechat wechat robot dingtalk robot 等5中常见的告警
  • docker环境下部署zabbix

    docker环境下部署zabbix 注 安装时出现的问题及解决办法在最下面 docker zabbix 使用docker搭建zabbix服务 Zabbix 介绍 zabbix 音同 z bix 是一个基于WEB界面的提供分布式系统监视以及网
  • OpenGL学习之创建天空盒

    本文主要参考了立方体贴图的基本原理 首先回顾一下什么是立方体贴图 将多个纹理组合起来映射到一个单一纹理 就是立方体贴图 Cube Map 基本上说立方体贴图它包含6个2D纹理 这每个2D纹理是一个立方体 cube 的一个面 也就是说它是一个
  • go+vue自建运维管理平台

    文章目录 鲁班运维平台 容器管理 集群管理 namespace管理 节点管理 工作负载 存储管理 网络管理 配置管理 事件中心 kuboard 鲁班运维平台 这个平台和spug很像 感觉就像是spug运维平台的容器版本 但是如果是容器平台则
  • js基础——运算符

    一 判断一个变量是否为数值 使用 isNaN 判断一个变量是不是数值 is not a number 语法 isNaN x 作用 检测x是否是非数字 是非数字结果是true 不是非数字结果是false 即数字返回为false 不是数字返回为
  • Bad owner or permissions on C:\\Users\\USER/.ssh/config on Windows

    Bad owner or permissions on C Users USER ssh config 问题描述 由于使用vscode远程连接服务器突然新增了C Users USER ssh config 再powershell cmd下面
  • leetcode刷题(8.13总结)

    1 有效的括号 题目描述 https leetcode cn problems valid parentheses class Solution def isValid self s str gt bool stack count 0 if
  • Linux Eclipse配置C++多线程开发环境

    Linux系统下的多线程遵循POSIX线程接口 称为pthread 编写Linux下的多线程程序 需要使用头文件pthread h 连接时需要使用库libpthread a 头文件直接 include
  • 【关系推导】Codeforces Round #813 (Div. 2) E1. LCM Sum (easy version)

    参考题解 题意 T T T 组数据 每组数据给定 l l l 和 r r
  • Tomcat开启JMX监控

    背景 Tomcat系统运行过程出现错误 需要打开JMX 添加对JVM的监控 Tomcat运行在CentOS中 前提 监控端windows系统 安装JDK 步骤如下 1 服务器关闭Tomcat cd opt apache tomcat 7 0
  • 【论文翻译-3】Attention U-Net: Learning Where to Look for the Pancreas

    Attention U Net Learning Where to Look for the Pancreas 阅读日期 2020年11月25日 Abstract 我们提出新型注意力门控 attention gate AG 模型用于医学成像
  • 恒玄BES2300XX系列常用接口(1)

    app ibrt ui pairing mode test 先回连手机 回连不上进才配对 app tws ibrt set access mode 设置访问模式 app ibrt if pairing mode refresh 断开手机 进
  • Python学习09:继承与多重继承

    本文学习Python的笔记 仅供参考 继承 熟悉C 的都应该了解继承了 简单的说一个类继承另外一个类 可以获得继承类的属性和方法 继承的类称为子类 被继承的类称为父类 比如说人类算是非常大的一个类了 如果按照职业分可能会分为学生类 教师类
  • 关于COM Surrogate已经停止工作的问题的处理

    之前在使用电脑的时候 老是弹出COM Surrogate已经停止工作的提示 我实在是忍受不了这种莫名奇妙的错误 于是上网查了一些资料 现在将这些资料总结一下 修复win7的COM Surrogate已经停止工作的问题 最近一个礼拜 每次打开
  • 五、51单片机控制矩阵按键

    1 矩阵按键 1 1 矩阵按键原理分析 这里矩阵按键为4 4的矩阵按键 1 矩阵按键横向和纵向分割 2 按键两端分别接不同的IO引脚 3 按键物理作用不变 按下按键两端接通 弹起按键两端断开 1 2 矩阵按键的工作过程 JP4接P3端口 J