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

单片机——矩阵按键模块

主要目的
学会按键扫描
1.延时函数
延时函数部分详见链接: 单片机控制一盏灯的亮与灭程序解释

 void delay (uint k)		   //定义延时函数{uint i,j;for(i<0;i<k;i++){for(j=0;j<113;j++){;}}}

这个程序里面的延时函数的目的是按键消抖。
2.按键扫描模块
这是本次实验的重点,将详细介绍。
先来观察矩阵按键模块的连接
在这里插入图片描述
总共8个口。
先实现关于列的扫描,设置初始值(0xf0),从高到低为

端口Value
P3.71
P3.61
P3.51
P3.41
P3.30
P3.20
P3.10
P3.00

那么当按下按键0,4,8,c时,P3.4变成了0,于是P3就变成了0xe0

端口Value
P3.71
P3.61
P3.51
P3.40
P3.30
P3.20
P3.10
P3.00

从而由0xe0我们可以判断是那一列按键按下,但还是不知道具体是哪一个按键按下,于是我们需要继续进行行扫描。
此时初始化P3

端口Value
P3.70
P3.60
P3.50
P3.40
P3.31
P3.21
P3.11
P3.01

在这里插入图片描述
同时现在当按键0按下后

端口Value
P3.70
P3.60
P3.50
P3.40
P3.31
P3.21
P3.11
P3.00

经过行列扫描之后就可以确定具体是哪个按键按下,有了上面的基础之后,我们来学习按键扫描的程序。

void keyscan()   //这个实验的重点{ uchar a; P3=0xf0;if(P3!=0xf0){delay(10);if(P3!=0xf0){P3=0xf0;		  //进行列扫描switch(P3){case(0xe0):keynumber=0;break;	//11100000case(0xd0):keynumber=1;break;//11010000case(0xb0):keynumber=2;break;//10110000case(0x70):keynumber=3;break;//01110000}P3=0x0f;switch(P3){case(0x0e):keynumber=keynumber;break;   //switch case后面是冒号case(0x0d):keynumber=keynumber+4;break;case(0x0b):keynumber=keynumber+8;break;case(0x07):keynumber=keynumber+12;break;}while ((a<50)&&(P3!=0x0f)){delay(10);a++ ;}	}}}

程序的逻辑是
让P3的高四位为0,进行列检测,为什么是列检测呢,很简单,因为区分不出行。
如果按键按下,延时10ms,判断是不是按键抖动,延时之后继续判断,发现仍然不为0xf0,说明按键确实按下了,然后还是给P3幅初始值0xf0,接下来进行switch,case,不同P3情况下,对设置的keynumber进行赋值,记得每一个case结束要加break。
只有列扫描,无法判断是哪个按键按下,接下来进行行扫描。
基本原理和上面一样,但是注意按键值的变化。
最后当两个情况同时不成立后跳出循环。这两个情况就是a>50和P3=0xf0,具体解释就是a>50,按键还没有松开,就认为松开了,P3=0xf0按键按下之后松开了。
3.数码管显示模块
这一部分也相对简单,我的博客里面也有相应的博文。在这里主要就是P0口接的是数码管。这里进行段选和位选。段选是根据keynumber的值,位选这里选了六个数码管,则对应11000000,再转换为16进制。
在这里插入图片描述

 void display(uchar num){P0=table[num];duan=1;duan=0;P0=0xc0;//11000000wei=1;wei=0;}

4.主函数
主要是设置段和位初始状态,之后调用前面的按键扫描和数码管显示模块。

 void main(){duan=0;wei=0;while(1){keyscan();display(keynumber);}}

完整代码

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int	   //注意宏定义不能加分号sbit duan = P2^6; 
sbit wei = P2^7;uchar keynumber; 
uchar code table[]=	{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay (uint k)		   //定义延时函数{uint i,j;for(i<0;i<k;i++){for(j=0;j<113;j++){;}}}void keyscan()   //这个实验的重点{ uchar a; P3=0xf0;if(P3!=0xf0){delay(10);if(P3!=0xf0){P3=0xf0;		  //进行列扫描switch(P3){case(0xe0):keynumber=0;break;	//11100000case(0xd0):keynumber=1;break;//11010000case(0xb0):keynumber=2;break;//10110000case(0x70):keynumber=3;break;//01110000}P3=0x0f;switch(P3){case(0x0e):keynumber=keynumber;break;   //switch case后面是冒号case(0x0d):keynumber=keynumber+4;break;case(0x0b):keynumber=keynumber+8;break;case(0x07):keynumber=keynumber+12;break;}while ((a<50)&&(P3!=0x0f)){delay(10);a++ ;}	}}}void display(uchar num){P0=table[num];duan=1;duan=0;P0=0xc0;//11000000wei=1;wei=0;}void main(){duan=0;wei=0;while(1){keyscan();display(keynumber);}}

运行结果
无法一一展示,这里只展示一部分。
在这里插入图片描述
好啦,今天矩阵按键模块的学习就到这里啦。你学废了吗?有问题的话,欢迎共同交流。最近在准备研究生复试,内容比较粗糙,但个人比较喜欢有输出的学习。以后有机会的话,会继续更新完善的!!!

相关文章:

单片机——矩阵按键模块

主要目的 学会按键扫描 1.延时函数 延时函数部分详见链接: 单片机控制一盏灯的亮与灭程序解释 void delay (uint k) //定义延时函数{uint i,j;for(i<0;i<k;i){for(j0;j<113;j){;}}}这个程序里面的延时函数的目的是按键消抖。 2.按键扫描模块 这是本次实验的重点&a…...

Android学习之网络操作

网络操作 Android平台下的原生网络操作可以分为以下几步&#xff1a; 创建URL对象&#xff1b;通过URL对象获取HttpURLConnection对象&#xff1b;通过HttpURLConnection对象设置请求头键值对、网络连接超时时间等&#xff1b;通过HttpURLConnection对象的connect()方法建立网…...

Delphi XE开发android开发环境搭建

Delphi xe为使用Delphi作为开发工具的程序员,提供了开发APP的便捷工具,它的开发环境也是非常容易搭建,这里我简述一下Android的开发环境搭建,Delphi XE开发Android程序的开发环境需要三个软件支持:Java SE Development开发环境、Android SDK和Android Ndk开发环境。 1、安…...

flink入门-流处理

入门需要掌握&#xff1a;从入门demo理解、flink 系统架构&#xff08;看几个关键组件&#xff09;、安装、使用flink的命令跑jar包flink的webUI 界面的监控、常见错误、调优 一、入门demo&#xff1a;统计单词个数 0、单词txt 文本内容(words.txt)&#xff1a; hello world …...

【数据结构】单链表中,如何实现 将链表中所有结点的链接方向“原地”逆转

一.实现一个单链表&#xff08;无头单向不循环&#xff09; 我们首先实现一个无头单向不循环单链表。 写出基本的增删查改功能&#xff0c;以及其它的一些功能&#xff08;可忽略&#xff09;。 #include<stdio.h> #include<assert.h> #include<stdlib.h>…...

摘花生(简单DP)

Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上面有若干颗花生&#xff0c;经过一株花生苗就能摘走该它上面所有的花生。Hel…...

2022济南大学acm新生赛题解

通过答题情况的难度系数&#xff1a; 签到&#xff1a;A 简单&#xff1a;BL 中等&#xff1a;D 困难&#xff1a;CM 极难&#xff1a;KNO A-和 算出n个数的和判断正负性即可&#xff01;&#xff01;&#xff01; 发现很多同学的代码错误&#xff1a;要么sum未赋初值&…...

策略模式教程

策略模式是一种行为型设计模式&#xff0c;它允许在运行时根据不同的情况选择不同的算法实现&#xff0c;从而使得算法可以独立于客户端而变化。本文将介绍策略模式的概念、应用场景、优点和缺点&#xff0c;并提供最佳的代码实践。本文的代码实现将使用Java语言&#xff0c;但…...

什么是刺猬理念

一、什么是刺猬理念刺猬理念是指把复杂的世界简化成单个有组织性的观点&#xff0c;一条基本原则或一个基本理念&#xff0c;发挥统帅和指导作用。核心是把事情简单化&#xff0c;把所有的挑战和进退维谷的局面压缩为简单的。二、刺猬理念的寓言故事狐狸是一种狡猾的动物&#…...

RPC通信相关

RPCRPC, 远程过程调用&#xff08;Remote Procedure Call&#xff0c;RPC&#xff09;是一个计算机通信协议&#xff0c;该协议允许运行于一台计算机的程序程调用另一台计算机的上的程序。通俗讲&#xff0c;RPC通过把网络通讯抽象为远程的过程调用&#xff0c;调用远程的过程就…...

Node.js + MongoDB 搭建博客 -- 登录页面

准备工作 安装Node.js安装express等相关库MongoDB数据库电脑系统&#xff1a;win11 功能分析 搭建一个简单的具有多人注册、登录、发表文章以及登出功能的博客。 设计目标 未登录&#xff1a;主页左侧导航栏显示home、login、register&#xff0c;右侧显示已发表的文章、发…...

互联网新理念,对于WEB 3.0 你怎么看?

WEB 3.0 这个名词走进大众视野已经有一段时间了&#xff0c;也曾在各个圈子里火热一时&#xff0c;至今各大互联网企业任旧在 WEB 3.0 上不断探索。但关于 WEB 3.0 是什么这个问题&#xff0c;其实大部分人都没有一个比较明确的认知&#xff0c;包括区块链和元宇宙等相关行业的…...

Git使用教程:最详细、最傻瓜、最浅显、真正手把手教

GITGIT版本控制版本控制的意义分布式图形化客户端环境搭建仓库的操作分支使用场景命令远程仓库操作生成公钥命令冲突忽略列表的配置时机配置方式版本回退练习&#xff1a;GIT 版本控制 把文件系统中的文件&#xff0c;按照修改的版本进行记录&#xff0c;进行管理的操作。 版…...

【面试题】Redis面试题汇总(无解答)

Redis为何这么快&#xff1f;缓存问题及解决入库和缓存策略问题及处理redis数据类型缓存过期删除策略内存淘汰机制Redis 回收进程如何工作的&#xff1f;Redis持久化RDB和AOFredis流式pipeline处理原生批命令 (mset, mget) 与 Pipeline 区别?Pipeline 有什么好处&#xff0c;为…...

RHCSA-用户和组管理和文件系统权限(3.11)

目录 用户&#xff08;UID&#xff09; 用户类别&#xff08;UID&#xff09;&#xff1a; 用户的增删改查&#xff1a; 修改用户密码&#xff1a; 查看用户是否存在&#xff1a; 组&#xff08;GID&#xff09; 组的增删改查&#xff1a; 设置组密码&#xff1a; 用户…...

RK3588平台开发系列讲解(同步与互斥篇)信号量介绍

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、信号量介绍二、信号量API1、结构体2、API三、函数调用流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢上一章我们看了自旋锁的原理,本章我们一起学习下信号量的用法。 一、信号量介绍 和自旋锁一样,…...

One-YOLOv5 v1.2.0发布:支持分类、检测、实例分割

One-YOLOv5 v1.2.0正式发布。完整更新列表请查看链接&#xff1a;https://github.com/Oneflow-Inc/one-yolov5/releases/tag/v1.2.0&#xff0c;欢迎体验新版本&#xff0c;期待你的反馈。 1 新版本特性 1. 同步了Ultralytics YOLOv5的上游分支v7.0&#xff0c;同时支持分类、目…...

Zookeeper的Java API操作

Zookeeper的Java API操作一、先启动Zookeeper集群二、IDEA 环境搭建三、创建子节点四、获取子节点并监听节点变化五、判断 Znode 是否存在六、Watcher工作流程一、先启动Zookeeper集群 二、IDEA 环境搭建 1.创建一个Maven工程&#xff1a;ZookeeperProject 2.在pom.xml文件添…...

Web3:前端知识和后端知识基础

三.Web3:前端知识和后端知识基础 1.了解前端开发 2.了解JSP 3.了解JAVAWeb的三大组件 4.Servlet的使用 5.Filter的使用 6.了解thymeleaf 未更新 三.Web3:前端知识和后端知识基础 1.了解前端开发 ①前端架构 HTML超文本标记语言CSS层叠样式表JavaS...

调试射频TX和rx实验工程出现的问题与反思

1.今天用ADS仿真 发现 加上SMA 插损就到了4db&#xff0c;但是直接用传输线就在1db以内 这个问题我目前想到的排查思路是换成IPEX&#xff0c; 换成IPEX插损就变成2db 拿最新的7626去看 看到上面是SMA-3G 小针 还是结合参考的demo PCB来看 2.用射频的ipex测试LNA 发现校准…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...