标题:
C51单片机按键去抖外部中断开关机(低功耗模式)
[打印本页]
作者:
bifxv
时间:
2018-10-27 22:50
标题:
C51单片机按键去抖外部中断开关机(低功耗模式)
单片机C语言,适合于初学者。
低功耗模式的按键去抖开关机
单片机源程序如下:
#include <reg52.h>
sbit KEY4 = P3^2;
unsigned char code LedChar[] =
{ //定义表格一定要使用code,这样会做到程序存储区中
0x3F, //表格第1步数据0b00111111
0x06, //表格第2步数据0b00000110
0x5B, //表格第3步数据0b01011011
0x4F, //表格第4步数据0b01001111
0x66, //表格第5步数据0b01100110
0x6D, //表格第6步数据0b01101101
0x7D, //表格第7步数据0b01111101
0x07, //表格第8步数据0b00000111
0x7F, //表格第9步数据0b01111111
0x6F, //表格第10步数据0b01101111
};
bit KeySta = 1; //当前按键状态
unsigned char Ke;
void main()
{
bit backup = 1; //按键值备份,保存前一次的扫描值
unsigned char cnt = 0; //按键计数,记录按键按下的次数
EA = 1; //使能总中断
TMOD = 0x01; //设置T0为模式1
TH0 = 0xF8; //为T0赋初值0xF8CD,定时2ms
TL0 = 0xCD;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
P0 = LedChar[cnt]; //显示按键次数初值
while (1)
{
if (KeySta != backup) //当前值与前次值不相等说明此时按键有动作
{
if (backup == 0) //如果前次值为0,则说明当前是弹起动作
{
cnt++;
P0=0;
if(Ke==0)
{
IT0 = 1; //外部中断0为下降沿触发
EX0 = 1; //使能总中断
EA = 1;
PCON=0x02;
}
Ke++;
if(Ke==2) Ke=0;
// else if(Ke!=1) Ke=0;
if (cnt >= 10)
{ //只用1个数码管显示,所以加到10就清零重新开始
cnt = 0;
}
P0 = LedChar[cnt]; //计数值显示到数码管上
}
backup = KeySta; //更新备份为当前值,以备进行下次比较
}
}
}
/* T0中断服务函数,用于按键状态的扫描并消抖 */
void InterruptTimer0() interrupt 1
{
static unsigned char keybuf = 0xFF; //扫描缓冲区,保存一段时间内的扫描值
TH0 = 0xF8; //重新加载初值
TL0 = 0xCD;
keybuf = (keybuf<<1) | KEY4; //缓冲区左移一位,并将当前扫描值移入最低位
if (keybuf == 0x00)
{ //连续8次扫描值都为0,即16ms内都只检测到按下状态时,可认为按键已按下
KeySta = 0;
}
else if (keybuf == 0xFF)
{ //连续8次扫描值都为1,即16ms内都只检测到弹起状态时,可认为按键已弹起
KeySta = 1;
}
else
{} //其它情况则说明按键状态尚未稳定,则不对KeySta变量值进行更新
}
void int0() interrupt 0
{
PCON=0;//唤醒单片机
}
复制代码
所有资料51hei提供下载:
按键去抖开关机.rar
(27.78 KB, 下载次数: 43)
2018-10-27 22:49 上传
点击文件名下载附件
按键去抖开关机
下载积分: 黑币 -5
作者:
admin
时间:
2018-10-31 17:03
好资料,51黑有你更精彩!!!
作者:
dxdsjyx
时间:
2020-3-24 22:48
有电路图吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1