先加入一段廢話,不加的話部落格首頁展示的時候會很醜,廢話如下:這是一個可以通用的鍵盤驅動程式,隻需要在任務參數中傳入擷取鍵值的函數,鍵盤任務會把所有按鍵的短按長按,擡起等操作全都通過消息發送到受體任務内,進而實作了鍵盤驅動隔離,更有效的節省了系統運作開支和加快了按鍵響應時間,消息隊列的引用,更大的減少了操作漏執行。
#include <Include.h>
#include <Key_Driver.h>
uint8 KeyCode_Tos_TaskID=Tos_TaskNull;
/********************************************************************************
Func:鍵盤任務
Date:2017-3-8
Note:傳入參數為擷取按鍵碼調用
********************************************************************************/
void Task_KeyBoard(void *Tags)
{
MGUI_KeyMsg KeyMsg;
typedef uint8(*KeyBoardGetValue)(void);
KeyBoardGetValue P;
P=((KeyBoardGetValue)(Tags));
Tos_TaskDelay(2000);
while(1)
{
Tos_TaskDelay(10);
KeyMsg.KeyValue=P();
KeyMsg.KeyTime=0;
if(KeyMsg.KeyValue!=0)
{
while(P())
{
Tos_TaskDelay(10);
if(KeyMsg.KeyTime<50)KeyMsg.KeyTime++;
if(KeyMsg.KeyTime>=50)
{
Tos_TaskDelay(100);
KeyMsg.KeyType=Key_DownTimeOut;
Tos_TaskPutQmsg(KeyCode_Tos_TaskID,0,sizeof(MGUI_KeyMsg),&KeyMsg);
}
}
if(KeyMsg.KeyTime<50)
{
KeyMsg.KeyType=Key_OneClick;
Tos_TaskPutQmsg(KeyCode_Tos_TaskID,0,sizeof(MGUI_KeyMsg),&KeyMsg);
}
}
}
}
/********************************************************************************
Func:擷取按鍵消息
Date:2017-3-8
Note:傳入參數為延時時間0為無限等待,傳回按鍵消息
********************************************************************************/
MGUI_KeyMsg * MUI_GetKey(uint16 D)
{
Tos_ArrayMessage *CurMsg;
MGUI_KeyMsg *TaskMsg;
if(D)CurMsg=Tos_TaskGetQMsgDelay(D);
else CurMsg=Tos_TaskGetQMsg();
if(CurMsg)
{
TaskMsg=(MGUI_KeyMsg *)CurMsg->Qmsg_Addr;
return TaskMsg;
}
return Null;
}
/********************************************************************************
Func:按鍵鈎子
Date:2017-3-8
Note:想擷取按鍵的任務可以指向該操作,消息始終被最後執行該函數的任務擷取
********************************************************************************/
void Tos_TaskGetHandKey()
{
KeyCode_Tos_TaskID=Tos_TaskCurrent;
}
在任務表中加入鍵盤任務
const TaskInitList TaskList_putong[]={
{Task0,Null,"Task0",2000},
//{Task_LCD,Null,"Task0",2000},
{Sensor_Command,USART1,"Sensor_Command",2000},
{Task_Face,Null,"Task_Face",2000},
{Task_Action,Null,"Task_Action",2000},
{Task_KeyBoard,HandKey_GetValue,"Task_KeyBoard",2000},鍵盤任務
{TaskPlan_1,Null,"Task_Face",2000},
{Task_Arrary,(void *)2,"Task_Arrary",2000},
{Task_HistoryRecord1,Null,"Task_HistoryRecord",2000},
{Null},
};
鍵盤任務傳入的任務參數為擷取鍵值函數
uint8 HandKey_GetValue()
{
uint8 Value=0x00;
uint16 Temp;
Temp=GPIO_GetAll();
if(!(Temp&S4)){Value=Key_Up;}
if(!(Temp&S5)){Value=Key_Down;}
if(!(Temp&S6)){Value=Key_Right;}
if(!(Temp&S7)){Value=Key_Enter;}
if((Temp&S8)){Value=Key_WkUp;}
return Value;
}
上面這些活幹完了,就可以大大方方的使用了
void Task_Action(void *Tags)
{
BOOL SetEn=False;
uint8 i;
Tos_ArrayMessage Msg[5];
MGUI_KeyMsg *TaskMsg,TaskMsgBuf[5];
for(i=0;i<5;i++)Msg[i].Qmsg_Addr=&TaskMsgBuf[i];
Tos_TaskCreateQmsg(&Msg[0],5);
Tos_TaskGetHandKey();
while(1)
{
Tos_TaskDelay(3);
TaskMsg=MUI_GetKey(0);
if(TaskMsg)
{
DeBug("%d,%d",TaskMsg->KeyType,TaskMsg->KeyValue,2);
BEEP();
if(TaskMsg->KeyValue==Key_Enter)
{
SetEn=True;
UIShowValue.SysWorkMode++;
}
if(TaskMsg->KeyValue==Key_Right){SetEn=False;Task_LoadConfigs();}
if(TaskMsg->KeyValue==Key_WkUp){SetEn=False;System_SaveConfig();}
if(SetEn)
{
switch(UIShowValue.SysWorkMode)
{
case 1:
if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[0].Max+=0.1;
if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[0].Max+=1;
if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[0].Max-=0.1;
if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[0].Max-=1;
break;
case 2:
if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[0].Min+=0.1;
if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[0].Min+=1;
if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[0].Min-=0.1;
if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[0].Min-=1;
break;
case 3:
if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[1].Max+=0.1;
if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[1].Max+=1;
if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[1].Max-=0.1;
if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[1].Max-=1;
break;
case 4:
if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[1].Min+=0.1;
if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[1].Min+=1;
if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[1].Min-=0.1;
if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[1].Min-=1;
break;
case 5:
if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.ServerPort[0]+=1;
if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.ServerPort[0]+=10;
if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.ServerPort[0]-=1;
if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.ServerPort[0]-=10;
break;
default:UIShowValue.SysWorkMode=1;
}
Ht1621_DrawMaxMin(UIShowValue.SysWorkMode);
}else
{
if(TaskMsg->KeyValue==Key_Up){UIShowValue.SysWorkMode=0xff;Ht1621_DrawHold(1);Tos_TaskDelay(1000);}
if(TaskMsg->KeyValue==Key_Down){UIShowValue.SysWorkMode=0xff;Ht1621_DrawHold(2);Tos_TaskDelay(1000);}
UIShowValue.SysWorkMode=0;
}
}
}
}