独立按键控制LED亮灭
首先我们来了解一下机械开关的结构。如图,有开关按键、弹簧弹片。开关按下就接触到图一的开关下面的两个未连接的弹片,按下就接触,电流导通。
接下来介绍按键的使用
由图可知,K1开关时链接到寄存器的P31号口,P31的电频默认是高电频(低电频)熄灭。当P31接口处于低电频的是,键位控制的LED就会亮起,代码如图
这就是一个简单的代码控制LED的亮起代码。接下来介绍按键的抖动。
简单的来说,就是开关按下的时候,由于弹片的弹性,不会马上就结束工作状态。
这种情况有两种解决方法:1.硬件消抖,加一个电路,过滤。2.通过软件来消抖,延时个多少毫秒,这样抖动就过去了。
下面介绍软解消抖的步骤:
1.首先我们来定义一个延时的函数
#include <REGX52.H>
void Delay(unsigned int xms)//xms不可以超出65535这个范围 因为unsigned是在这个范围之内
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
这是我们自定义的一个延时函数,调用的时候就直接在Delay()中输入参数就好了(要延时的时间),因为unsigned的范围是0~65535,所以延时不可以超过65535ms。
2.接下来写主函数
void main()
{
while(1)
{
if(P3_1==0)//如果K1按键口按下的话
{
Delay(20);//按下时延时20ms
while(P3_1==0);//检测松手
Delay(20);//松手再延时20ms
P2_0=~ P2_0;//按位取反,把LED的状态变成与之前的相反
}
}
}
就上面这个代码,我们来解释一下作用。就是当我们按下按键的时候(还没松手)是熄灭的,等松手的时候就会亮起。亮着的时候就相反,这样我们就可以使用一个独立按键来控制一个LED的亮灭了。
接下来介绍用独立按键来控制LED的移位。
首先来介绍这个程序的作用:就是通过独立按键按下来控制LED的一次亮灭。比如按一下,第一个LED亮起,再按一下第二个LED亮起,而第一个LED熄灭。这就是该程序的作用,下面来分析如何写这个程序。
我们知道LED小灯的亮灭是通过P2口的高低电频来控制的,我们只需要将低电频依次转换到下一个LED的位置即可。下面通过图片来理解
这就是我们的LED小灯依次亮起时的各个LED的电频。这个表达的们就要用到C语言中的按位右移或左移这个知识点(<< 或者 >>)这里我们使用十六进制来表示,即0x01。
上代码!!
void main()
{
unsigned char LEDNum=0;//这里我们定义一个char型的变量来控制左移或右移的单位
P2=~0x01;//这句话的意思使我们的初始第一个小灯亮在第一个位置
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);//到这里都是按下的一个过程,前面又讲
LEDNum++;这个是控制左移或者右移的位数
if(LEDNum>=8)//判断LEDNum是否大于7,大于的话就使LEDNum重新变回0
LEDNum=0;
P2=~(0x01<<LEDNum);//最后就是改变我们的P2口的电频,通过左移或右移最后的方式
}
}
}
这样我们就可以通过一个按键来控制一个LED小灯状态的单项移动。
要是想控制LED状态的自由移动的话我们就在下面加上这一段代码
if(P3_0==0)//这段代码接在上一段代码下面
{
Delay(20);
while(P3_0==0);
Delay(20);//简单的消抖
if(LEDNum==0)//这里我们判断如果LEDNum到0的时候,就让他变回7(我们定义的上界就是7),防止越位
LEDNum=7;
else
LEDNum--;//然后减减,和上一段代码相反
P2=~(0x01<<LEDNum);
这样我们就可以通过独立按键来控制LED小灯左右移动了。
#include <REGX52.H>
void Delay(unsigned int xms)//xms不可以超出65535这个范围 因为unsigned是在这个范围之内
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned char LEDNum=0;
P2=~0x01;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
LEDNum=0;
P2=~(0x01<<LEDNum);
}
if(P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDNum==0)
LEDNum=7;
else
LEDNum--;
P2=~(0x01<<LEDNum);
}
}
}
这是完整的代码段。