51单片机KeyWard
eg1: 单片机键盘的分类
- 键盘分为编码键盘和非编码键盘,键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值得称为编码键盘,如计算机键盘,而靠软件来识别的称为非编码键盘,在单片机组成的各种系统中使用最多的就是非编码键盘,也有使用到编码键盘的,非编码键盘又称为独立式和矩阵式键盘。
单片机键盘根据按键的结构和工作原理的不同,可以分为以下几类:
- 矩阵键盘(Matrix Keyboard):
- 矩阵键盘是最常见的单片机键盘之一。
- 它使用一种矩阵排列的按键结构,通过行和列的交叉点来确定按下的按键。
- 一般通过行列扫描的方式来检测按键的按下和释放。
- 独立按键(Individual Key):
- 独立按键是指每一个按键都有独立的引脚连接到单片机。
- 每个按键都使用一个独立的IO引脚,通过读取引脚的电平状态来检测按键的按下和释放。
- 独立按键一般用于需要较少按键的应用场景。
- 脉冲编码开关(Encoder Switch):
- 脉冲编码开关也被称为旋转编码开关,用于检测旋转操作。
- 它通常由两个触点组成,通过检测两个触点的状态变化来确定旋转方向和步数。
- 脉冲编码开关常用于旋转编码器、音量调节器等应用场景。
- 矩阵键盘和独立按键结合:
- 在某些情况下,矩阵键盘和独立按键可能会结合使用。
- 例如,一些常用的功能按键使用独立按键,而数字键盘使用矩阵键盘的方式来连接到单片机。
单片机键盘电路设计图
test1:点击第一个按钮时点亮第一个led管
#include <REGX52.H>
#include <INTRINS.H>
sbit d1 = P1^0;
sbit keyboard01 = P3^0;void main(){P3 = 0xff; // 1111 1111while(1){if(keyboard01 == 0){d1 = 0;}else{d1 = 1;}}
}
单片机的按键在闭合和断开时,触点会出现抖动现象
独立键盘的检测与消抖
- eg2: 点击独立按键的同时led亮灭同时晶体管统计次数当数字为9时归0
#include <REGX52.H>
#include <INTRINS.H>
sbit d1 = P1^0;
sbit dula = P2^6;
sbit wela = P2^7;
sbit keyboard01 = P3^0;
// 宏定义
#define uint unsigned int
#define uchar unsigned char
uchar num;
uint code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};void delay(uint z){uint x,y;for(x = z; x > 0; x --){for(y = 110; y > 0; y--){}}}void main(){wela = 1;P0 = 0xfe;wela = 0;P3 = 0xff; // 1111 1111while(1){if(keyboard01 == 0){delay(10);if(keyboard01 == 0){d1 = 0;num ++;if(num == 10){num = 0;}}// 判断,加上松手检测while(!keyboard01);delay(10);while(!keyboard01);}else{d1 = 1; dula = 1;P0 = table[num];dula = 0;}}
}
eg3:矩阵键盘
以下的矩阵表示第二行的第一个按键按下去其它的16进制依次类推
10110111 − − − − > 11101101 = = 0 x e d 10110111 ----> 1110 1101 == 0xed 10110111−−−−>11101101==0xed
eg4:51片机矩阵代码实现每按一个按键就会显示一个不同的数
#include <REGX52.H>
#include <INTRINS.H>
sbit d1 = P1^0;
sbit dula = P2^6;
sbit wela = P2^7;
sbit keyboard01 = P3^0;
// 宏定义
#define uint unsigned int
#define uchar unsigned char
uchar num,temp,num1;
uint code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};// 函数声明
uchar keyboardScan();void delay(uint z){uint x,y;for(x = z; x > 0; x --){for(y = 110; y > 0; y--){}}}void main(){// 让所有的数码管都显示num = 17;dula = 1;P0 = 0;dula = 0;wela = 1;P0 = 0xc0;wela = 0;//0xfe 的值是0111 1111 ---> 1111 1110 while(1){num1 = keyboardScan();dula = 1;P0 = table[num1-1]; dula = 0;}}// 键盘扫描函数
uchar keyboardScan(){// 检测键盘P3 = 0xfe;temp = P3;// 1111 1110 & 1111 0000 == 1111 0000// 0xf0 表示的值是0000 1111---> 1111 0000temp = temp&0xf0; // c语言中的switchcase语句while(temp != 0xf0){delay(5);temp = P3;temp = temp&0xf0;while(temp != 0xf0){temp = P3;switch(temp){case 0xee: // 0111 --> 1110num = 1;break; case 0xde: //1011 --> 1101num = 2; break; case 0xbe: // 1011num = 3;break;case 0x7e: // 0111num = 4;break;}while(temp != 0xf0){temp = P3;temp = temp&0xf0;}// 函数的参数可以作为子函数进行调用/*dula = 1;0 = table[num -1];dula = 0; */}}// 检测第二行------------------------------------------------------// 检测键盘P3 = 0xfd;temp = P3;// 1111 1110 & 1111 0000 == 1111 0000// 0xf0 表示的值是0000 1111---> 1111 0000temp = temp&0xf0; // c语言中的switchcase语句while(temp != 0xf0){delay(5);temp = P3;temp = temp&0xf0;while(temp != 0xf0){temp = P3;switch(temp){case 0xed: // 0111 --> 1110num = 5;break; case 0xdd: //1011 --> 1101num = 6; break; case 0xbd: // 1011num = 7;break;case 0x7d: // 0111num = 8;break;}while(temp != 0xf0){temp = P3;temp = temp&0xf0;}// 函数的参数可以作为子函数进行调用/*dula = 1;0 = table[num -1];dula = 0; */}}// 检测第三行-------------------------------------------|---------------|-----------------|----------------|// 检测键盘P3 = 0xfb;temp = P3;// 1111 1110 & 1111 0000 == 1111 0000// 0xf0 表示的值是0000 1111---> 1111 0000temp = temp&0xf0; // c语言中的switchcase语句while(temp != 0xf0){delay(5);temp = P3;temp = temp&0xf0;while(temp != 0xf0){temp = P3;switch(temp){case 0xeb: // 0111 --> 1110num = 9;break; case 0xdb: //1011 --> 1101num = 10; break; case 0xbb: // 1011num = 11;break;case 0x7b: // 0111num = 12;break;}while(temp != 0xf0){temp = P3;temp = temp&0xf0;}// 函数的参数可以作为子函数进行调用/*dula = 1;0 = table[num -1];dula = 0; */}}// 检测第四行--------|---------------|--------------------|---------------------------|-----------------------|------------- // 检测键盘P3 = 0xf7;temp = P3;// 1111 1110 & 1111 0000 == 1111 0000// 0xf0 表示的值是0000 1111---> 1111 0000temp = temp&0xf0; // c语言中的switchcase语句while(temp != 0xf0){delay(5);temp = P3;temp = temp&0xf0;while(temp != 0xf0){temp = P3;switch(temp){case 0xe7: // 0111 --> 1110num = 13;break; case 0xd7: //1011 --> 1101num = 14; break; case 0xb7: // 1011num = 15;break;case 0x77: // 0111num = 16;break;}// 松手检测代码while(temp != 0xf0){temp = P3;temp = temp&0xf0;}// 函数的参数可以作为子函数进行调用/*dula = 1;0 = table[num -1];dula = 0; */}}return num;}
代码的截图----------->需要后期优化
51单片机点击某个keyboard后的显示结果

相关文章:
51单片机KeyWard
eg1: 单片机键盘的分类 键盘分为编码键盘和非编码键盘,键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值得称为编码键盘,如计算机键盘,而靠软件来识别的称为非编码键盘,在单片机组成的各种…...
【简记】getprop, setprop 命令使用
getprop, setprop 命令使用 1、终端设置、读取系统属性 // 例 adb shell setprop "test" "1" adb shell getprop "test"2、安卓读取系统配置 部分属性需要通过反射 android.os.SystemProperties 的方法获取,参见 android 获取手机…...
Ubuntu22.04安装nvidia-docker
安装docker 参考这篇文章:Ubuntu22.04安装docker - 掘金 安装nvidia-docker 参考这篇文章:Ubuntu 22.04 LTS : NVIDIA Container Toolkit : Install : Server World 流程: curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | …...
简单的代码优化(后端)
上一篇谈了谈简单的前端的优化,这次就以下几点谈谈后端的优化。 书写时常见的。 循环里面不要走IO流。 走IO,是要对硬盘进读写操作的。就结论而言,硬盘的读写速度是低于内存的,比如说硬盘上读一次数据,需要1秒&#…...
3.Node-事件循环的用法
题记 node.js事件循环的使用方法 Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都…...
2525.根据规则将箱子分类/并查集/动态规划
2525. 根据规则将箱子分类 - 力扣(LeetCode) 给你四个整数 length ,width ,height 和 mass ,分别表示一个箱子的三个维度和质量,请你返回一个表示箱子 类别 的字符串。 如果满足以下条件,那么…...
2023年10月小程序云开发cms内容管理无法使用,无法同步内容模型到云开发数据库的解决方案
一,问题描述 最近越来越多的同学找石头哥,说cms用不了,其实是小程序官方最近又搞大动作了,偷偷的升级的云开发cms(内容管理)以下都称cms,不升级不要紧,这一升级,就导致我…...
无论有没有按钮,iPhone都可以进行截屏操作!如何在iPhone上截屏
通过简单的按键组合,可以很容易地将iPhone屏幕的图片捕获到图像文件中,并保存到照片库中。以下是操作方法。 什么是屏幕截图 屏幕截图是指通常包含你在设备屏幕上看到的内容的精确副本的图像。在设备内拍摄的数字屏幕截图通常使用相机拍摄物理屏幕的照…...
笔记本平台信号讲解
1、power button:这个信号会引起SMI#或者SCI来表示系统请求进入到睡眠状态。如果系统已经处于睡眠状态,这将导致唤醒事件信号。 如果PWRBTN#键超过4秒,这将导致一个无条件的过渡(电源按钮替代)到S5状态。即使系统是在S1-S4的状态,覆盖也会发生。 这个信号有一个内部上拉…...
什么是Sectigo证书?
Sectigo证书,早前被称为Comodo证书,是一种SSL(安全套接层)证书,用于保护互联网上的数据传输的安全性和隐私性。这些证书由全球领先的SSL证书颁发机构Sectigo颁发,被广泛用于网站、应用程序和服务器上。本文…...
虹科 | 测试方案 | 汽车示波器 通讯网络(LIN/CAN/FlexRay)测试方案
通讯网络(LIN/CAN/FlexRay)测试 虹科CAN总线示波器把你的PC电脑变成一台功能强大的汽车测试工具,用于检测车辆网络各类通讯信号,如CAN Bus、CAN FD、LIN、FlexRay,还可以检测车上所有传感器和执行器的信号 串行译码 …...
ubuntu20.04安装MySQL8、MySQL服务管理、mysql8卸载
ubuntu20.04安装MySQL8 #更新源 sudo apt-get update #安装 sudo apt-get install mysql-serverMySQL服务管理 # 查看服务状态 sudo service mysql status # 启动服务 sudo service mysql start # 停止服务 sudo service mysql stop # 重启服务 sudo service mysql restart登…...
曾仕强老师视频+音频+电子书合集百度网盘资源
需要的扫码添加获取:...
KubeSphere安装mysql8
需要持久化储存数据的,建立有状态服务。 无状态服务是不会持久化的,重启就归零 KubeSphere 创建自建应用后,创建有状态服务,但是自己应用的有状态服务不能外放端口,需要在服务哪里删除pod,在创建负载指定相…...
相似度loss汇总,pytorch code
用于约束图像生成,作为loss。 可梯度优化 pytorch structural similarity (SSIM) loss https://github.com/Po-Hsun-Su/pytorch-ssimhttps://github.com/harveyslash/Facial-Similarity-with-Siamese-Networks-in-Pytorch/blob/master/Siamese-networks-medium.ip…...
python中的yolov5结合PyQt5,使用QT designer设计界面没正确启动的解决方法
python中的yolov5结合PyQt5,使用QT designer设计界面没正确启动的解决方法 一、窗体设计test: 默认你已经设计好了窗体后: 这时你需要的是保存生成的untitle.ui到某个文件夹下,然后在命令行中奖.ui转换为.py(,通过…...
Milk-V Duo移植rt-thread smart
前言 (1)PLCT实验室实习生长期招聘:招聘信息链接 (2)首先,我们拿到Milk-V Duo板子之后,我个人建议先移植大核Linux。因为那个资料相对多一点,也简单很多,现象也容易观察到…...
会声会影2024有哪些新功能?好不好用
比如会声会影视频编辑软件,既加入光影、动态特效的滤镜效果,也提供了与色彩调整相关的LUT配置文件滤镜,可选择性大,运用起来更显灵活。会声会影在用户的陪伴下走过20余载,经过上百个版本的优化迭代,已将操作…...
vue3 + axios 中断取消接口请求
前言 最近开发过程中,总是遇到想把正在请求的axios接口取消,这种情况有很多应用场景,举几个例子: 弹窗中接口请求返回图片,用于前端展示,接口还没返回数据,此时关闭弹窗,需要中断接…...
Linux高性能服务器编程——ch6笔记
第6章 高级I/O函数 6.1 pipe函数 用于创建一个管道,以实现进程间通信。 int pipe(int fd[2]); 读端文件描述符fd[0]和写端文件描述符fd[1]构成管道的两端,默认是阻塞的,fd[0]读出数据,fd[1]写入数据。管道内部传输的数据是字节…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
