51单片机学习日记(3-2)

本篇文章主要是介绍对于按键的抖动的消除和按位取反操作。

第一部分:

按键抖动:

所以对于按键抖动的消除有两种方法:一种是改造电路另一种是软件方面的改变(也就是程序中实现)

所以就有一下程序

#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 此时灯灭。后以此类推。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值