状态机方式按键扫描单片机程序
2015-07-01 来源:51hei
/*-----------状态机方式按键扫描-----------*/
/*------------外部晶振为 12MHz-----------*/
/*--------最后修改2011.02.26--------------*/
#include 'STC12C5620AD.H'
#include 'Key_Scan.H'
#define Key_Mask 0x0f //屏蔽不用的按键,不用的按键用0屏蔽
/********************** 声明外部变量**************************/
extern uchar Work_Mode; //From Main.c
/********************** 按键扫描读取**************************/
uchar Key_Scan(void)
{
static uchar Key_State=0; //定义按键状态
uchar Key_Press;
uchar Key_Return=0x00; //定义按键返回的键值
Key_Press=Key_Input&Key_Mask; //读按键I/O电平
switch(Key_State)
{
case 0: // 按键初始态
if (Key_Press!=Key_Mask)
Key_State=1; // 键被按下,状态转换到键确认态
break;
case 1: // 按键确认态
if (Key_Press==Key_Input&Key_Mask)
{
Key_Return=Key_Press; // 按键仍按下且键值键值,按键确认输出
BEEP_DRV=1; // 驱动蜂鸣器
Key_State=2; // 状态转换到键释放态
}
else
Key_State=0; // 按键已抬起或改变,并转换到按键初始态
break;
case 2:
if (Key_Press==Key_Mask)
{
Key_State=0; // 按键已释放,转换到按键初始态
BEEP_DRV=0; // 关闭蜂鸣器
}
else
if(Work_Mode==1)
{
Key_Return=Key_Press|0x09; // 只有调台模式并且只有>>| 和 |<< 才能连按
BEEP_DRV=0; // 关闭蜂鸣器
}
else
BEEP_DRV=0; // 关闭蜂鸣器
break;
}
return Key_Return;
}
下一篇:CRC16和CRC32探讨