(八)矩阵按键

文章目录

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

本章学习类比独立按键

矩阵按键原理图

在这里插入图片描述

三行代码法

简单概述

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

代码书写

//矩阵按键——三行代码
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.hqwc.cn/news/324815.html

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

相关文章

图纸防泄密软件有哪些用处?

公司电脑文件数据透明加密防泄密软件系统——德人合科技 提供软件系统及技术支持 防止公司内部数据泄密 通过动态加解密技术,有效防止公司内部数据泄密。即员工在创建、编辑文档时会被自动加密存放在硬盘上,防止员工故意或由于疏忽而造成泄密或对文件恶…

贝锐花生壳全新功能:浏览器一键远程访问SSHRDP远程桌面

为了满足特定场景的远程访问需求,如:远程群晖NAS设备、远程SQL Server数据库/MySQL数据库、3389远程桌面(RDP远程桌面)、远程SSH、我的世界游戏联机…… 贝锐花生壳推出了场景映射服务,不仅提供满足相应场景的网络带宽…

gitlab高级功能之Kubernetes Agent介绍

文章目录 1. 前置条件2. 简介3. GitLab Kubernetes Agent 的部署3.1 启用 Agent 服务端3.2 创建 Agent 配置和清单仓库 4. 安装agent4.1 连接k8s集群4.2 在集群中部署4.3 修改资源清淡,调整pod的副本数 5. 思考 1. 前置条件 gitlab 14.5 专业版k8s集群helm客户端工…

【DevOps-07-2】Sonarqube基本使用

一、简要说明 Sonar Qube的使用方式很多,Maven可以整合,也可以采用sonar-scanner的方式,再查看Sonar Qube的检测效果 Sonarqube集成在Maven实现代码检测使用sonar-scanner客户端的方式 二、Sonarqube管理后台安装中文插件 1、登录Sonarqube管…

使用(?<!pattern) 负向后行断言正则表达式提取一个双引号开头和结尾的字符串

如下是一段java代码,我想用正则表达从中提取代码中的字符串 cond_buffer.append(" ORDER BY \"name\" \"").append(join(order_by_column,"\","));java是通过前后用双引号包含定义字符串的。但简单使用正则表达式".…

【SpringMVC】常用注解

什么是MVC? MVC是一种程序分层开发模式,分别是Model(模型),View(视图)以及Controller(控制器)。这样做可以将程序的用户界面和业务逻辑分离,使得代码具有良好…

【字典树Trie】LeetCode-139. 单词拆分

139. 单词拆分。 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1: 输入: s "leetcode&q…

java大数据hadoop2.92安装伪分布式文件系统

Apache Hadoop 3.3.6 – Hadoop: Setting up a Single Node Cluster. 1、解压缩到某个路径 /usr/local/hadoop 2、修改配置文件 /usr/local/hadoop/etc/hadoop/hadoop-env.sh export JAVA_HOME/usr/local/javajdk 3、修改配置文件 /usr/local/hadoop/etc/hadoop/core-sit…

聊聊spring事务12种场景,太坑了

前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了。 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么同时失败),避免数…

ARCGIS PRO SDK 使用条件管理 Pro UI

ARCGIS PRO UI简单介绍以下&#xff1a; 第一步&#xff1a;在Config.daml中在</AddInfo>标签下加上条件<conditions>标签&#xff08;必须添加的&#xff09; <conditions><!-- 定义条件 &#xff0c;此处定义了两个--Tab 另一个为 group><insert…

周鸿祎分享大模型十大趋势:2024将出现杀手级应用

1月5日&#xff0c;“2023年风马牛年终秀”上&#xff0c;三六零&#xff08;601360.SH&#xff0c;下称“360”&#xff09;集团创始人周鸿祎分享了对2024年大模型发展趋势的十大预测&#xff0c;呼吁企业树立AI信仰&#xff0c;All in AI。他认为&#xff0c;创新才能破局&am…

基于YOLOv7算法的高精度实时安全背心目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时安全背心目标检测系统可用于日常生活中检测与定位安全背心&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法来训…