51单片机KeyWard

eg1: 单片机键盘的分类

  • 键盘分为编码键盘和非编码键盘,键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值得称为编码键盘,如计算机键盘,而靠软件来识别的称为非编码键盘,在单片机组成的各种系统中使用最多的就是非编码键盘,也有使用到编码键盘的,非编码键盘又称为独立式和矩阵式键盘。

单片机键盘根据按键的结构和工作原理的不同,可以分为以下几类:

  1. 矩阵键盘(Matrix Keyboard):
    • 矩阵键盘是最常见的单片机键盘之一。
    • 它使用一种矩阵排列的按键结构,通过行和列的交叉点来确定按下的按键。
    • 一般通过行列扫描的方式来检测按键的按下和释放。
  2. 独立按键(Individual Key):
    • 独立按键是指每一个按键都有独立的引脚连接到单片机。
    • 每个按键都使用一个独立的IO引脚,通过读取引脚的电平状态来检测按键的按下和释放。
    • 独立按键一般用于需要较少按键的应用场景。
  3. 脉冲编码开关(Encoder Switch):
    • 脉冲编码开关也被称为旋转编码开关,用于检测旋转操作。
    • 它通常由两个触点组成,通过检测两个触点的状态变化来确定旋转方向和步数。
    • 脉冲编码开关常用于旋转编码器、音量调节器等应用场景。
  4. 矩阵键盘和独立按键结合:
    • 在某些情况下,矩阵键盘和独立按键可能会结合使用。
    • 例如,一些常用的功能按键使用独立按键,而数字键盘使用矩阵键盘的方式来连接到单片机。

单片机键盘电路设计图
在这里插入图片描述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后的显示结果
在这里插入图片描述

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

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

相关文章

Leetcode-Easy题解1-回文数字

目录 解法1解法2 解法1 自己的想法,直接转成字符串首尾俩下标同时遍历比较 class Solution {public boolean isPalindrome(int x) {if(x<0){return false;}String strString.valueOf(x);int i0;for (;i<str.length()>>1;i){if(str.charAt(i)!str.charAt(str.leng…

AI篇-如何用AI辅助对图片进行鉴赏

前言 目录 前言 一、观众侧鉴赏图片 方法1&#xff1a;直接将图片发给文心一言&#xff0c;让文心一言分析。 方法2&#xff08;正确方法&#xff09;&#xff1a;将图片简单介绍并把图片发给文心一言&#xff0c;让文心一言分析。 二、作者介绍图片 方法&#xff08;正…

系统架构师考试科目一:综合知识

某软件公司欲开发一个 Windows 平台上的公告板系统。在明确用户需求后&#xff0c;该公司的 架构师决定采用 Command 模式实现该系统的界面显示部分&#xff0c;并设计 UML 类图如下 图所示。图中与 Command 模式中的 Invoker 角色相对应的类是( ) &#xff0c;与 ConcreteComm…

02、MySQL-------主从复制

目录 七、MySql主从复制启动主从复制&#xff1a;原理&#xff1a;实现&#xff1a;1、创建节点2、创建数据库3、主从配置1、主节点2、从节点 4、测试&#xff1a;5、问题&#xff1a;1、uuid修改2、service_id3、读写不同步方法1&#xff1a;方法2&#xff1a; 七、MySql主从复…

http post协议发送本地压缩数据到服务器

1.客户端程序 import requests import os # 指定服务器的URL url "http://192.168.1.9:8000/upload"# 压缩包文件路径 folder_name "upload" file_name "test.7z" headers {Folder-Name: folder_name,File-Name: file_name } # 发送POST请求…

经管博士科研基础【26】海塞矩阵

1. 海塞矩阵 海塞矩阵是一个由多变量实值函数的所有二阶偏导数组成的方块矩阵。 一元函数就是二阶导,多元函数就是二阶偏导组成的矩阵。求向量函数最小值时可以使用,矩阵正定是最小值存在的充分条件。经济学中常常遇到求最优的问题,目标函数是多元非线性函数的极值问题,尚…

连续/离散的控制系统阶跃测试(包括MATLAB里的step()函数)

阶跃测试 只要是连续时间系统&#xff0c;无论是传递函数还是连续状态空间形式的模型&#xff0c;直接可以用**step()**做阶跃测试&#xff1b;但是对于离散系统而言&#xff0c;不能用step()函数&#xff0c;可以自行编写代码&#xff0c;如下。 1、离散系统&#xff1a;x(k…

基础算法学习|高精度

高精度 模板 高精度加法 // C A B, A > 0, B > 0 vector<int> add(vector<int> &A, vector<int> &B) {//大的数小的数if (A.size() < B.size()) return add(B, A);vector<int> C;int t 0;for (int i 0; i < A.size(); i )…

Docker容器技术实战1

1、docker容器 docker相当于传统的货运集装箱 虚拟机&#xff08;Virtual Machine&#xff0c;VM&#xff09;是一个完整的虚拟操作系统和硬件环境。它的工作原理是通过在一台物理主机上使用虚拟化软件来创建多个虚拟机实例&#xff0c;每个实例都可以运行独立的操作系统和应用…

华为eNSP配置专题-浮动路由及BFD的配置

文章目录 华为eNSP配置专题-浮动路由及BFD的配置0、参考文档1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、基本终端构成和连接2.2、基本终端配置 3、浮动路由配置3.1、浮动路由的基本配置3.2、浮动路由的负载均衡问题3.3、浮动路由的优先级调整 4、BFD的配置4.1…

二维码智慧门牌管理系统升级解决方案:突破传统,实现质检与抽检的个性化配置

文章目录 前言一、引入“独立质检”二、个性化抽检类别设定三、触发重采要素的功能升级四、升级优势与展望 前言 在数字化时代&#xff0c;智慧门牌管理系统已经成为社会管理的重要工具。为了满足各种复杂需求&#xff0c;系统升级是必然趋势。本次升级主要针对质检和抽检两大…

汽车屏类产品(四):仪表Cluster

###前言 仪表Cluster/仪表盘Dashboard,作为伴随汽车诞生就存在的一个主要零部件之一,从机械到电子到数字,可以说也是逐渐发展到现在的。 目前的主流框图如下,中间processor就是主控芯片,可能有buttons/switches,有display显示屏+backlight背光,有audio->speake…