本篇文章主要讲述如何使用中断实现独立按键控制led灯,并在proteus上进行验证。其中本人遇到了一个关于寄存器移位操作的小问题,困扰了两天,也会在文章中指出。
先看想要实现简单的功能:(使用proteus仿真)
proteus_ kled
再来讲实现思路。(根据HC6800ES V2.0进行的实验)
首先要明白独立按键的原理:按键具有两个引脚,当按下按键后,相当于两个引脚导通,松开后,引脚断开。因此,可以在引脚两边各接一个高电平与低电平或GND,通过检测高电平的状态来判断按键是否被按下。值得注意的是,按键在按下与松开时会出现抖动:(图自己画的,不好看==轻喷)
在按下和松开按键的一段时间(5~10ms)内会发生抖动(电平上下横跳)容易被判定为按键被连续多次按下,所以需要添加防抖硬件或代码来跳过这一阶段。
由于一般的开发板不会额外设计按键防抖装置,所以多敲两行代码呗。
然后就是通过检测的结果来控制灯的亮灭。
接下来看程序:(keil5使用c语言编写)
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Key1=P3^0;
bit KeyS=1;
void main(){
uchar aa=0x01;
bit keyback=1;
EA=1;
TH0=0xf8;
TL0=0xcd;
ET0=1;
TR0=1;
while(1)
{
if(KeyS!=keyback)
{
if(KeyS==0)
{
P2=~aa;
aa=aa<<1;
if(aa==0x00)
aa=0x01;
}
keyback=KeyS;
}
}
}
void Interrupt_T0() interrupt 1
{
static unsigned char Keybuf=0xff;
Keybuf=(Keybuf<<1)|Key1;
if(Keybuf==0x00)
KeyS=0;
else if(Keybuf==0xff)
KeyS=1;
TH0=0xf8;
TL0=0xcd;
}
代码的中断部分是通过计时器的计时触发中断,并检测key1的状态,若为0,即低电平时,keybuf(检测按键状态的静态1字节变量)的一位会变成0,当连续8次均检测到key1为0时,keybuf就会变成0x00,说明此时已经稳定为低电平,进而使得KeyS(按键当前状态)变成0,即按下的状态。由于我进行的是仿真实验,所以我这里设置的一次中断触发间隔为500us,8次就是4ms,大家如果实际操作开发板的时候可以试着调整一下。
然后,main函数中我使用了一个keyback变量来存储上一次按键的状态,通过和当前状态比较,可判断出按键状态是否发生改变,方便对led的状态进行操作。
在led控制方面,我使用了移位操作。不过这里有一个小问题,就是开头提到的困扰我两天的小问题。就是请不要直接对寄存器进行移位操作,否则会出现未知的事情!!建议设置一个中间变量,对中间变量移位,再赋值给寄存器。
最后我的仿真接线图奉上!(根据HC6800ES V2.0连接的)=_=工科男审美,轻喷。