蓝桥杯单片机06——独立按键的扩展应用

注:本文所涉及的图片均来自于B站小蜜蜂老师的视频。

一、题目要求

二、题目分析

1.独立按键:

将J5处的跳帽接到2~3引脚,使按键S4~S7四个按键的另一端接地从而成为4个独立键盘,此时按下独立按键后,按键与地相连,为低电平,即按下按键为低电平,松开按键为高电平。

2.LED:

LED正极接高电平,因此当Q端为低电平时LED亮起,若想要LED亮,则D端需输入低电平

三、重点代码详解

1.定义变量

unsigned char stat_k=0;

定义一个变量,用于记录状态信息

stat_k=1:按下S7(奇数次)

stat_k=2:按下S6(奇数次)

stat_k=0:按下S7(偶数次);按下S6(偶数次)

2.按键S7

if(S7==0)
	{
		DelayK(100);
		if(S7==0)
		{
			if(stat_k==0)
			{
				L1=0;
				stat_k=1;
			}
			else if(stat_k==1)
			{
				L1=1;
				stat_k=0;
			}
			while(S7==0);
		}
	}

当检测到按键 S7 按下(S7 == 0)时,首先会调用DelayK(100)函数进行一个短暂的延时。

再次确认S7 == 0后,如果stat_k的值为 0,就会将L1设置为0,并将stat_k的值更新为 1;

如果stat_k的值为 1,就会将L1设置为 1,并将stat_k重置为 0。

然后通过while(S7 == 0);语句等待按键 S7 松开。

这里stat_k起到了一个标记按键 S7 按下次数奇偶性的作用,每次按下并处理后改变其值,以便下次按下时执行不同的操作(比如控制L1的亮灭状态交替变化)。

3.按键S6

if(S6==0)
	{
		DelayK(100);
		if(S6==0)
		{
			if(stat_k==0)
			{
				L2=0;
				stat_k=2;
			}
			else if(stat_k==2)
			{
				L2=1;
				stat_k=0;
			}
			while(S6==0);
		}
	}

对于按键 S6 的处理逻辑与 S7 类似。

当检测到 S6 按下并经过延时确认后,如果stat_k为 0,就将L2设置为 0 并将stat_k更新为 2;

如果stat_k为 2,就将L2设置为 1 并将stat_k重置为 0。

同样通过while(S6 == 0);等待按键松开。

这里stat_k同样是用于根据其当前值来决定对L2的操作以及自身状态的更新,以实现某种特定的按键控制逻辑(比如与 S7 不同的另一种亮灭交替控制逻辑,且与不同的stat_k值对应)。

4.按键S5

if(S5==0)
	{
		DelayK(100);
		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;
			}
		}
	}

当检测到按键 S5 按下并经过延时确认后,如果stat_k的值为 1,就会将L3设置为 0,然后等待按键 S5 松开(while(S5 == 0);),松开后再将L3设置为 1;

如果stat_k的值为 2,就会将L5设置为 0,同样等待按键松开后再将L5设置为 1。

这里stat_k的值用于区分不同的情况,决定是对L3还是L5进行操作,以实现根据按键 S5 按下时stat_k的不同状态来控制不同的输出(L3L5的亮灭等情况)。

5.按键S4

if(S4==0)
	{
		DelayK(100);
		if(S4==0)
		{
			if(stat_k==1)
			{
				L4=0;
				while(S5==0);
				L4=1;
			}
			else if(stat_k==2)
			{
				L6=0;
				while(S5==0);
				L6=1;
			}
		}
	}

与按键 S5 类似,当检测到按键 S4 按下并经过延时确认后,如果stat_k的值为 1,就会将L4设置为 0,等待按键松开后再将L4设置为 1;

如果stat_k的值为 2,就会将L6设置为 0,等待按键松开后再将L6设置为 1。

这里stat_k也是用于根据其当前值来决定是对L4还是L6进行操作,以实现不同状态下按键 S4 按下时对不同输出(L4L6的亮灭等情况)的控制。

四、总体代码

#include "reg52.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;

void SelectHC573(unsigned char channel)
{
	switch(channel)
	{
		
	  case 4:
		  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;
	}
}
void DelayK(unsigned char t)
{
	while(t--);
}

unsigned char stat_k=0;

void ScanKeys_Alone()
{
	if(S7==0)
	{
		DelayK(100);
		if(S7==0)
		{
			if(stat_k==0)
			{
				L1=0;
				stat_k=1;
			}
			else if(stat_k==1)
			{
				L1=1;
				stat_k=0;
			}
			while(S7==0);
		}
	}
	if(S6==0)
	{
		DelayK(100);
		if(S6==0)
		{
			if(stat_k==0)
			{
				L2=0;
				stat_k=2;
			}
			else if(stat_k==2)
			{
				L2=1;
				stat_k=0;
			}
			while(S6==0);
		}
	}
	if(S5==0)
	{
		DelayK(100);
		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(100);
		if(S4==0)
		{
			if(stat_k==1)
			{
				L4=0;
				while(S5==0);
				L4=1;
			}
			else if(stat_k==2)
			{
				L6=0;
				while(S5==0);
				L6=1;
			}
		}
	}
}

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值