状态机方式按键扫描单片机程序
/*-----------状态机方式按键扫描-----------*/
/*------------外部晶振为 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;
}
状态机方式按键扫描单片 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)