51单片机独立按键控制LED位移
-
1.1 CPU通过寄存器直接控制LED
CPU直接向**寄存器**写值,通过驱动器放大电流,然后通过IO口控制P2口电位高低,实现LED亮灭。
-
2.1 独立按键控制LED状态
- 原理:独立按键的IO口通过寄存器控制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);
}
}
}