按键控制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));
}
}
}