标题:
有限状态机单片机独立按键处理程序
[打印本页]
作者:
bhjyqjs
时间:
2018-11-7 08:40
标题:
有限状态机单片机独立按键处理程序
不要误会,虽然叫简化版,功能可一点也不简化啊。
程序每10ms调用一次按键扫描程序,由状态机控制程序流程,在按键未确认前,一旦检测到高电平,说明按键为抖动或干扰,自动退回初始状态,杜绝虚假按键动作。整个按键处理过程最长30ms,按键按下即执行,全部由定时中断完成,释放主程序。
按键动作干脆利落,爽!抖动?那就是一个传说!
之所以定时中断为2ms,是考虑到2ms定时可以作为其他应用的定时基准。
单片机程序源码如下:
/***************************************************
工程名 :独立按键(状态机)控制 LED_简化版
作者:老芹
本例Key接P1.4
***************************************************/
#include "STC15F2K60S2.H"
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P1^4; //定义按键
sbit LED = P0^0;
void KEY_Scan(); //检测按键
void Timer0_Init(); //定时器初始化
bit key;
void main()
{
Timer0_Init();
while(1)
{
}
}
void KEY_Scan() //检测按键
{
static uchar KeyStatus = 0; //按键状态
switch (KeyStatus)
{
case 0: //初始状态下,KeyStatus=0
if(K1==0) //如果有键按下转到下一状态;否则是干扰,直接退回初始状态
KeyStatus++;
break;
case 1:
if(K1==0) //键仍然按下
{
key = !key;
KeyStatus++; //转到下一状态,等待按键释放
}
else
KeyStatus = 0; //是干扰,退回初始状态
break;
case 2:
if(K1==0) //键仍然按下
break;
else //键松开
KeyStatus = 0; //退回初始状态
break;
}
}
void Timer0_Init() //定时器初始化
{ //2毫秒@11.0592MHz
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9A; //设置定时初值
TH0 = 0xA9; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 =1;
EA = 1;
}
void Timer0() interrupt 1 //定时器中断
{ //16位自动重装模式,无需重赋初值
static uchar i;
if(key) //按键按下,LED点亮
LED=0; //点亮LED
else
LED=1; //关闭LED
if(i==0) //每10Ms调用按键扫描程序一次
KEY_Scan();
i++;
if(i==5)
i=0;
}
复制代码
作者:
怪怪爱玩
时间:
2018-11-9 11:02
我仔细研究一下,谢谢楼主
作者:
怪怪爱玩
时间:
2018-11-9 11:19
刚刚试了,确实非常好用,得好好研究一下,谢谢楼主
作者:
维超
时间:
2018-11-9 18:46
如果加入按键长按呢用起来不是更爽
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1