蓝桥杯基础模块4_2:独立按键扩展应用

一、模块题目

蓝桥杯基础模块4_2:独立按键扩展应用_第1张图片

二、原理图

蓝桥杯基础模块4_2:独立按键扩展应用_第2张图片
蓝桥杯基础模块4_2:独立按键扩展应用_第3张图片
蓝桥杯基础模块4_2:独立按键扩展应用_第4张图片

三、源码

//头文件
#include "reg52.h"
//独立按键位定义
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
//LED位定义
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;
sbit L5 = P0^4;
sbit L6 = P0^5;
//HC138、HC573初始选择函数
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;	//定义变量stat_k,赋初值0
void ScanKeys_Alone()
{
	if(S7 == 0)
	{
		DelayK(100);
		if(S7 == 0)
		{
			if(stat_k == 0)
			{
				L1 = 0;
				stat_k = 1;
			}					// S7按下时,L1亮,stat_k为1
			else if(stat_k == 1)
			{
				L1 = 1;
				stat_k = 0;
			}					// S7按下时,L1灭,stat_k为0
			while(S7 == 0);		
		}
	}
	if(S6 == 0)
	{
		DelayK(100);
		if(S6 == 0)
		{
			if(stat_k == 0)
			{
				L2 = 0;
				stat_k = 2;
			}					// S6按下时,L2亮,stat_k为2
			else if(stat_k == 2)
			{
				L2 = 1;
				stat_k = 0;
			}					// S6按下时,L2灭,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;
			}					// S7按下时,S5控制L3
			else if(stat_k == 2)
			{
				L5 = 0;
				while(S5 == 0);
				L5 = 1;
			}					// S6按下时,S5控制L5
		}
	}
	if(S4 == 0)
	{
		DelayK(100);
		if(S4 == 0)
		{
			if(stat_k == 1)
			{
				L4 = 0;
				while(S4 == 0);
				L4 = 1;
			}					// S7按下时,S4控制L4
			else if(stat_k == 2)
			{
				L6 = 0;
				while(S4 == 0);
				L6 = 1;
			}					// S6按下时,S4控制L6
		}
	}
}
//主函数框架
void main()
{
	SelectHC573(4);
	while(1)
	{
		ScanKeys_Alone();
	}
}

四、开发板烧录结果

如题目要求一样。注意的是S7按一下(可松手),L1亮,此时S4、5在按下时分别控制对应的灯亮,松手立刻灯灭;再按一次S7,L1灭。S6同上。

五、思考(存疑)

注意while函数写在if语句里外的区别。

你可能感兴趣的:(单片机)