如题:
任务
//按键
void Task_Key(void *pdata)
{
u8 key_value=0;
while(1)
{
key_value=KEY_Scan();
if(key_value) OSMboxPost(ButtonMsgMbox, (void *)&key_value); //发送邮箱,即发送消息的指针地址,
//OSTimeDlyHMSM(0,0,0,200);
delay_ms(10);
}
}
//获得键值计数
void Task_Dis(void *pdata)
{
u8 err, key = 0;
u8 *msg; //请求消息邮箱指针
while(1)
{
msg = OSMboxPend(ButtonMsgMbox,0,&err); //请求消息邮箱
key = *msg;
switch(key)
{
case 1: up_temp++;if(up_temp==99) up_temp=0; break;
case 2: down_temp++;if(down_temp==99) down_temp=0;break;
default: break;
}
LCD_ShowNum(148,90,up_temp,2,16);
LCD_ShowNum(148,110,down_temp,2,16);
delay_ms(10);
//OSTimeDlyHMSM(0,0,0,200);
}
}
按键扫描:
void KEY_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入
GPIOA->CRH|=0X80800000;
GPIOA->ODR|=1<<13; //PA13上拉,PA0默认下拉
GPIOA->ODR|=1<<15; //PA15上拉
}
//按键处理函数
//返回按键值
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2!!
u8 KEY_Scan(void)
{
static u8 key_up=1;//按键按松开标志
//JTAG_Set(JTAG_SWD_DISABLE); 红色部分如果不注释掉程序异常
if(key_up&&(KEY0==0||KEY1==0))
{
//OSTimeDlyHMSM(0,0,0,200);
delay_ms(10);//去抖动
key_up=0;
if(KEY0==0)
{
//JTAG_Set(SWD_ENABLE);
return 1;
}
else if(KEY1==0)
{
//JTAG_Set(SWD_ENABLE);
return 2;
}
}else if(KEY0==1&&KEY1==1)key_up=1;
//JTAG_Set(SWD_ENABLE);
return 0;// 无按键按下
} |