/*-------------------------定义结构体------------------------------*/
typedef struct
{
uint8 KeyStateIndex; //当前状态索引号
uint8 KeyDownState; //按下"向下"键时转向的状态索引号
uint8 KeyUpState; //按下"向上"键时转向的状态索引号
uint8 KeySetState; //按下"回车"键时转向的状态索引号
void (*CurrentOperate)(); //当前状态应该执行的功能操作
}KbdTabStruct;
/**********************************菜单结构数组***********************************/
KbdTabStruct const KeyTab[SIZE_OF_KEYBD_MENU] =
{
//Index Down Up Set
{ 0, 0, 0, 1, (*Display_Work)}, //(工作界面)
{ 1, 1, 1, 2, (*Display_ALAr) }, //(AL.AR)
{ 2, 2, 2, 3, (*One_Alr) }, //(YES/NO第一路报警标志)
{ 3, 3, 3, 4, (*ALr1_State0) }, //(ALr1第一路报警值)
{ 4, 4, 4, 0, (*Display_END) } //(End设置结束)
};
报警标志按UP/DOWN键进行YES/NO选择,选择YES是能正常运行,选择NO时跳出当前状态,进入END设置结束,但是选择NO有时正常,有时先跳到索引号3再按SET键才跳到END设置结束,跳转程序如下:
/*----------------按Up或Down键设置第一路是否报警---------------*/
void One_Alr()
{
AlrControl[0].AlrEN = Flash_Read_Byte(0x06);
while(1)
{
Y_N_Key_Scan(AlrControl[0].AlrEN);
if (Flag == HIGH)
{
DispStr(0x01,MenuStr[5]); //YES
DispStr(0x05,MenuStr[20]);//ALr.1
AlrControl[0].AlrEN = ENABLE;
}
else
{
DispStr(0x01,MenuStr[6]); //No
DispStr(0x05,MenuStr[20]);//ALr.1
AlrControl[0].AlrEN = DISABLE;
}
Set_Flag = Set_En();
if(Set_Flag == 1)
break;
Time_Out_Flag = Process_Menu_Return();
if(Time_Out_Flag == 1)
break;
OSWait(K_TMO,MS100); //延时100MS
}
if(Time_Out_Flag == 1) KeyFuncIndex = 0;//超时时间到跳出菜单回到工作界面
else
{
if (Flag == LOW) KeyFuncIndex = 3; //当选择NO时执行索引号3所对应的SET键的操作
else{} //否则,程序正常跳转
}
Flash_Write_Byte(0x06,AlrControl[0].AlrEN);
}
不知道菜单操作过程中,这样跳转有没有问题? |