您的位置:首页 > 其它

ucos学习实例之消息队列---按键控制LED的亮灭

2013-03-24 20:13 781 查看
OS_EVENT*KeyQEvent;
INT8Uerr;
INT8U*Qmsg_Key1="Key1";
INT8U*Qmsg_Key2="Key2";
INT8U*Qmsg_Key3="Key3";
INT8U*Qmsg_Key4="Key4";



/****************************************************************************
*名称:staticvoidAppTaskLED(void*p_arg)
*功能:LED任务
*入口参数:无
*出口参数:无
*优先级:5
*调用方法:无
****************************************************************************/
staticvoidAppTaskLED(void*p_arg)
{
INT8U*q_keymsg;
(void)p_arg;

while(1)
{
q_keymsg=(INT8U*)OSQPend(KeyQEvent,10,&err);/*扫描消息队列*/
if(err==OS_NO_ERR)
{
if(q_keymsg==Qmsg_Key2)/*如果按键2被按键,则相应相关处理函数*/
{
LED2_ON();
}
elseif(q_keymsg==Qmsg_Key1)
{
LED1_ON();
}
elseif(q_keymsg==Qmsg_Key3)
{
LED3_ON();
}
elseif(q_keymsg==Qmsg_Key4)
{
LED3_OFF();
LED2_OFF();
LED1_OFF();
}
}

}
}

/****************************************************************************
*名称:staticvoidAppTaskKey(void*pdata)
*功能:按键扫描任务
*入口参数:无
*出口参数:无
*优先级:3
*调用方法:无
****************************************************************************/
staticvoidAppTaskKey(void*pdata)
{
void*Qstart[10];//用户创建消息队列,能够存放10条消息
INT8UKey1State;
INT8UKey2State;
INT8UKey3State;
INT8UKey4State;

INT8Ukey1_release=0;
INT8Ukey2_release=0;
INT8Ukey3_release=0;
INT8Ukey4_release=0;

KeyQEvent=OSQCreate(&Qstart[0],10);

while(1)
{
OSTimeDlyHMSM(0,0,0,50);
Key1State=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5);
Key2State=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2);
Key3State=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3);
Key4State=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6);
if(Key1State==0)
{
OSTimeDlyHMSM(0,0,0,20);
Key1State=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5);
if(Key1State==0)
{
key1_release=1;
}
}
if(Key1State==0&&key1_release==1)
{
OSQPost(KeyQEvent,Qmsg_Key1);
key1_release=0;
}
if(Key2State==0)
{
OSTimeDlyHMSM(0,0,0,20);
Key2State=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2);
if(Key2State==0)
{
key2_release=1;
}
}
if(Key2State==0&&key2_release==1)
{
OSQPost(KeyQEvent,Qmsg_Key2);
key2_release=0;
}
if(Key3State==0)
{
OSTimeDlyHMSM(0,0,0,20);
Key3State=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3);
if(Key3State==0)
{
key3_release=1;
}
}
if(Key3State==0&&key3_release==1)
{
OSQPost(KeyQEvent,Qmsg_Key3);
key3_release=0;
}

if(Key4State==0)
{
OSTimeDlyHMSM(0,0,0,20);
Key4State=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6);
if(Key4State==0)
{
key4_release=1;
}
}
if(Key4State==0&&key4_release==1)
{
OSQPost(KeyQEvent,Qmsg_Key4);
key4_release=0;
}

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