这个小节我们再来看一下51单片机的按键怎么控制LED
1.实现最简单的按键控制LED的案例
我们只需要不断扫描按键输入的那个端口,按键按下的时候,端口输入电压为0,随时扫描端口,发现输入端口的电压为0的时候,就可以点亮LED。
1 2 3 4 5 6 7 8 9 10 11 12
| #include <REGX52.H>
void main(){ while(1){ if(P3_1==0){ P2=0xFE; }else{ P2=0xFF; } } }
|
2.我们再来看一下数据处理的逻辑
在这里要注意一下逻辑与和按位与的区别即可
还有要注意一下<<为按位左移,>>为按位右移
异或的概念:两个数不同才为1,相同则为0
3.按键原理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include <REGX52.H>
void Delayxms(unsigned int xms) { unsigned char i, j; while(xms){ i = 12; j = 169; do { while (--j); } while (--i); xms--; } }
void main(){ while(1){ if(P3_1==0){ Delayxms(20); while(P3_1==0); Delayxms(20); P2_0=~P2_0; } } }
|
4、独立按键控制LED显示二进制
这个代码实现的功能就是每次加一,就会模拟二进制加一的进位。一共有八位,到达最大值255的时候,变为0.如何从0又开始增加,不断往复。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <REGX52.H>
unsigned char LED_Num=0;
void Delayxms(unsigned int xms) { unsigned char i, j; while(xms){ i = 12; j = 169; do { while (--j); } while (--i); xms--; } }
void main(){ P2=~LED_Num; while(1){ if(P3_1==0){ Delayxms(20); while(P3_1==0); Delayxms(20); LED_Num++; if(LED_Num>0xFF){ LED_Num=0; } P2=~LED_Num; } } }
|
5、独立按键控制LED移位。
在这个独立按键控制LED移位的代码中,我们要先注意一个点就是(0x01<<7)就是已经到达1000 0000这个二进制数了。这个点经常出错。
可以控制按键实现LED灯的左移和右移
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <REGX52.H>
char i=0;
void Delayxms(unsigned int xms) { unsigned char i, j; while(xms){ i = 12; j = 169; do { while (--j); } while (--i); xms--; } }
void main(){ while(1){ P2=~(0x01<<i); if(P3_1==0){ Delayxms(20); while(P3_1==0); Delayxms(20); i++; if(i==8){ i=0; } } if(P3_0==0){ Delayxms(20); while(P3_0==0); Delayxms(20); i--; if(i==-1){ i=7; } } } }
|