蓝桥杯基础模块4_1:独立按键

一、模块题目

蓝桥杯基础模块4_1:独立按键_第1张图片

二、原理简述

1、独立按键的处理思路(转载)
一般情况下,独立按键有两个引脚,其中一个通过上拉电阻接到单片机的I/O端口,另外一端接地。也就是说,平时按键没有动作的时候,输出的是高电平,如果有按下动作发生,则输出的是低电平。那么,我们在程序设计的时候,只要扫描跟按键引脚相连的I/O端口,如果发现有低电平产生,则判定该按键处于按下状态。有些时候,电路或者外围有电磁干扰,也会使单片机的I/O端口产生低电平,这种干扰信号会让单片机误认为是按键动作。所以,在扫描按键的时候应该做去抖动处理,把干扰信号过滤掉,从而获得准确的按键状态信号。
蓝桥杯基础模块4_1:独立按键_第2张图片
图1:按键原理图
2、其它原理图(不赘述)
蓝桥杯基础模块4_1:独立按键_第3张图片
图2:LED原理图
蓝桥杯基础模块4_1:独立按键_第4张图片
图3:38译码器原理图

三、源码

//头文件
#include "reg52.h"
//独立按键位定义(图1)
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
//LED位定义(图2)
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初始选择函数(图3)
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--);
}
//独立按键程序(本模块主要程序)
void ScanKeys_Alone()
{
	if(S7 == 0)
	{
		DelayK(100);		//按键消抖
		if(S7 == 0)
		{
			L1 = 0;
			while(S7 == 0);
			L1 = 1;
		}				//S7控制L1
	}
	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()
{
	SelectHC573(4);
	while(1)
	{
		ScanKeys_Alone();
	}
}

四、开发板烧录结果

J5选择2、3端(如图4)
按S4,L4亮,松开后L4灭;按S5,L3亮,松开后灭;按S6,L2亮,松开后灭;按S7,L1亮,松开后灭。
蓝桥杯基础模块4_1:独立按键_第5张图片
图4:独立按键与矩阵按键的切换

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