建立工程的方式之前有提到过,P2和P3分别是LED和按键的寄存器组,之前的博客里详细分析过。
按键抖动及消除方法
首先说一下按键抖动,对于机械键盘,当触点断开、闭合时,由于机械触电点的弹性作用,一个开关在闭合或者断开时不会马上接通或者断开,而是会伴随一连串抖动。
抖动的时间大概在5~10ms,我们肉眼是无法分辨的,但是会被单片机检测出来。
消抖分为硬件消抖和软件消抖。
硬件消抖
主要是在电路设计的时候加上电容或者其它消抖电路。很麻烦,不方便实现。、
软件消抖
在检测按键状况的时候设置延时,将抖动的时间给过滤掉。
while(P3_1 == 0)
{
Delay(20);
while(P3_1 == 0);//检测松手
Delay(20);
//这里可以写主体函数。
}
按键控制LED显示二进制
#include<REGX52.H>
// 定义一个延时函数,参数为延时的毫秒数。函数是通过STC-IPS软件生成的
void Delay(unsigned int xms) //@12.000MHz
{
while(xms--)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
/*由于LED在MCU端口输出低电平的时候为亮,所以不能直接把二进制显示出来。
先定义一个字符来表示二进制数,每次按下按键后,该字符自增。同时P2显示该字符取反后的值,就能通过按键控制LED显示二进制*/
void main()
{
unsigned char LEDNum = 0;
while(1)
{
while(P3_1 == 0)
{
Delay(20);
while(P3_1 == 0);//检测松手
Delay(20);
LEDNum++;
P2 = ~LEDNum;
}
}
}
按键控制LED左移右移
#include<REGX52.H>
void Delay(unsigned int xms);//声明延时函数
void main()
{
unsigned char LEDNum = 0;//定义一个参数来保存P2的状态,,原理同上
P2 = ~0x1;//初始化一下LED的状态,让第一个LED灯亮
while(1)
{
while(P3_1 == 0)//按键K1控制LED左移,每按一次向左移动一位
{
Delay(20);
while(P3_1 == 0);//检测松手
Delay(20);
LEDNum++;
if(LEDNum >= 8)//当参数大于8,让它归零,回到最右边
{
LEDNum = 0;
}
P2 = ~(0x00000001 << LEDNum);
}
while(P3_0 == 0)//按键K1控制LED右移,每按一次向右移动一位
{
Delay(20);
while(P3_0 == 0);//检测松手
Delay(20);
if(LEDNum == 0)//当按键小于零,让它为8,回到最左边
{
LEDNum = 8;
}
LEDNum--;
P2 = ~(0x00000001 << LEDNum);
}
}
}
void Delay(unsigned int xms) //@12.000MHz
{
while(xms--)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
现象就不详细概述了,烧录程序可以之间观察到现象。如果出现问题,可能是按键管脚口的选择出错了,查一下电路原理图进行修改。