51单片机LED模块

本文介绍了如何使用51单片机通过寄存器控制LED,利用独立按键实现LED的位移功能,并对按键触发的抖动进行了消抖处理。通过示例代码展示了左移、右移以及边界情况的处理。
摘要由CSDN通过智能技术生成

51单片机独立按键控制LED位移

  • 1.1 CPU通过寄存器直接控制LED

      CPU直接向**寄存器**写值,通过驱动器放大电流,然后通过IO口控制P2口电位高低,实现LED亮灭。
    
  • 2.1 独立按键控制LED状态

    • 原理:独立按键的IO口通过寄存器控制LED
  • 消抖

    • 原因: 机械开关在闭合时不会马上稳定接通,在断开时也不会马上断开,在这瞬间都会伴随着一连串的抖动,而这些抖动会对程序执行造成干扰,所以要进行消抖
      按键按下过程
    按键按下过程
- 代码: #include
  • 2.2独立按键控制LED位移

    • 原理:利用二进制位移操作实现LED位移
    • 代码块:
      • 首先尝试进行K1按键控制LED左移:
#include <REGX52.H>
#include "Delay.h"

void main(){
	P2=0x7F;//0111 1111即设置LED初始状态为D8点亮
	while(1){
		unsigned char LEDNum;
		if(P3_1==0){//K1键按下
			Delay(20);//过滤第一段抖动
			while(P3_1==0);//检测松手
			Delay(20);//过滤第二段抖动
			
			LEDNum++;
			P2=~(0x80>>LEDNum);//1000 0000因为每次LED只点亮一颗,故采用0x80位移取反
		}
	}
}
 - 接下来考虑边界情况:当P2要位移8位时,就会超出界限,回到原位,即0x80位移0位。
	 #include <REGX52.H>
#include "Delay.h"

void main(){
	P2=0x7F;//0111 1111
	while(1){
		unsigned char LEDNum;
		if(P3_1==0){//按键按下
			Delay(20);//过滤第一段抖动
			while(P3_1==0);//检测松手
			Delay(20);//过滤第二段抖动
			
			LEDNum++;
			if(LEDNum==8)
				LEDNum=0;
			P2=~(0x80>>LEDNum);
		}
	}
}
  • 然后考虑右移,同样注意当P2要右移-1位时,等效为右移7位。
	- #include <REGX52.H>
#include "Delay.h"

void main(){
	P2=0x7F;//0111 1111
	while(1){
		unsigned char LEDNum;
		if(P3_1==0){//按键按下
			Delay(20);//过滤第一段抖动
			while(P3_1==0);//检测松手
			Delay(20);//过滤第二段抖动
			
			LEDNum++;
			if(LEDNum==8)
				LEDNum=0;
			P2=~(0x80>>LEDNum);
		}
		if(P3_0==0){//按键按下
			Delay(20);//过滤第一段抖动
			while(P3_0==0);//检测松手
			Delay(20);//过滤第二段抖动
			
			LEDNum--;
			if(LEDNum==-1)
				LEDNum=7;
			P2=~(0x80>>LEDNum);
	    }
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值