(八)矩阵按键

文章目录

  • 本章学习类比独立按键
  • 矩阵按键原理图
  • 三行代码法
    • 简单概述
    • 代码书写
    • 键码推算
    • 如何使用
      • 短按键
      • 长按键
        • 不松手长按键
        • 松手长按键
  • 状态机法
    • 简单概述
    • 代码书写
    • 键码推算
    • 如何使用
      • 短按键
      • 长按键
        • 不松手长按键
        • 松手长按键
  • 部分代码展示
  • 现象演示

本章学习类比独立按键

矩阵按键原理图

在这里插入图片描述

三行代码法

简单概述

同上篇文章(七)独立按键

代码书写

//矩阵按键——三行代码
u8 GetIoThree()
{u8 keyio = 0xff;P3 = 0xf0;P4 =0xff;if(P44==0){keyio = 0x70;}if(P42==0){keyio = 0xb0;}if(P35==0){keyio = 0xd0;}if(P34==0){keyio = 0xe0;}P3 = 0x0f;P4 =0x00;if(P33==0){keyio |= 0x07;}if(P32==0){keyio |= 0x0b;}if(P31==0){keyio |= 0x0d;}if(P30==0){keyio |= 0x0e;}	return keyio;	
}u8 KTrg =0;
u8 KCont =0;
void BbdThree()
{u8 readdata = GetIoThree()^0xff;KTrg = readdata&(readdata^KCont);KCont = readdata;
}

键码推算

口诀“从左下到右上依次 8421 列在前 行在后”
在这里插入图片描述

比如:
S4 先看列 对应8 再看行 对应8 则 键码就是 0x88
S6 列对应8 行对应2 则 键码就是 0x82
s9 列对应4 行对应4 则 键码就是0x44
s15 列对应2 行对应1 则 键码就是0x21
s19 列对应1 行对应1 则键码就是0x11

如何使用

短按键

功能描述:S4,S9,S14,S19,数码管刷新界面的切换

u8 kbd_cnt =0 ;
void KbdTask()
{if(kbd_cnt>=10){kbd_cnt = 0;KbdThree();if(Ktrg==0x88){//s4mode = 1;}if(Ktrg==0x44){//s9mode = 2;}if(Ktrg==0x22){//s14mode = 3;}if(Ktrg==0x11){//s19mode = 4;}		}	
}
void SmgTask()
{if(mode==0){smgbuf[0] = smgcode[10];}else if(mode==1){smgbuf[0] = smgcode[1];}else if(mode==2){smgbuf[0] = smgcode[2];}else if(mode==3){smgbuf[0] = smgcode[3];}else if(mode==4){smgbuf[0] = smgcode[4];}smgbuf[1] = smgcode[10];smgbuf[2] = smgcode[10];smgbuf[3] = smgcode[10];smgbuf[4] = smgcode[10];smgbuf[5] = smgcode[10];smgbuf[6] = smgcode[10];smgbuf[7] = smgcode[10];
}

长按键

不松手长按键

功能描述:
S4按下不松开数码管亮‘5’
松开则熄灭

u8 kbd_cnt =0 ;
void KbdTask()
{if(kbd_cnt>=10){kbd_cnt = 0;KbdThree();if(Ktrg==0x88){//s4按下不松手mode =5;}if((Ktrg==0x00)&&(Kcont==0x00)){	//松手mode = 0;}}	
}
松手长按键

功能描述:S4按下长达2秒松开,数码管亮‘5’,不足2秒(也就是短按键)则熄灭‘5’

u8 kbd_cnt =0 ;
u32 sec = 0;
void KbdTask()
{if(kbd_cnt>=10){kbd_cnt = 0;
//松手长按键---S4长按KbdThree();if(Kcont==0x88){sec++;}if((Ktrg==0x00)&&(Kcont==0x00)){if(sec>=200){sec = 0;mode = 5;}else if(sec!=0 ){sec = 0;mode = 0;}else{sec = 0;}}}	
}

状态机法

简单概述

同上篇文章(七)独立按键

代码书写

u8 GetIoState()
{u8 io = 0;P3 = 0xf0;P4 =0xff;//列扫描if(P44==0){io = 4;}if(P42==0){io = 8;}if(P35==0){io = 12;}if(P34==0){io = 16;}P3 = 0x0f;P4 =0x00;//行扫描if(P33==0){io += 0;}if(P32==0){io += 1;}if(P31==0){io += 2;}if(P30==0){io += 3;}	return io;
}u8 KbdState()
{static u8 keystate = 0;u8 keyreturn = 0;u8 keypress = 0 ;keypress = GetIoState();switch(keystate){case 0:if(keypress!=0){keystate = 1;}break;case 1:if(keypress!=0){if(keypress!=0){keyreturn =GetIoState();break; }//break;keystate = 2;}else{keystate= 0;}break;case 2:if(keypress==0){keystate = 0;}break;}return keyreturn;
}

键码推算

完全不要推算,因为函数GetIoState(),已经将返回的值,对应成编号了,只需直接判断编码为几即可!

如何使用

短按键

功能描述:S4,S9,S14,S19,数码管刷新界面的切换

u8 kbd_cnt =0 ;
u8 kbd_val = 0;
void KbdTask()
{if(kbd_cnt>=10){kbd_cnt = 0;//短按键kbd_val = KbdState();if(kbd_val==4){//s4mode = 1;}if(kbd_val==9){//s9mode = 2;}if(kbd_val==14){//s14mode = 3;}if(kbd_val==19){//s19mode = 4;}}	
}

长按键

不松手长按键

功能描述:
S4按下不松开数码管亮‘5’
松开则熄灭

u8 kbd_cnt =0 ;
u8 kbd_val = 0;
void KbdTask()
{if(kbd_cnt>=10){kbd_cnt = 0;//不松手长按键kbd_val = KbdState();if(kbd_val==4){//s4mode = 5;}else{mode = 0;}	}	
}
松手长按键

功能描述:S4按下长达2秒松开,数码管亮‘5’,不足2秒(也就是短按键)则熄灭‘5’

u8 kbd_cnt =0 ;
u8 kbd_val = 0;
u32 sec = 0;//用来记录长按键时间
void KbdTask()
{if(kbd_cnt>=10){kbd_cnt = 0;//松手长按键--S4 2秒kbd_val = KbdState();if(kbd_val==4){//s4sec++;}if(kbd_val==0){if(sec>=200){	//2s长按键sec = 0;mode = 5;}else if(sec!=0){	//短按键sec = 0;mode = 0;	}else{//没有按键按下sec = 0;}}}	
}

部分代码展示

//按键函数
u8 kbd_cnt =0 ;
u8 kbd_val = 0;
u32 sec = 0;//用来记录长按键时间
void KbdTask()
{if(kbd_cnt>=10){kbd_cnt = 0;
//三行代码法--矩阵按键******************************
//		//短按键
//		KbdThree();
//		if(Ktrg==0x88){//s4
//			mode = 1;
//		}
//		if(Ktrg==0x44){//s9
//			mode = 2;
//		}
//		if(Ktrg==0x22){//s14
//			mode = 3;
//		}
//		if(Ktrg==0x11){//s19
//			mode = 4;
//		}		不松手长按键		
//		KbdThree();
//		if(Ktrg==0x88){//s4按下不松手
//			mode =5;
//		}
//		if((Ktrg==0x00)&&(Kcont==0x00)){	//松手
//			mode = 0;
//		}松手长按键---S4长按
//		KbdThree();
//		if(Kcont==0x88){
//			sec++;
//		}
//		if((Ktrg==0x00)&&(Kcont==0x00)){
//			if(sec>=200){
//				sec = 0;
//				mode = 5;
//			}else if(sec!=0 ){
//				sec = 0;
//				mode = 0;
//			}else{
//				sec = 0;
//			}
//		}//状态法--矩阵按键******************************//		//短按键
//		kbd_val = KbdState();
//		if(kbd_val==4){//s4
//			mode = 1;
//		}
//		if(kbd_val==9){//s9
//			mode = 2;
//		}
//		if(kbd_val==14){//s14
//			mode = 3;
//		}
//		if(kbd_val==19){//s19
//			mode = 4;
//		}//		//不松手长按键--S4
//		kbd_val = KbdState();
//		if(kbd_val==4){//s4
//			mode = 5;
//		}else{
//			mode = 0;
//		}	//松手长按键--S4 2秒kbd_val = KbdState();if(kbd_val==4){//s4sec++;}if(kbd_val==0){if(sec>=200){	//2s长按键sec = 0;mode = 5;}else if(sec!=0){	//短按键sec = 0;mode = 0;	}else{//没有按键按下sec = 0;}}}	
}

现象演示

(八)矩阵按键



----- 如有错误欢迎大家批评指正!!!

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

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

相关文章

git 常用命令 help命令

help where git 查询 git 安装路径 git --help 帮助文档 git add -help 查看 add 命令帮助文档 git add -hclear 清屏清屏Further Reading :Git常用命令汇总

Swagger Editor 教程:从入门到精通编写 API 文档

在 API 开发的领域中,Swagger 以其卓越的使用效率与便捷性,备受开发者欢迎。它是一个强大的接口设计工具,允许开发人员对 RESTful API 进行高效的设计、构建及测试工作。本文旨在深入探讨其中一个子工具——Swagger Editor的使用介绍及它的有…

《知识扫盲》ROS和ROS2对比

文章摘选自:ROS与ROS2对比 1.ROS问题举例 ROS的设计目标是简化机器人的开发,如何简化呢?ROS为此设计了一整套通信机制(话题、服务、参数、动作)。 通过这些通信机制,ROS实现了将机器人的各个组件给的连接…

如何用自助法或刀切法来估计偏差、方差?

自助法和刀切法(也叫水手刀法)为计算标准误差和置信区间的非参数方法。刀切法耗费较少计算机资源,但自助法有某些统计优势。 1. 刀切法 由Quenouille(1949)提出的刀切法是用来对估计的偏差和方差进行近似的一个简单方法。 符号说明&#x…

VMware--安装CentOS系统

在虚拟机安装CentOS系统 1 下载CentOS镜像 方式一:可以到官网下载,下载速度较慢。 https://vault.centos.org/7.6.1810/isos/x86_64/ (最后的 / 不要漏掉) 方式二:可以到国内的镜像网站下载。 阿里开源镜像站&…

线性代数_逆矩阵性质

逆矩阵是线性代数中一个非常重要的概念,它具有以下几个基本性质: 1. 可逆矩阵一定是方阵:一个矩阵若要可逆,必须是方阵,即它的行数和列数相等。 2. 逆矩阵的唯一性:如果矩阵\( A \)是可逆的,那么…

sun.misc.BASE64Encoder() 找不到jar包

import sun.misc.BASE64Decoder;新下载的项目,在配置好maven之后,也更新完了Maven文件,还是发现有部分jar没有导入,报红信息如上所示。 其实这个是 Sun 的专用 API , rt.jar 是jre 中自带的 jar 包,所以就可…

latex数学公式

写于:2024年1月5日 晚 修改: 摘要:数学公式根据其位置可以分为行内公式和行间公式。行内公式更加紧凑,而行间公式富于变化,可以为其编号、引用、换行等操作。本文对数学公式的 LaTex 做简单记录和整理。 行内公式 行内…

云原生周刊:2024 扩展 K8s 集群指南 | 2024.1.2

开源项目推荐 Jib Jib 无需 Docker 守护进程,也无需深入掌握 Docker 最佳实践,即可为您的 Java 应用程序构建优化的 Docker 和 OCI 映像。它可作为 Maven 和 Gradle 的插件以及 Java 库使用。 Docketeer Docketeer 提供了一个简单的界面来管理 Docke…

ubuntu18.04+realsenseD455制作TUM数据集

教程目录 一、本机环境二、安装RealSense SDK三、录制rosbag四、制作数据集四、安装ROS-RealSense五、测试数据集一、本机环境 Ubuntu系统ROS系统RealSense18.04melodicD455二、安装RealSense SDK 1、首先注册服务器的公钥 sudo apt-key adv --keyserver keyserver.ubuntu.co…

016、简单控制流if let

if let 能让我们通过一种不那么烦琐的语法结合使用 if 与 let&#xff0c;并处理那些只用关心某一种匹配而忽略其他匹配的情况。思考一下 示例6-6 中的程序&#xff0c;它会匹配一个 Option<u8> 的值&#xff0c;并只在值为 3 时执行代码。 // 示例6-6&#xff1a;这里的…

全网最全fiddler使用教程和fiddler如何抓包(fiddler手机抓包)-笔者亲测

一、前言 抓包工具有很多&#xff0c;比如常用的抓包工具Httpwatch&#xff0c;通用的强大的抓包工具Wireshark.为什么使用fiddler?原因如下&#xff1a; 1.Wireshark是通用的抓包工具&#xff0c;但是比较庞大&#xff0c;对于只需要抓取http请求的应用来说&#xff0c;似乎…

Linux操作系统基础(09):Linux的文件权限

1. 文件权限是什么 在Linux系统中&#xff0c;文件权限是指对文件或目录的访问权限控制&#xff0c;它由三个部分组成&#xff1a;所有者权限、组权限和其他用户权限。文件权限和用户权限之间有密切的关系&#xff0c;文件权限规定了用户对文件的操作权限&#xff0c;而用户权…

CSIG青年科学家会议圆满举行,合合信息打造智能文档处理融合研究新范式

近期&#xff0c;第十九届中国图象图形学学会青年科学家会议&#xff08;简称“会议”&#xff09;在广州召开。会议由中国图象图形学学会&#xff08;CSIG&#xff09;主办&#xff0c;琶洲实验室、华南理工大学、中山大学、中国图象图形学学会青年工作委员会承办。会议面向国…

基于入侵杂草算法优化的Elman神经网络数据预测 - 附代码

基于入侵杂草算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于入侵杂草算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于入侵杂草优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

APP端网络测试与弱网模拟!

当前APP网络环境比较复杂&#xff0c;网络制式有2G、3G、4G网络&#xff0c;还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异&#xff0c;都会对用户使用app造成一定影响。另外&#xff0c;当前app使用场景多变&#xff0c;如进地铁、上公交、进电梯等&#xff0c;使…

Ribbon客户端负载均衡

简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。 简单的说&#xff0c;Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等…

【操作系统】输入/输出系统

目录 l/O系统的功能、模型和接口 l/O设备和设备控制器 中断和中断处理程序 设备驱动程序 与设备无关的I/O 用户层的I/O软件 缓冲区管理 磁盘性能概述和磁盘调度 l/O系统的功能、模型和接口 I/O系统管理 1&#xff09;主要对象&#xff1a; I/O设备和对应的设备控制器 …

IP代理测试:关于Ping测试你需要知道的一切干货

您在访问互联网时是否遇到过持续滞后或花费很长时间等待网站加载的情况&#xff1f;为了避免这种情况&#xff0c;您可以测试 ping 以查看连接速度。如果您使用代理&#xff0c;此 ping 测试还会显示代理服务器的响应速度。 ping 测试是一个很有价值的工具&#xff0c;可以帮助…

C++ 释放指针

在C中&#xff0c;释放指针通常使用delete或delete[]操作符&#xff1b; 如果指针指向的是单个对象&#xff0c;可以使用delete操作符进行释放&#xff1b; 在释放完内存后&#xff0c;最好将指针置为nullptr&#xff0c;以避免出现悬空指针&#xff08;dangling pointer&#…