您的位置:首页 > 其它

TRTOS 使用消息队列键盘通用驱动

2017-03-17 13:36 141 查看
先加入一段废话,不加的话博客首页展示的时候会很丑,废话如下:这是一个可以通用的键盘驱动程序,只需要在任务参数中传入获取键值的函数,键盘任务会把所有按键的短按长按,抬起等操作全都通过消息发送到受体任务内,从而实现了键盘驱动隔离,更有效的节省了系统运行开支和加快了按键响应时间,消息队列的引用,更大的减少了操作漏执行。
#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;
}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息