【单片机学习】独立按键的扩展应用

题目:

按键S7和S6为选择键,确定控制键控制那组LED指示灯。按键S5和S4为控制键,按键该键点亮指定的LED指示灯,松开后熄灭。

按下S7点亮L1指示灯,L1点亮后,S6不响应操作,S5控制L3,S4控制L4,再次按下S7,L1指示灯熄灭,S6可响应操作。

按下S6点亮L2指示灯,L2点亮后,S7不响应操作,S5控制L5,S4控制L6,再次按下S6,L2指示灯熄灭,S7可响应操作。

S7和S6未按下时,即L1或L2未点亮时S5和S4不响应操作也就是未作LED灯区域选择时,控制键不能操作。

#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 Select_HC573(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 Delay_Key(unsigned char t)
{
	while(t--);
}

unsigned char stat_k=0;  //状态变量,s6 s7都未按下

void ScanKeys_Alone()
{
	if(s7==0)
	{
		Delay_Key(100);  //按键消抖
		if(s7==0)  //s7按下
		{
			if(stat_k==0)  //s6未按下
			{
				L1=0;  //灯亮
				stat_k=1;
			}
			else if(stat_k==1)  //s7处于按下状态
			{
				L1=1;  //灯灭
				stat_k=0; 
			}
			
			while(s7==0);  //让按键松开后再读
		}
	}
	
	if(s6==0)
	{
		Delay_Key(100);  //按键消抖
		if(s6==0)  //s6按下
		{
			if(stat_k==0)  //s7未按下
			{
				L2=0;  //灯亮
				stat_k=2;
			}
			else if(stat_k==2)  //s6处于按下状态
			{
				L2=1;  //灯灭
				stat_k=0;
			}
			
			while(s6==0);  //让按键松开后再读
		}
	}
	
	if(s5==0)
	{
		Delay_Key(100);  //按键消抖
		if(s5==0)  //s5按下
		{
			if(stat_k==1)
			{
				L3=0;
				while(s5==0);  //s5为低电平,L3一直亮;为高电平,L3灭
				L3=1;  //灯灭
			}
			else if(stat_k==2)
			{
				L5=0;
				while(s5==0);  //s5为低电平,L5一直亮;为高电平,L5灭
				L5=1;
			}
		}
	}
	
	if(s4==0)
	{
		Delay_Key(100);  //按键消抖
		if(s4==0)  //s4按下
		{
			if(stat_k==1)
			{
				L4=0;
				while(s4==0);  //s4为低电平,L4一直亮;为高电平,L4灭
				L4=1;
			}
			else if(stat_k==2)
			{
				L6=0;
				while(s4==0); //s4为低电平,L6一直亮;为高电平,L6灭
				L6=1;
			}
		}
	}
}

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值