前言
专栏内容持续补充更新,目前正在进行优惠活动!
目录
一、按键中断控制原理
外部中断 INT0 和外部中断 INT1 触发有两种方式,上升沿或下降沿均可触发方式和仅下降沿触发方式。
二、消除抖动
矩阵键盘通常使用机械触点式按键开关,其主要功能式把机械上的通断转换为电气上的逻辑关系。
机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定的时间触点机械抖动,然后其触点才稳定下来。
其抖动过程如下图所示,抖动时间的长短与开关的机械特性有关,一般为 5-10ms。在触点抖动期间检测按键的通与断,可能导致判断出错,即按键一次按下或释放错误的被认为是多次操作,这种情况是不允许出现的。
为了克服按键触点机械抖动所致的检测误判,必须采取消抖措施。按键较少时,可采用硬件消抖,按键较多时,我们一般采用软件消抖,软件消抖的时候直接用延时函数判断,延时时间一般采用 10ms。
二、外部中断实现 LED 灯亮灭功能代码
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit led=P2^0;
sbit k4=P3^3;//外部中断1
void delay(u16 i)
{
while(i--);
}
void zhongduan()
{
EA=1;//总中断打开
EX1=1;//外部中断1打开
IT1=1;//外部中断1选择低电平触发
}
void main()
{
zhongduan();//调用中断函数
while(1);
}
void zhong() interrupt 2//外部中断服务函数
{
delay(1000);//消除按键抖动
if(k4==0)
{
led=~led;//led默认高电平,这里实现状态的反转
}
}
三、按键控制LED亮灭工程代码
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit led=P2^0;
sbit ke=P3^1;
void delay(u16 i)
{
while(i--);
}
void anjian()
{
if(ke==0)//判断按键是否被按下
{
delay(1000);//消抖
if(ke==0)//消抖之后再次判断是否被按下 ?
led=~led;//点亮led灯,led灯默认高电'平
while(!ke);//判断是否断开
}
}
void main()
{
while(1)
{
anjian();
}
}