当前位置: 首页 > news >正文

C51单片机学习笔记——矩阵按键

矩阵按键通常是为了节省IO口而设计的,当有多个按键时,如果每个按键都单独接一个IO口,会占用太多资源。所以采用矩阵排列,比如4x4的矩阵,只需要8个IO口(4行+4列),可以支持16个按键,这样效率更高。

一、矩阵按键原理

矩阵按键主要是通过逐列或者逐行的方式进行扫描输出低电平,检测列(或行)输入状态。当某行被激活时,若某列检测到低电平,则对应交叉点的按键被按下。

1.扫描过程

  • 步骤1:行线设置为输出模式,列线设置为输入模式(带内部或外部上拉电阻)。

  • 步骤2:逐行拉低每一行(如Row1拉低,其他行置高),读取列线状态。

  • 步骤3:若某列为低电平,则确定按键位置(如Row1+Column2对应按键5)。

  • 步骤4:循环扫描所有行,完成一轮检测。

2.按键消抖

当按键被按下时,我们可以通过延时函数来进行对按键的消抖,可以选择10~20ms的延时进行消抖,避免误触发的现象。

3.原理图

二、代码演示

#include <REGX52.H>
#include "Delay.h"/*** @brief 矩阵按键按下所显示的数字* @param  无* @retval KeyNum显示1~16*///矩阵按键进行逐列扫描
unsigned char MatrixKey(void)
{unsigned char KeyNum = 0;P1 = 0xFF;//P1置高电平有效P1_3 = 0;if(P1_7 == 0){	Delay(20);//消抖while(P1_7==0);//检测松手Delay(20);KeyNum = 1;}if(P1_6 == 0){	Delay(20);while(P1_6==0);Delay(20);KeyNum = 5;}if(P1_5 == 0){	Delay(20);while(P1_5==0);Delay(20);KeyNum = 9;}if(P1_4 == 0){	Delay(20);while(P1_4==0);Delay(20);KeyNum = 13;}P1 = 0xFF;P1_2 = 0;if(P1_7 == 0){	Delay(20);while(P1_7==0);Delay(20);KeyNum = 2;}if(P1_6 == 0){	Delay(20);while(P1_6==0);Delay(20);KeyNum = 6;}if(P1_5 == 0){	Delay(20);while(P1_5==0);Delay(20);KeyNum = 10;}if(P1_4 == 0){	Delay(20);while(P1_4==0);Delay(20);KeyNum = 14;}P1 = 0xFF;P1_1 = 0;if(P1_7 == 0){	Delay(20);while(P1_7==0);Delay(20);KeyNum = 3;}if(P1_6 == 0){	Delay(20);while(P1_6==0);Delay(20);KeyNum = 7;}if(P1_5 == 0){	Delay(20);while(P1_5==0);Delay(20);KeyNum = 11;}if(P1_4 == 0){	Delay(20);while(P1_4==0);Delay(20);KeyNum = 15;}P1 = 0xFF;P1_0 = 0;if(P1_7 == 0){	Delay(20);while(P1_7==0);Delay(20);KeyNum = 4;}if(P1_6 == 0){	Delay(20);while(P1_6==0);Delay(20);KeyNum = 8;}if(P1_5 == 0){	Delay(20);while(P1_5==0);Delay(20);KeyNum = 12;}if(P1_4 == 0){	Delay(20);while(P1_4==0);Delay(20);KeyNum = 16;}return KeyNum;
}
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"unsigned char KeyNumber;void main()
{LCD_Init();LCD_ShowString(1,1,"Show_KeyNumber:");while(1){KeyNumber = MatrixKey();if(KeyNumber)//判断按键按下{LCD_ShowNum(2,1,KeyNumber,2);}}
}

当矩阵按键被按下时,会显示该行该列对应的数字 

 

相关文章:

  • #RabbitMQ# 消息队列入门
  • QNAP NEXTCLOUD 域名访问
  • JVM 的垃圾回收器
  • 基于aspnet,微信小程序,mysql数据库,在线微信小程序汽车故障预约系统
  • 使用Arduino UNO复活电脑的风扇
  • 【第三十七周】SigLip:Sigmoid Loss for Language Image Pre-Training
  • 汽车软件刷写 APP SBL PBL概念
  • RabbitMQ 断网自动重连失效
  • Newtonsoft Json序列化数据不序列化默认数据
  • Python基于Django的主观题自动阅卷系统【附源码、文档说明】
  • 699SJBH库存系统V2
  • TIGER - 一个轻量高效的语音分离模型,支持人声伴奏分离、音频说话人分离等 支持50系显卡 本地一键整合包下载
  • AI练习:指纹
  • GO语言基础4 Errors 报错
  • 线程池优雅关闭的哲学
  • 动态库加载的底层原理
  • 10G/25G PCS only mode for CoaXPress Over Fiber
  • 基于ICEEMDAN-SSA-BP的混合预测模型的完整实现过程
  • 【排序算法】冒泡排序详解--附详细流程代码
  • 对WireShark 中的EtherCAT抓包数据进行解析
  • 网站多语言建设方案/哪里做网络推广好
  • 网站建设维护合同/网络营销专业是做什么的
  • 乐山网站建设/百度云在线登录
  • 驾校做网站/查看百度关键词价格
  • wordpress默认后台路径/宁波优化网页基本流程
  • 弹窗网站制作器/洛阳网站建设