首页 > 其他分享 >51单片机学习笔记 STC89C52RC (05)矩阵键盘和独立键盘(轻触开关)

51单片机学习笔记 STC89C52RC (05)矩阵键盘和独立键盘(轻触开关)

时间:2023-04-22 21:56:30浏览次数:46  
标签:case P3 05 S2 51 键盘 keyValue 按键 break

按键抖动,需要消抖

 原理图来自清翔电子

一、独立键盘模块

1.可以直接获取  P3^0对应S2  P3^1对应S3  P3^2对应S4  P3^3对应S5  的电压

当轻触开关按下时,电流会流向GND,此时这一路的电压为0V,松开轻触开关,又变为5V

 

//第一种方法:单个I/O口检测控制

#include <reg51.h>

sbit S2 = P3^0;
sbit S3 = P3^1;
sbit S4 = P3^2;
sbit S5 = P3^3;

void main() {
    if(S2 == 0) {//判断按键是否被按下,按下就是电压为0
        Delay10ms();//按键消抖
        if(S2 == 0) {//判断按键是真的被按下
            //要执行的代码
        }//此时按键一直处于按下状态,也就是电压一直为0
        while(!S2);//按键不松手,就不重复执行,此时S2为0,!取反后为1,就会一直在循环里不出来
    }
    if(S3 == 0) {
        Delay10ms();
        while(!S3);
        if(S3 == 0) {//松手响应,与S2不同,S2为按下相应,和键盘一样
            //要执行的代码
        }
    }
    if(S4 == 0) {
        Delay10ms();
        if(S4 == 0) {
            //要执行的代码
        }
        while(!S4);
    }
    if(S5 == 0) {
        Delay10ms();
        if(S5 == 0) {
            //要执行的代码
        }
        while(!S5);
    }
}

//第二种方法:用switch对I/O口检测控制

#include <reg51.h>

void main() {
    P3 = 0xFF;//默认所有P3口为高电平,二进制1111 1111
    if(P3 != 0xFF){//按键按下,电压发生变化
        Delay10ms();//消除按键抖动
        if(P3 != 0xFF) {//判断按键是真的被按下
            switch(P3) {
                 /*
                     0xFE 1111 1110  P0^0口电压为0
                     0xFD 1111 1101  P0^1口电压为0
                     0xFB 1111 1011  P0^2口电压为0
                     0xF7 1111 0111  P0^3口电压为0
                 */
                case 0xFE:  //S2按键要执行的逻辑代码;	
                    break;
                case 0xFD: //S3按键要执行的逻辑代码;	
                    break;
                case 0xFB: //S4按键要执行的逻辑代码;	
                    break;
                case 0xF7: //S5按键要执行的逻辑代码;	
                    break;
            }
        }
    }
}

二、独立键盘模块

1.行扫描 + 列扫描 可以准确获取那一个按钮被按下

#include <reg51.h>

unsigned char keyValue;

void main() {
//4*4矩阵键盘
    P3 = 0xF0;//行选择器 二进制1111 0000
	if(P3 != 0xF0) {//判断按键是否被按下
		Delay10ms();//软件消抖
		if(P3 != 0xF0) {//判断按键是真的被按下
			switch(P3) {
				case 0xE0: keyValue = 0;
                    break;
				case 0xD0: keyValue = 1;	
                    break;
				case 0xB0: keyValue = 2;	
                    break;
				case 0x70: keyValue = 3;	
                    break;
			}
			P3 = 0x0F;//行选择器 二进制0000 1111
			switch(P3) {
				case 0xE: keyValue = keyValue;	//第一行第一个为 S6 记为第0个,后面根据原理图往后依次S7 S8 S9
                    break;
				case 0xD: keyValue = keyValue + 4;	//第二行第一个为 S10 记为第0个,后面根据原理图往后依次S11 S12 S13
                    break;
				case 0xB: keyValue = keyValue + 8;	//第三行第一个为 S14 记为第0个,后面根据原理图往后依次S15 S16 S17
                    break;
				case 0x7: keyValue = keyValue + 12;	//第四行第一个为 S18 记为第0个,后面根据原理图往后依次S19 S20 S21
                    break;
			}
		}
	}
}

图解,编程一下就很好理解了

 

标签:case,P3,05,S2,51,键盘,keyValue,按键,break
From: https://www.cnblogs.com/wjl-de-java/p/17344175.html

相关文章

  • 物联网---05.RS-485一主多从的连接方式及通信注意事项
    RS-485的通信方式需要注意下图是主机向从机发送信息的示意图,其中485的线都是手牵手相连的,因此主机向下发的时候,其实各个从机都有在接收数据的,只是,从机是根据地址来区分是否是发给自己的,举例:1、如果主机发送信息中,带有地址1,2、则从机1认为是发送自己的数据,因此需要解析,然后如果......
  • 剑指Offer——05.替换空格(c语言)
    title:剑指Offer05.替换空格(c语言)请实现一个函数,把字符串s中的每个空格替换成"%20"。示例1:输入:s="Wearehappy."输出:"We%20are%20happy."限制:$$0\leqslants的长度\leqslant10000$$代码如下:char*replaceSpace(char*s){if(NULL==s){return......
  • 正确使用 51CTO博客—Markdown 的排版事例
    这是一篇关于讲解如何正确使用51CTO博客-Markdown的排版示例,希望通过此,大家都能轻松上手,都能通过Markdown能够让自己的文章有更加出色、更清晰明了的排版。什么是MarkdownMarkdown(MD)是现在普遍使用的一种文档书写语言格式,只需用一些非常简单易记的符号,如(#*/>[]()\),......
  • PyTorch项目实战05——Tensor的广播机制
    1广播机制介绍矩阵运算,往往只能在两个矩阵维度相同或者相匹配时才能运算。比如加减法需要两个矩阵的维度相同,乘法需要前一个矩阵的列数与后一个矩阵的行数相等。当参与运算的两个维度不同也不匹配的矩阵进行运算时,该机制会对数组进行扩展,使数组的shape属性值一样,这样,就可以进行矢......
  • 51单片机学习笔记 STC89CRC (04)数码管和锁存器
    一、数码管 点亮:共阴极给高电平,共阳级给低电平,二进制点亮顺序为  dpgfedcba想要显示1,就可以给0x06, //00000110,bc亮起显示1.0x3F,//"0"0x06,//"1"0x5B,//"2"0x4F,//"3"0x66,//"4"0x6D,//"5"......
  • 文章学习:基于AVX-512指令集的同态加密算法中大整数运算性能优化与突破
    学习文章:英特尔×同态科技|基于AVX-512指令集的同态加密算法中大整数运算性能优化与突破文章人工智能的安全隐患ChatGPT的成功大部分来源于海量的数据支撑和丰富的数据维度,基于13亿参数量的庞大模型,随着用户的不断涌入,ChatGPT不断迭代进化新的“知识”,而在模型表达能力的增......
  • 05-目录-计算机基础(组成原理、微机原理、汇编、操作系统、网络)
    :链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接12:链接13:链接14:链接15:链接16:链接17:链接18:链接19:链接20:链接:链接:链接:链接:链接:......
  • PCF8591 AD/DA转换基于51
    #include<reg52.h>#include<intrins.h>//内部有_nop_();//IIC模拟时序实现//注意:SCL为高电平时变化SDA数据是起始或者终止信号;所以若不是起始或者终止信号,需要在SCL为低电平时变化SDA数据sbitSDA=P2^0;sbitSCL=P2^1;sbitLED=P2^3;sbitwei=P2^6;sbitdu......
  • 1053 等重路径
    给定一个非空的树,树根为 R。树中每个节点 Ti 的权重为 Wi。从 R 到 L 的路径权重定义为从根节点 R 到任何叶节点 L 的路径中包含的所有节点的权重之和。现在给定一个加权树以及一个给定权重数字,请你找出树中所有的权重等于该数字的路径(必须从根节点到叶节点)。例如......
  • Counting Rectangles UVA - 10574
    给出n个点。问选出4个点作为定点,能够组成多少个平行与坐标轴的矩形。 点按照x排序 n^2挑选出垂直x轴的线段,按照y1排序  #include<iostream>#include<cstring>#include<algorithm>#include<vector>usingnamespacestd;constintN=1e5;structT{ intx......