单片机独立按键控制LED灯(通过keil5 和 STC-ISP)

本文介绍了如何通过程序控制独立按键来控制LED灯,包括基本的按键操作、按键消抖处理、二进制显示以及流水灯效果。作者详细展示了使用C语言在单片机上实现这些功能的代码示例。
摘要由CSDN通过智能技术生成

前提:与昨天不同的是,昨天是通过将程序输入给CPU从而直接控制LED灯,今天将通过控制程序控制独立按键进而通过独立按键控制LED灯

原理图如下:

GND:负极  (说明应该给予高电位才能通电)KEY:独立按键名称(一个LED灯对应一个按键)

昨天使用一根杜邦线(两端分别连接D1和P0-0)

今天是使用两条杜邦线,一根还是像昨天那样,另外一根用来连接独立按键KEY1和P3_7

(io口可任意选择)

1、按下按键KEY1则LED灯亮,松开即灭,程序如下:

#include <REGX52.H>

void main()
{
	
	while(1)
	{
		if(P3_7 == 1) //如果按下按键key1
		{
			P0_0 = 1; //则给予高电位,电路完整,LED亮
		}
		else          //否则,如果没有按下按键Key1
		{
			P0_0 = 0; //则给予低电位,电路两端均为低电位,无法通电,LED灭
		}
		
	}
	
}

2、按下KEY1则LED灯一直亮,再按下按键则LED灯灭

#include <REGX52.H>

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;         
	
	while(xms)
	{
		
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}	
}

void main()
{
	while(1)
		{
			if(P3_0 == 0)   //如果按下按键
			{
				Delay(20);   //延时20ms(按下消抖)
				while(P3_0 ==0); //20ms之后如果依然按下;则一直进行空循环,不执行接下来的程序
				Delay(20);   //20ms之后如果按键松开,则执行延时20ms(松开消抖)
				
				P0_0=~P0_0; //按位取反(如果第一次按下是亮那么第二次按下就是灭)
				
			}	
			
		}
}

简单来说就是:按下按键➡️按下消抖➡️松开➡️松开消抖➡️执行开灯/关灯

如果想要实现一个按键控制一个LED灯,只需要在循环里面增加程序即可(以此类推):

#include <REGX52.H>

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	
	while(xms)
	{
		
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}	
}

void main()
{
	while(1)
		{
			if(P3_0 == 0)
			{
				Delay(20);
				while(P3_0 ==0);
				Delay(20);
				
				P0_0=~P0_0;
			}	
			if(P3_1 == 0)
			{
				Delay(20);
				while(P3_1 ==0);
				Delay(20);
				
				P0_1=~P0_1;
			}
		}
}

了解一下按键抖动:

简单来说,主要是由于按键使用的弹性开关在闭合和断开过程中存在弹性作用导致的短暂不稳定现象。这种抖动可能会导致CPU将按键的微小动作错误地处理成多次按键输入。所以为了正确识别按键,需要在单片机中进行按键消抖处理。

3、独立按键控制LED灯显示二进制:

#include <REGX52.H>

void Delay(unsigned int xms)		
{
	unsigned char i, j;
  while(xms)
		{ i = 2;
		  j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
		}
}

void main()
{
	unsigned char LEDNUM=0;
	
	while(1)
	{
		if(P3_0 == 0)    //如果按下按钮
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);
			
			LEDNUM++;    //LEDNUM加1(按下第一次是1,二进制表示为0000 0001,第二次是2...以此类推
			P0=~LEDNUM;  //按位取反之后为1111 1110,也就是第一个灯亮
			
		}
	}
	
}

参考图表

4、独立按键控制LED灯位移(相当于按键式的流水灯):

#include <REGX52.H>

void Delay(unsigned int xms)		
{
	unsigned char i, j;
  while(xms)
		{ i = 2;
		  j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
		}
}

void main()
{
	unsigned int LEDNUM = 0;
	
	while(1)
	{
		
		
		if(P3_0 == 0)
		{
			Delay(20);
			while(P3_0 == 0);
			Delay(20);
			
			if(LEDNUM>=8)
			{
				LEDNUM=0;
			}
			P0 =~(0x01<<LEDNUM); //按下第一次,LEDNUM=,左移0位,为0000 0001,取反之后为1111 
                                  1110,第一个灯亮。按下第二次,LEDNUM = 1,左移一位,为0000 
                                  0010,取反之后为1111 1101,第二个灯亮,以此类推)
			LEDNUM++;    
		}
	}
}

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值