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

5 篇文章 0 订阅
3 篇文章 0 订阅
本文介绍了一个使用TRTOS的键盘通用驱动程序,通过消息队列实现键盘事件(如短按、长按)的传递,提高了响应速度并减少操作漏执行。任务参数中传入获取键值的函数,使键盘驱动与其他任务隔离,降低系统资源消耗。示例代码展示了如何创建键盘任务、获取按键消息以及在其他任务中处理按键事件。
摘要由CSDN通过智能技术生成
先加入一段废话,不加的话博客首页展示的时候会很丑,废话如下:这是一个可以通用的键盘驱动程序,只需要在任务参数中传入获取键值的函数,键盘任务会把所有按键的短按长按,抬起等操作全都通过消息发送到受体任务内,从而实现了键盘驱动隔离,更有效的节省了系统运行开支和加快了按键响应时间,消息队列的引用,更大的减少了操作漏执行。
#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;
        }
            
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值