首页 > 其他分享 >05-独立按键的基本操作与扩展应用

05-独立按键的基本操作与扩展应用

时间:2023-10-04 10:55:44浏览次数:33  
标签:P2 stat 05 DelayK 按下 while 按键 sbit 基本操作

05-独立按键的基本操作与扩展应用

在写代码前需做如下,否则独立按键无响应:

微信图片_20231004093700

由电路图可知:独立按键默认为高电平,当按键按下时为低电平

即S7(P30)、S6(P31)、S5(P32)、S4(P33)

当按下按键时,P3口对应低电平,松开后对应高电平,判断是否一直按下此时需要使用while(1) 死循环,由于是按下点亮,松开熄灭,所以当一直按下时,点亮且进入死循环,否则熄灭

20231003212924

代码如下:

#include <REGX52.H>
sbit s7 = P3^0;
sbit s6 = P3^1;
sbit s5 = P3^2;
sbit s4 = P3^3;


sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;

void _74HC138(unsigned char n) {
	switch(n) {
		case 4:
			P2 = (P2&0x1f) | 0x80; // LED
			break;
		case 5:
			P2 = (P2&0x1f) | 0xa0; //蜂鸣器和继电器
			break;
		case 6:
			P2 = (P2&0x1f) | 0xa0; // 数码管位选
			break;
		case 7:
			P2 = (P2&0x1f) | 0xc0; // 数码管段选
			break;
		case 0:
			P2 = (P2&0x1f) | 0x00; //
			break;
	
	}

}

void DelayK(unsigned char t) {
	while(t--);
}

void ScanKeys_Alone() {
	if(s7 == 0) {       //检测是否按下
		 DelayK(100);   
		 if(s7 == 0) {
			 L1 = 0;
			 while(s7==0);  // 如果为低电平就一直循环 检测是否松开
			 L1 = 1;
		 }
	}
	
	
	if(s6 == 0) {       //检测是否按下
		 DelayK(100);   
		 if(s6 == 0) {
			 L2 = 0;
			 while(s6==0);  // 如果为低电平就一直循环 检测是否松开
			 L2 = 1;
		 }
	}
	
	if(s5 == 0) {       //检测是否按下
		 DelayK(100);   
		 if(s5 == 0) {
			 L3 = 0;
			 while(s5==0);  // 如果为低电平就一直循环 检测是否松开
			 L3 = 1;
		 }
	}
	
	if(s4 == 0) {       //检测是否按下
		 DelayK(100);   
		 if(s4 == 0) {
			 L4 = 0;
			 while(s4==0);  // 如果为低电平就一直循环 检测是否松开
			 L4 = 1;
		 }
	}
	

}
void main(void) {
	_74HC138(4);
	while(1) {
		ScanKeys_Alone();
	
	}
	

}

20231003223716

由上可知:该题目意思为S7与S6为状态选择键,且L1与L2分别为S7、S6的状态指示灯,且L1与L2不可同时点亮. 当L1点亮时,S5、S4分别控制L3,L4,当L2点亮时,S5、S4分别控制L5,L6,且按键S5、S4按下后点亮,松开后熄灭

所以此时生声明一个变量stat.且默认stat=0,当S7按下时,将stat赋值为1,且点亮L1,当S6按下时,将stat赋值为2,且点亮L2,再次按下时,熄灭LED灯

当L1点亮时,stat=1,且S5按下时,L3点亮,S4按下时,L4点亮

当L2点亮时,stat=2,且S5按下时,L5点亮,S4按下时,L6点亮

#include <REGX52.H>
sbit s7 = P3^0;
sbit s6 = P3^1;
sbit s5 = P3^2;
sbit s4 = P3^3;

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;
sbit L5 = P0^4;
sbit L6 = P0^5;
sbit L7 = P0^6;
sbit L8 = P0^7;

void _74HC138(unsigned char n) {
	switch(n) {
		case 4:   // LED
			P2 = (P2 & 0x1f) | 0x80;
			break;
		case 5: //蜂鸣器和继电器
			P2 = (P2 & 0x1f) | 0xa0;
			break;
		case 6: // 数码管位选
			P2 = (P2 & 0x1f) | 0xc0;
			break;
		case 7: // 数码管段选
			P2 = (P2 & 0x1f) | 0xe0;
			break;
		case 0: 
			P2 = (P2 & 0x1f) | 0x00;
			break;
	}

}

void DelayK(unsigned int t) {
	while(t--);

}
void SystemInit(void) {
	_74HC138(5);
	P0 = 0x00;  // 关闭蜂鸣器和继电器
	_74HC138(4);
	P0 = 0xff;  // 关闭所有LED
	
}
unsigned char stat_k = 0;  
// stat_k = 0    
void ScanKey_Alone(void) {
	// 当stat_k == 1的时候为s7的控制源
	// 当stat_k == 2的时候为s6的控制源
	if(s7 == 0) {
		DelayK(300);
		if(s7== 0) {
			if(stat_k == 0) {
				DelayK(100);
				while(s7==0) {
					stat_k = 1;
				}
				L1 = 0;
				DelayK(100);
			
			}else if(stat_k == 1) {
				DelayK(100);
				while(s7 ==0) {
					stat_k = 0;
				}
				L1 = 1;
				
				
			}
		
		}
	
	}
	
	if(s6 == 0) {
		DelayK(300);
		if(s6 == 0) {
			if(stat_k == 0) {
				DelayK(100);
				while(s6 == 0){
					stat_k = 2;
				}
				L2 = 0;
				DelayK(100);
				
			}else if(stat_k == 2) {
				DelayK(100);
				while(s6 == 0) {
					stat_k = 0;
				}
				L2 = 1;
				
			}
		
		
		}
	}
	
	if(s5 == 0) {
		DelayK(300);
		if(s5==0) {
			if(stat_k == 1) {
				L3 = 0;
				while(s5 == 0);
				L3 = 1;
			
			}else if(stat_k == 2) {
				L5 = 0;
				while(s5 == 0);
				L5 = 1;
			}
		
		}
	
	
	}
	
	if(s4 == 0) {
		DelayK(300);
		if(s4 == 0) {
			if(stat_k == 1) {
				L4 = 0;
				while(s4 == 0);
				L4 = 1;
			}else if(stat_k == 2) {
				L6 = 0;
				while(s4 == 0);
				L6 = 1;
			}
		}
	}
}

void main(void) {
	// 初始化
	SystemInit();
	// 先让LED使能
	_74HC138(4);
	while(1) {
		ScanKey_Alone();
	
	}
	

}

标签:P2,stat,05,DelayK,按下,while,按键,sbit,基本操作
From: https://www.cnblogs.com/bky111/p/17742025.html

相关文章

  • 【笔记】P2542 [AHOI2005] 航线规划 答辩做法
    洛谷上是可以过掉的。NFLSOJ上加强数据,还卡常,所以90pts。首先倒着做很好想。对于最终的图,我们可以tarjan缩点然后建树,边权为\(1\),表示一条割边。然后每次连两个点的时候就把树上这一段路径赋值为\(0\)。查询就是树上路径和。这些操作都可以点赋边权然后树剖来做。所以你就得......
  • 文心一言 VS 讯飞星火 VS chatgpt (105)-- 算法导论10.1 3题
    三、用go语言,仿照图10-2,画图表示依次执行操作ENQUEUE(Q,4)、ENQUEUE(Q,1)、ENQUEUE(Q,3)、DEQUEUE(Q)、ENQUEUE(Q,8)和DEQUEUE(Q)每一步的结果,队列初始为空,存储于数组Q[1..6]中。文心一言:在这个问题中,我们尝试使用Go语言来模拟队列的操作,并且展示每一步的结果。首先,我们需要定......
  • 文心一言 VS 讯飞星火 VS chatgpt (105)-- 算法导论10.1 3题
    三、用go语言,仿照图10-2,画图表示依次执行操作ENQUEUE(Q,4)、ENQUEUE(Q,1)、ENQUEUE(Q,3)、DEQUEUE(Q)、ENQUEUE(Q,8)和DEQUEUE(Q)每一步的结果,队列初始为空,存储于数组Q[1..6]中。文心一言:在这个问题中,我们尝试使用Go语言来模拟队列的操作,并且展示每一步的结果。首先,我们需要定义......
  • 图像的基本操作
    ......
  • Linux系统中驱动之设备树添加按键驱动方法
    大家好,每日一个简单的驱动,日久方长,对Linux驱动就越来越熟悉,也越来容易学会写驱动程序。今日进行简单的按键驱动。一、Linux下按键驱动原理按键驱动和LED驱动原理上来讲基本都是一样的,都是操作GPIO,只不过一个是读取GPIO的高低电平,一个是从GPIO输出高低电平。本次实现按键输入......
  • linux系统中rootfs根文件系统制作及挂载基本操作
    今天给大家介绍一下rootfs根文件系统制作和挂载方式,希望这篇文章对大家有所帮助。本章主要是对rootfs根文件系统制作和挂载方式进行详细讲解。Linux“三巨头”已经完成了2个了,就剩最后一个rootfs(根文件系统)了,本章我们就来学习一下根文件系统的组成以及如何构建根文件系统。这是......
  • 2023-2024-1 20231305《计算机基础与程序设计》第一周学习总结
    2023-2024-120231305《计算机基础与程序设计》第1周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2022-2023-1计算机基础与程序设计第一周作业)这个作业的目标<快速浏览一遍教材计......
  • CF1051G Distinctification
    Day\(3^3\)。未卡常拿到了最优解/cy。(2023/10/2)观察到\(3\)个比较关键的性质:操作具有可逆性,即一串操作序列可以立即撤销。当新插入一个\((a_i,b_i)\)时,必须连续对\(i\)进行\(1\)操作使得不存在\(j\neqi,a_j=a_i\)。当存在\(a_i=a_j+1\)时,可以花费\(b_j-b_i\)......
  • UVA10054 The Necklace 题解
    好可恶一道题,怎么没人告诉我输出之间有空行(思路是先抽象成图,然后跑一边dfs记录边的前后顺序。对于不能成环的情况,只需要再开个数组记录度数判断奇点即可。若存在奇点则break掉,剩下的跑dfs、//producedbymiya555//stupidmistakes:1.多测要清空2.输出之间有空行//ideas:d......
  • AtCoder Grand Contest 056 D Subset Sum Game
    洛谷传送门AtCoder传送门考虑若\(n\)是奇数怎么做。枚举Alice第一次选的数\(a_i\),然后考虑把剩下的数两两结成一个匹配,若Bob选了其中一个,Alice就选另一个。容易发现排序后奇数位和它右边的偶数位匹配最优。那么设奇数位的和为\(A\),偶数位的和为\(B\),此时Alice获胜......