【蓝桥杯—单片机】独立按键的基本操作| 备赛 | 笔记

前言

学习资料参考

课程资料
【【小蜜蜂笔记】蓝桥杯大赛-单片机设计与开发基础技能与进阶强化教程】https://www.bilibili.com/video/BV1Bt41187hw?p=6&vd_source=e2191f89c557f5ac44bb6c7aa3967c7c

LED基本控制可以参考以下笔记
https://blog.csdn.net/zicheng_G/article/details/142025188?fromshare=blogdetail&sharetype=blogdetail&sharerId=142025188&sharerefer=PC&sharesource=zicheng_G&sharefrom=from_link

本节训练重点

  1. 独立按键控制LED指示灯:按下S7点亮L1指示灯,松开熄灭。S6点亮L2指示灯,S5点亮L3指示灯,S4点亮L4指示灯,都是松开熄灭。按键均作去抖。
  2. 独立按键的拓展应用

独立按键

原理图

在这里插入图片描述
对独立按键经行控制,要先将J5的跳帽接到2~3引脚。
按键按下时,P30~P33中对应的引脚输出低电平。

编程思路

独立按键控制LED指示灯

/*头文件声明区域*/
#include <REGX52.H>

/*变量声明区域*/
sbit HC138_A0_A = P2^5;
sbit HC138_A1_B = P2^6;
sbit HC138_A2_C = P2^7;

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 Delay(unsigned int xms)		//@12.000MHz
{
	while(xms--);
}

/*138译码器Y口选中情况*/
void HC138_NumberY(unsigned char x)
{
	switch(x)
	{
		case 4:
		{
			HC138_A0_A=0;
			HC138_A1_B=0;
			HC138_A2_C=1;
			break;
		}
	}
}

/*独立按键的基本控制*/
void Key_Scan()
{
	if(S7==0)
	{
		Delay(100);//去抖
		if(S7==0)
		{
			L1=0;
			while(S7==0);
			L1=1;
		}
	}
	
	if(S6==0)
	{
		Delay(100);//去抖
		if(S6==0)
		{
			L2=0;
			while(S6==0);
			L2=1;
		}
	}
	
	if(S5==0)
	{
		Delay(100);//去抖
		if(S5==0)
		{
			L3=0;
			while(S5==0);
			L3=1;
		}
	}
	
	if(S4==0)
	{
		Delay(100);//去抖
		if(S4==0)
		{
			L4=0;
			while(S4==0);
			L4=1;
		}
	}
}
/*主函数*/
void main()
{
	HC138_NumberY(4);
	while(1)
	{
		Key_Scan();
	}
}

独立按键的拓展应用

按键S7点亮L1指示灯,L1点亮后,S6不响应操作,S5控制L3,S4控制L4,再次按下S7,L1指示灯熄灭,S6可响应操作。
按键S6点亮L2指示灯,L2点亮后,S7不响应操作,S5控制L5,S4控制L6,再次按下S6,L2指示灯熄灭,S6可响应操作。
S6和S7未按下时,即L1或L2未点亮时S5和S4不响应操作。

/*头文件声明区域*/
#include <REGX52.H>

/*变量声明区域*/
sbit HC138_A0_A = P2^5;
sbit HC138_A1_B = P2^6;
sbit HC138_A2_C = P2^7;

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;

unsigned char flag;//标记S6和S7是否按下

/*延时函数*/
void Delay(unsigned int xms)		//@12.000MHz
{
	while(xms--);
}

/*138译码器Y口选中情况*/
void HC138_NumberY(unsigned char x)
{
	switch(x)
	{
		case 4:
		{
			HC138_A0_A=0;
			HC138_A1_B=0;
			HC138_A2_C=1;
			break;
		}
	}
}

/*按键*/
void Key_Scan()
{
	if(S7==0)
	{
		Delay(100);//去抖
		if(S7==0)
		{
			if(flag==0)
			{
				L1=0;
			  flag=1;
			}	
			else if(flag==1)
			{
				L1=1;
			  flag=0;
			}
		}
		while(S7==0); //避免一次按下多次读取
	}
	
	if(S6==0)
	{
		Delay(100);//去抖
		if(S6==0)
		{
			if(flag==0)
			{
				L2=0;
			  flag=2;
			}	
			else if(flag==2)
			{
				L2=1;
			  flag=0;
			}
		}
		while(S6==0); //避免一次按下多次读取
	}
	
	if(S5==0)
	{
		Delay(100);//去抖
		if(S5==0)
		{
			if(flag==1) //S7按下状态,S5按下控制L3
			{
				L3=0;
				while(S5==0);
				L3=1;
			}
			else if(flag==2) //S7按下状态,S5按下控制L5
			{
				L5=0;
				while(S5==0);
				L5=1;
			}
		}
	}
	
	if(S4==0)
	{
		Delay(100);//去抖
		if(S4==0)
		{
			if(flag==1) //S7按下状态,S4按下控制L4
			{
				L4=0;
				while(S4==0);
				L4=1;
			}
			else if(flag==2) //S6按下状态,S4按下控制L6
			{
				L6=0;
				while(S4==0);
				L6=1;
			}
		}
	}
	
}
/*主函数*/
void main()
{
	HC138_NumberY(4);
	while(1)
	{
		Key_Scan();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值