51单片机学习(4)-----独立按键进一步控制LED灯

本文介绍了如何使用51单片机通过独立按键灵活控制LED灯,包括单个按键控制多个LED和按键实现LED的位移控制,利用位运算符如按位与、或、异或、取反及位移操作进行编程。
摘要由CSDN通过智能技术生成

 

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。

 

 

目录

一.  独立按键灵活控制LED 

程序一:单个独立按键控制多个LED灯

程序二:多个独立按键同时控制LED 

二.  独立按键实现LED的位移控制 

1.位运算介绍:

2.具体运用:

三.  实验视频 

 


 

一.  独立按键灵活控制LED 

 

  对于独立按键的具体介绍可以参考:51单片机学习(3),这里我们借助一些算术运算符以及一些逻辑运算符来实现不同的控制。

运算符如下:

 

 

例如:

程序一:单个独立按键控制多个LED灯

#include <REGX52.H>

void Delay(unsigned int xms)	//@11.0592MHz
{
	unsigned char data i, j;
	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
void main()
{
	while(1)
	{
			if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			P2_0=~P2_0, P2_1=~P2_1;  //实现K1控制LED1和LED2
		}
	}
}

 

程序二:多个独立按键同时控制LED 

#include <REGX52.H>

void Delay(unsigned int xms)	//@11.0592MHz  //延时函数设置
{
	unsigned char data i, j;
	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
void main()
{
	while(1)   //while循环语句
	{
		if(P3_1==0||P3_0==0)   //if语句,并且运用逻辑或
		{
			Delay(20);    //延时20ms,去除第一段抖动
			while(P3_1==0||P3_0==0);
			Delay(20);  //去除第二段抖动
			P2_0=~P2_0;   //按位取反,即对应的LED状态改变
		}
	}
}

 

二.  独立按键实现LED的位移控制 

 

1.位运算介绍:

按位与(&): 按位与为双位运算符,其作用于将两个二进制数逐位相与,即只要对应的两个二进制都为1时,结果为1,否则为0。

例如:1&1=1,1&0=0,0&0=0。

按位或(|):按位或也为双目运算符,其作用于将两个二进制数逐位相或,即只要对应的两个二进制中有一个为1,其结果为1,否则为0。

例如:1|1=1,1|0=1,0|0=0。

按位异或(^):进行异或运算时,当两个二进制表示不同时为1,相同则为0。

例如:1^1=0,1^0=1。

按位取反(~):按位取反即对于二进制的每一位都取反。

例如:假设1的二进制为0000 0001,则按位取反后为1111 1110。

按位左移(<<):将操作数的二进制所有位向左移动指定的位数。

例如:1的二进制0000 0001,0000 0001<<2即1的二进制数按位左移动2位,则为0000 0100。

按位右移(>>):将操作数的二进制所有位向左移动指定的位数。

例如:10的二进制为0000 1010,0000 1010>>2即10的二进制数按位右移动2位,则为0000 0010(右移两位时高位补0即右移后的第一位补0)。

注意:这里的按位左移与右移均只对于正数而言,且左移时为低位补0,右移时为高位补0。

 

2.具体运用:

源程序:

#include <REGX52.H>
void Delay(unsigned int xms)	//@11.0592MHz
{
	unsigned char data i, j;
	while(xms)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main()
{
	unsigned int LEDNUM=0;  //定义移动的位数
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			LEDNUM++;   //移动的位数逐渐增加来实现逐次控制不同LED
			if(LEDNUM>=8)
			{
				LEDNUM=0;   //当移动的位数超过8时重新令位数为0,从而实现不断的逐次循环
			}
			P2=~(0x01<<LEDNUM);  //0x01本应该是第一个LED亮,但是这里马上进行了位运算,所以第一个点亮的为第二个LED然后依次被控制点亮。
		}
	}
}

 

三.  实验视频 

 

51单片机独立按键依次控制LED

感谢老铁的浏览,希望老铁可以一键三连加个关注,您的支持和鼓励是我前进的动力,后续会分享更多学习编程的内容。 

 

 

 

 

 

 

 

 

 

 

  • 56
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 51
    评论
以下是一个简单的示例,演示如何使用STM32的按键中断来控制多个LED的状态: ```c #include "stm32f10x.h" #define LED1_PIN GPIO_Pin_12 #define LED2_PIN GPIO_Pin_13 #define BUTTON_PIN GPIO_Pin_0 void GPIO_Config(void); void EXTI_Config(void); void NVIC_Config(void); int main(void) { GPIO_Config(); EXTI_Config(); NVIC_Config(); while(1) { } } void GPIO_Config(void) { //开启GPIOB和AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //配置LED1和LED2引脚为推挽输出模式 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); //配置BUTTON引脚为浮空输入模式 GPIO_InitStructure.GPIO_Pin = BUTTON_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); } void EXTI_Config(void) { //开启AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //配置BUTTON引脚为中断输入模式 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); //配置BUTTON引脚对应的EXTI线路 EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } void NVIC_Config(void) { //配置BUTTON引脚对应的NVIC中断 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { //切换LED1和LED2的状态 GPIOB->ODR ^= LED1_PIN; GPIOB->ODR ^= LED2_PIN; //清除中断标志位 EXTI_ClearITPendingBit(EXTI_Line0); } } ``` 在上面的示例中,我们首先定义了LED1_PIN、LED2_PIN和BUTTON_PIN分别代表LED1的引脚、LED2的引脚和按键的引脚。然后在GPIO_Config函数中,我们开启了GPIOB和AFIO时钟,并分别配置了LED1、LED2和BUTTON引脚的模式。 接着,在EXTI_Config函数中,我们开启了AFIO时钟,并将BUTTON引脚配置为中断输入模式,同时配置了按键触发的中断类型为上升沿和下降沿。 最后,在NVIC_Config函数中,我们开启了BUTTON引脚对应的NVIC中断,并设置了中断优先级。 当按键被按下时,EXTI0_IRQHandler函数会被调用。在该函数中,我们切换了LED1和LED2的状态,并清除了中断标志位。这样,每次按键被按下时,LED1和LED2的状态就会发生反转。
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁满满满满

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值