火锅下位机例程:KEY(项目编号:SF006-F3-010)
发布: 2009-4-13 14:18 | 作者: aleyn | 来源: StmFans思蜕盟 OPELC 自由电子联盟
火锅的键盘,分为优先式,和扩展式,两种。
其中,UP,DOWN,LEFT,RIGHT,是属於优先式,也就是说,每一次在位扫描之前,都先判断对应的优先键(其实,这也是硬件的设计中所定义的)。
火锅的键盘,也是采用了消息机制的思路,为了以后整体改为时间调度的方式打下基础。
/*******************************************************************************
** 功能描述: 定义CKEY类 **
*******************************************************************************/
class CKEY
{
public:
void Init();
void PressMessage();
u8 GetData();
protected:
u8 KeyIsDown;
u8 KeyData;
u8 NewData;
u8 Scan_Index;
};
/*******************************************************************************
** 函数名称: CKEY::Init() **
** 功能描述: 初始化键盘驱动程序,并初始化IO口 **
** 输入参数: 无 **
** 输出参数: 无 **
*******************************************************************************/
void CKEY::Init()
{
KeyIsDown = 0;
NewData = 0;
KeyData = 0;
Scan_Index = 0;
KEY_GPIO.Config(KEY1|KEY2|KEY3|KEY4,GPIO_MODE_IN_FLOATING,GPIO_SPEED_NULL);
}
/*******************************************************************************
** 函数名称: CKEY::PressMessage() **
** 功能描述: 处理键盘调度信息 **
** 输入参数: 无 **
** 输出参数: 无 **
*******************************************************************************/
void CKEY::PressMessage()
{
volatile u16 Key_Pin1, Key_Pin2;
u8 EventFlag;
Key_Pin1 = Key_Bit_Scan[Scan_Index].Key_Pin1;
Key_Pin2 = Key_Bit_Scan[Scan_Index].Key_Pin2;
EventFlag = 0;
if (KeyIsDown == 0)
{
if (KEY_GPIO.GetDataBit(Key_Pin1) == BTN_PRESS)
{
NewData = Key_Bit_Scan[Scan_Index].Key_Value1;
KeyIsDown = 1;
}
else
{
KEY_GPIO.Config(Key_Pin2, GPIO_MODE_OUT_PP,GPIO_SPEED_10MHz);
KEY_GPIO.SetDataBit(Key_Pin2, 0);
if (KEY_GPIO.GetDataBit(Key_Pin1) == BTN_PRESS)
{
KEY_GPIO.SetDataBit(Key_Pin2, 1);
if (KEY_GPIO.GetDataBit(Key_Pin1) == BTN_RELEASE)
{
NewData = Key_Bit_Scan[Scan_Index].Key_Value2;
KeyIsDown = 1;
}
KEY_GPIO.SetDataBit(Key_Pin2, 0);
}
else
{
EventFlag = 1;
}
}
}
else
{
if (KEY_GPIO.GetDataBit(Key_Pin1) == BTN_RELEASE)
{
KeyData = NewData;
KeyIsDown = 0;
EventFlag = 1;
}
}
if (EventFlag)
{
KEY_GPIO.SetDataBit(Key_Pin2, 1);
KEY_GPIO.Config(Key_Pin2, GPIO_MODE_IN_FLOATING,GPIO_SPEED_NULL);
Scan_Index++;
if (Scan_Index >= MAX_KEY_SCAN) Scan_Index=0;
}
}
/*******************************************************************************
** 函数名称: CKEY::GetData() **
** 功能描述: 读取键盘按键码 **
** 输入参数: 无 **
** 输出参数: 无 **
** 返回参数: BYTE : 键码,如果返回0,而无按键 **
*******************************************************************************/
u8 CKEY::GetData()
{
u8 Tmp = KeyData;
KeyData = 0;
return Tmp;
}
其中,UP,DOWN,LEFT,RIGHT,是属於优先式,也就是说,每一次在位扫描之前,都先判断对应的优先键(其实,这也是硬件的设计中所定义的)。
火锅的键盘,也是采用了消息机制的思路,为了以后整体改为时间调度的方式打下基础。
/*******************************************************************************
** 功能描述: 定义CKEY类 **
*******************************************************************************/
class CKEY
{
public:
void Init();
void PressMessage();
u8 GetData();
protected:
u8 KeyIsDown;
u8 KeyData;
u8 NewData;
u8 Scan_Index;
};
/*******************************************************************************
** 函数名称: CKEY::Init() **
** 功能描述: 初始化键盘驱动程序,并初始化IO口 **
** 输入参数: 无 **
** 输出参数: 无 **
*******************************************************************************/
void CKEY::Init()
{
KeyIsDown = 0;
NewData = 0;
KeyData = 0;
Scan_Index = 0;
KEY_GPIO.Config(KEY1|KEY2|KEY3|KEY4,GPIO_MODE_IN_FLOATING,GPIO_SPEED_NULL);
}
/*******************************************************************************
** 函数名称: CKEY::PressMessage() **
** 功能描述: 处理键盘调度信息 **
** 输入参数: 无 **
** 输出参数: 无 **
*******************************************************************************/
void CKEY::PressMessage()
{
volatile u16 Key_Pin1, Key_Pin2;
u8 EventFlag;
Key_Pin1 = Key_Bit_Scan[Scan_Index].Key_Pin1;
Key_Pin2 = Key_Bit_Scan[Scan_Index].Key_Pin2;
EventFlag = 0;
if (KeyIsDown == 0)
{
if (KEY_GPIO.GetDataBit(Key_Pin1) == BTN_PRESS)
{
NewData = Key_Bit_Scan[Scan_Index].Key_Value1;
KeyIsDown = 1;
}
else
{
KEY_GPIO.Config(Key_Pin2, GPIO_MODE_OUT_PP,GPIO_SPEED_10MHz);
KEY_GPIO.SetDataBit(Key_Pin2, 0);
if (KEY_GPIO.GetDataBit(Key_Pin1) == BTN_PRESS)
{
KEY_GPIO.SetDataBit(Key_Pin2, 1);
if (KEY_GPIO.GetDataBit(Key_Pin1) == BTN_RELEASE)
{
NewData = Key_Bit_Scan[Scan_Index].Key_Value2;
KeyIsDown = 1;
}
KEY_GPIO.SetDataBit(Key_Pin2, 0);
}
else
{
EventFlag = 1;
}
}
}
else
{
if (KEY_GPIO.GetDataBit(Key_Pin1) == BTN_RELEASE)
{
KeyData = NewData;
KeyIsDown = 0;
EventFlag = 1;
}
}
if (EventFlag)
{
KEY_GPIO.SetDataBit(Key_Pin2, 1);
KEY_GPIO.Config(Key_Pin2, GPIO_MODE_IN_FLOATING,GPIO_SPEED_NULL);
Scan_Index++;
if (Scan_Index >= MAX_KEY_SCAN) Scan_Index=0;
}
}
/*******************************************************************************
** 函数名称: CKEY::GetData() **
** 功能描述: 读取键盘按键码 **
** 输入参数: 无 **
** 输出参数: 无 **
** 返回参数: BYTE : 键码,如果返回0,而无按键 **
*******************************************************************************/
u8 CKEY::GetData()
{
u8 Tmp = KeyData;
KeyData = 0;
return Tmp;
}


实际上,我也早想步入C++行列了,不过
弯路走了很对,还徘徊在C上,
不,
是还徘徊在C51上。