本篇文章主要是介绍对于按键的抖动的消除和按位取反操作。
第一部分:
按键抖动:![](https://i-blog.csdnimg.cn/blog_migrate/3dbec8f2311d3114066316bc5ffb040e.png)
所以对于按键抖动的消除有两种方法:一种是改造电路另一种是软件方面的改变(也就是程序中实现)
所以就有一下程序
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms=xms-1;
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);//按键消抖用延时函数
while(P3_1==0)//用于判断是否还在按下
{
}
Delay(20);//松手按键消抖
P2_0=~P2_0;//状态取反
}
}
}
通过延时函数来推迟对于按键状态的检测。同时这个程序实现的功能是:第一次按下不亮,松手亮。第二次按下亮,松手不亮。第三次按下亮,松手不亮。以此类推。
按位取反操作
对于按位取反主要有以下几种
对于这几种位运算的解释如下:
<<按位左移:0011 1100<< --> 0111 1000 每个数据往左移空出来的位置用0补齐
>>按位右移:0011 1100<< --> 0001 1110 每个位置向右移空出来的位置用0补齐
&按位与:0001 1000 & 0010 1010 --> 0000 1000每一位对应进行“与”逻辑操作(全真才是真)
"|"按位或: 0001 1000 | 0010 1010 -->0011 1110 每一位对应进行“或”逻辑操作(有真便为真)
"^"按位“异或: 0001 1000 | 0010 1010 -->0011 0010 每一位对应进行“异或”逻辑操作(如果一样为0不一样为1)
“~”按位取反操作: ~0001 1000 --> 1110 0111 将每一位变成相反的数(2进制)
所以对于以上程序的解释为:在while循环中先经过延时函数来消除按小时的的抖动,然后判断按键是否还在按下,若在按下则经过一个空循向下执行又经过一个延时函数来消除松手是的物理抖动,然后对于P20的状态取反。也就是讲过程理解为;一开始为高电位 1 经过按下之后的的一个过程将P2_0的电位变成了 0 此时开始亮一直持续到第二次按键结束。然后又一次按下按键的过程则P2_0的电位又经过了一个取反变成了 1 此时灯灭。后以此类推。