51单片机KeyWard

news2024/10/5 20:25:21

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 1111
   while(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 1111
   while(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 0000
		  temp = temp&0xf0; 
		  // c语言中的switchcase语句
		  while(temp != 0xf0){
				      delay(5);
				      temp = P3;
				      temp = temp&0xf0;
				      while(temp != 0xf0){
								  temp = P3;
							    switch(temp){
			         	     case 0xee: // 0111 --> 1110
					                num = 1;
          								break;	 
      						   case 0xde:  //1011 --> 1101
					                num = 2; 
          								break;	
      						   case 0xbe: // 1011
					                num = 3;
          								break;
      						   case 0x7e: // 0111
					                num = 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 0000
		  temp = temp&0xf0; 
		  // c语言中的switchcase语句
		  while(temp != 0xf0){
				      delay(5);
				      temp = P3;
				      temp = temp&0xf0;
				      while(temp != 0xf0){
								  temp = P3;
							    switch(temp){
			         	     case 0xed: // 0111 --> 1110
					                num = 5;
	      								break;	 
	  						   case 0xdd:  //1011 --> 1101
					                num = 6; 
	      								break;	
	  						   case 0xbd: // 1011
					                num = 7;
	      								break;
	  						   case 0x7d: // 0111
					                num = 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 0000
		  temp = temp&0xf0; 
		  // c语言中的switchcase语句
		  while(temp != 0xf0){
				      delay(5);
				      temp = P3;
				      temp = temp&0xf0;
				      while(temp != 0xf0){
								  temp = P3;
							    switch(temp){
			         	     case 0xeb: // 0111 --> 1110
					                num = 9;
	      								break;	 
	  						   case 0xdb:  //1011 --> 1101
					                num = 10; 
	      								break;	
	  						   case 0xbb: // 1011
					                num = 11;
	      								break;
	  						   case 0x7b: // 0111
					                num = 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 0000
		  temp = temp&0xf0; 
		  // c语言中的switchcase语句
		  while(temp != 0xf0){
				      delay(5);
				      temp = P3;
				      temp = temp&0xf0;
				      while(temp != 0xf0){
								  temp = P3;
							    switch(temp){
			         	     case 0xe7: // 0111 --> 1110
					                num = 13;
	      								break;	 
	  						   case 0xd7:  //1011 --> 1101
					                num = 14; 
	      								break;	
	  						   case 0xb7: // 1011
					                num = 15;
	      								break;
	  						   case 0x77: // 0111
					                num = 16;
	      								break;
	                								 
			          }
									// 松手检测代码
						     while(temp != 0xf0){
									  temp = P3;
										temp = temp&0xf0;
									}
								 // 函数的参数可以作为子函数进行调用
									/*
									dula = 1;
								  0 = table[num -1];
								  dula = 0; 
									*/
	
			      }
	
	      }
			
				return num;

   }

代码的截图----------->需要后期优化

在这里插入图片描述51单片机点击某个keyboard后的显示结果
在这里插入图片描述

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

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

相关文章

Python数字类型

目录 目标 版本 种类 官方文档 数据运算方法 常用函数 转整数 转浮点数 转绝对值 四舍五入 进制转换 math模块常用函数 目标 掌握Python两种数据类型的使用方法。 版本 Python 3.12.0 种类 数字类型有三种&#xff0c;分别是&#xff1a; 整数&#xff08;int&…

C++类和对象(五) 拷贝构造函数

1 概念 在现实生活中&#xff0c;可能存在一个与你一样的自己&#xff0c;我们称其为双胞胎。那在创建对象时&#xff0c;可否创建一个与已存在对象一某一样的新对象呢&#xff1f; 那在创建对象时&#xff0c;可否创建一个与已存在对象一某一样的新对象呢&#xff1f; 拷贝构造…

Linux高性能编程学习-TCP/IP协议族

一、TCP/IP协议族结构与主要协议 分层&#xff1a;数据链路层、网络层、传输层、应用层 1. 数据链路层 功能&#xff1a;实现网卡驱动程序&#xff0c;处理数据在不同物理介质的传输 协议&#xff1a; ARP&#xff1a;将目标机器的IP地址转成MAC地址RARP&#xff1a;将MAC地…

【Java基础面试四十五】、 介绍一下泛型擦除

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;介绍一下泛型擦除 参考…

2023年10月小程序云开发cms内容管理无法使用,无法同步内容模型到云开发数据库的解决方案

一&#xff0c;问题描述 最近越来越多的同学找石头哥&#xff0c;说cms用不了&#xff0c;其实是小程序官方最近又搞大动作了&#xff0c;偷偷的升级的云开发cms&#xff08;内容管理&#xff09;以下都称cms&#xff0c;不升级不要紧&#xff0c;这一升级&#xff0c;就导致我…

【Matlab】三维绘图函数汇总

本文用于汇总 Matlab 中的三维绘图函数。plot3() 函数用于绘制用参数方程表示的三维曲线。ezplot3() 函数用于三维曲线的符号绘图&#xff0c;需要用参数方程表示。mesh() 函数用于绘制三维曲面网格。surf() 函数用于绘制三维空间曲面。 目录 1. plot3() 2. ezplot3() 3. me…

中医理疗中药材经营小程序商城的作用是什么

对消费者而言&#xff0c;能找到一家靠谱的中医养生馆很重要&#xff0c;但如非朋友介绍或恰好看到纸质广告等&#xff0c;仅依赖线下跑腿很难找到合适的门店&#xff0c;同时也很费时费力。 同时购买相关产品&#xff0c;也只能前往实体店购买或线上第三方商城&#xff0c;当…

【29】c++设计模式——>策略模式

策略模式 C中的策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在运行时选择算法的行为。策略模式通过将算法封装成独立的类&#xff0c;并且使它们可以互相替换&#xff0c;从而使得算法的变化独立于使用算法的客户端。 策略模式通…

2.3.C++项目:网络版五子棋对战之实用工具类模块的设计

文章目录 一、实用工具类模块&#xff08;一&#xff09;功能 二、设计和封装&#xff08;一&#xff09;日志宏封装&#xff08;二&#xff09;mysql_util封装&#xff08;三&#xff09;Jsoncpp-API封装&#xff08;四&#xff09;file_util封装&#xff08;五&#xff09;st…

Linux:实用操作

Linux&#xff1a;实用操作 1. 各类小技巧1.1 controlc(ctrl c) 强制停止1.2 可以通过快捷键&#xff1a;control d(ctrl d)&#xff0c;退出账户的登录1.3 历史命令搜索1.4 光标移动快捷键 2. 软件安装2.1 介绍2.2 yum命令(需要root权限)在这里插入图片描述 3. systemctl4.…

【C++11】函数的可变参数模板

文章目录 一. 为什么要有可变参数模板&#xff1f;二. 什么是可变参数模板&#xff1f;三. 如何展开参数包&#xff1f;1. 递归函数方式展开参数包2. 通过初始化列表展开参数包 一. 为什么要有可变参数模板&#xff1f; C98/03 中的模板为能够实现泛型编程提供了便利&#xff…

购买腾讯云服务器如何领取优惠券?

随着云计算技术的不断发展&#xff0c;越来越多的个人和企业开始选择云服务器作为其业务发展的基础。作为国内领先的云计算服务商&#xff0c;腾讯云服务器以其稳定、安全、灵活的特点&#xff0c;受到了广大用户的青睐。为了更好地回馈用户&#xff0c;腾讯云服务器经常会推出…

C++ 类和对象(六)赋值运算符重载

1 运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c; 也具有其返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型与参数列表与普通的函数类似。 函数名字为&#xff1a;关键字operator后面接需…

并发编程-Java内存模型

Java内存模型 在并发编程中&#xff0c;需要处理的两个关键问题&#xff1a; 1&#xff09;多线程之间如何通信&#xff08;线程之间以何种机制来交换数据&#xff09; 2&#xff09;多线程之间如何同步&#xff08;控制不同线程间操作发生的相对顺序&#xff09; 线程之间…

AMD移动FP5平台时序解释

由于刚开始接触AMD移动平台,难免有错误;如有错误请指出共同进步。 配置如下: APU:FP5 Processor EC: ITE5570 CorePMU:RT3662AC 一、基本知识概括 1、IC pin脚信号解释 (1)一般OK是外部信号(对于IC来说是Input);PG是IC发出的(对于IC来说是Output);AMD开机:EN---…

存储优化知识复习三详细版解析

存储优化 知识复习三 一、 选择题 1、 数据库领域的三位图灵奖得主是( )。 A、C.W.Bachman B、E.F.Codd C、Peter Naur D、James Gray 【参考答案】ABD2、 数据库DB、数据库系统DBS、数据库管理系统DBMS三者之间得关系是&#xff08; &#xff09;。 A、&#xff24;B&#…

linux性能分析(四)性能优化导轮

一 别再让Linux性能问题成为你的绊脚石 ① 学习历程 备注&#xff1a; 跟我的学习经历很相像刚工作时遇到的场景跟我现在一样,深深的无力感驱使我继续前行目标: 性能优化成为我的肌肉记忆,写代码的潜意识 ... ② 常见的问题 ③ 性能问题为什么这么难呢 思考&#xff1a…

【驱动开发】创建设备节点、ioctl函数的使用

一、控制三盏灯的亮灭 头文件&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #def…

java读取指定文件夹下的全部文件,并输出文件名,文件大小,文件创建时间

import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.*; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { try { Path startingDir Paths.get("你的目…

带你了解如何防御DDoS攻击

DDoS攻击的类型和方法 分布式拒绝服务攻击&#xff08;简称DDoS&#xff09;是一种协同攻击&#xff0c;旨在使受害者的资源无法使用。它可以由一个黑客组织协同行动&#xff0c;也可以借助连接到互联网的多个受破坏设备来执行。这些在攻击者控制下的设备通常称为僵尸网络。 …