按键控制LED亮灭
首先我们需要对独立按键有一个基本的了解,通过查看原理图
可以发现,该板子的独立按键与寄存器P3相连,独立按键的值存放在寄存器中,我们无法对其进行赋值,只能检查寄存器的值,当存放在寄存器中的值为0的时候,代表寄存器成功接地,即开关按下,寄存器中存放1,表示开关是弹开的。
所以我们可以通过这个特点来实现开关按下时灯亮,松开时灯熄:
#include <REGX52.H> void main() { while(1) //注意放在循环体内 { if(P3_0==0 || P3_1==0) //开关按下,点亮 { P2_3=0; } else //开关松开,熄灭 P2_3=1; } }
按键控制LED状态
通过查询独立按键的特性具有如下特点
当按键按下时金属片不会瞬间接通而是会回弹一段后稳定接通,松开时也不会瞬间松开,而是会回弹,通过了解,金属片状态改变时,回弹的时间大约为20ms,所以我们在按下和关闭按键时,要延迟大约20ms后再对按键状态进行判断。
总结逻辑为:当按键按下(寄存器中值为0)时,等20ms确保它稳定了,再对按钮状态判断,如果此时寄存器的值还是0,说明我们按下按键还没松开,程序就循环执行判断,一旦按键松开(寄存器中值不为0),跳出循环,等20ms确保它稳定了,对LED灯的值取反,即使其状态改变。此时成功完成了 一次按下松开按钮,使LED状态改变:
#include <REGX52.H> void Delay(int n) //@12.000MHz ms { unsigned char data i, j; while(n--) { i = 2; j = 239; do { while (--j); } while (--i); } } void main() { while(1) { if(P3_1==0) { Delay(20); while(P3_1==0); Delay(20); P2_0=~P2_0; } } }
按键控制LED显示二进制
在按键控制LED状态的基础上,我们将每次按下并松开一次按钮后,添加一个对P2寄存器的值改变的操作,我们想要控制LED显示二进制,我们用0表示灯灭,一表示灯亮即变化规律为0000 0000->0000 0001->0000 0010->0000 0011,对应的二进制数在不断增大,而在LED灯的控制中,0为亮,1为灭,所以我们将P2的初值赋为0xFF,每控制一次按键,P2的值减少一个。
即可实现LED显示二进制:
#include <REGX52.H> void Delay(int n) //@12.000MHz ms { unsigned char data i, j; while(n--) { i = 2; j = 239; do { while (--j); } while (--i); } } void main() { P2=0xFF; while(1) { if(P3_1==0) { Delay(20); while(P3_1==0); Delay(20); P2--; } } }
按键控制LED移位
依旧是在按键控制LED状态的基础上,我们将每次按下并松开一次按钮后,添加一个对P2寄存器的值改变的操作,只是这一次是将LED移位,我们可以使用移位操作符<<和>>来实现左移和右移
使用一个无符号计数变量,num,每当按下左侧按钮(我这个板子为P3_1)时,num就会减少1;每当按下右侧按钮(我这个板子为P3_0)时,num就会增加1,操作完按钮后,就会根据num的值,对8取余,来对初始状态0xFE进行移位,实现按键控制LED移位:
#include <REGX52.H> void Delay(int n) //@12.000MHz ms { unsigned char data i, j; while(n--) { i = 2; j = 239; do { while (--j); } while (--i); } } unsigned int num=0; void main() { P2=0xFE; while(1) { if(P3_1==0) { Delay(20); while(P3_1==0); Delay(20); num--; P2=~(0x01>>(num%8)); } if(P3_0==0) { Delay(20); while(P3_0==0); Delay(20); num++; P2=~(0x01<<(num%8)); } } }