金牌会员
 
- 积分
- 1477
- 金钱
- 1477
- 注册时间
- 2014-5-21
- 在线时间
- 342 小时
|
发表于 2016-3-12 09:26:18
|
显示全部楼层
方法2-->基于UCOSIII的**最后修改日期: 2015年04月24日**描 述: 按键操作
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "key.h"
#include "stdio.h"
#include "stdlib.h"
#include "lcd.h"
/*
*********************************************************************************************************
私有宏定义
*********************************************************************************************************
*/
#define GetPwrStatus() (GPIOB->IDR & GPIO_Pin_10)
#define DISPLAY_INFO_KEY_STATUS() (GPIOC->IDR & GPIO_Pin_5)
#define ECG_MARK_KEY_STATUS() (GPIOB->IDR & GPIO_Pin_0)
#define START_RECORD_KEY_STATUS() (GPIOB->IDR & GPIO_Pin_1)
#define POWER_CTL_KEY_STATUS() (GPIOB->IDR & GPIO_Pin_10)
CPU_INT08U StartADCFlag = 0;
OS_TICK StartRecordTick = 0;
/*
*********************************************************************************************************
私有函数申明
*********************************************************************************************************
*/
static CPU_INT08U QueryKeyCode(void);
/********************************************************************************************************
** 函数名称: KeyTask
** 功能描述: 按键任务,完成开机动作,按键扫描
** 输 入: parg:参数传递入口
** 输 出: 无
** 全局变量: 无
********************************************************************************************************/
void KeyTask(void *parg)
{
OS_ERR err;
CPU_INT08U key;
APP_ARG *p_arg = (APP_ARG *)parg;
static LCDDAT lcd;
if(OSFlagPend(p_arg->pfgrp,(OS_FLAGS)SDCardLessFlag+NoSDCardFlag,100,OS_OPT_PEND_NON_BLOCKING + OS_OPT_PEND_FLAG_SET_ANY,NULL,&err))
{
lcd.pic = FlashDiyLCD;lcd.period = 0;
CloseDev();
}else {lcd.pic = SystemNormalLCD;lcd.period = 1;}
OSQPost(p_arg->pLCDQ,(void *)&lcd,sizeof(lcd),OS_OPT_POST_FIFO,&err);
OSTimeDlyResume(p_arg->LCDTaskTCB,&err);
CloseBlueLED();
do{
OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_DLY,&err);
}while(GetPwrStatus());
while(1)
{
key = QueryKeyCode();
if(key != NoKey){
if(key==POWER_CTL_KEY){
OSTimeDlyHMSM(0,0,PWR_KEY_TIME_DELAY,0,OS_OPT_TIME_DLY,&err); /* 关机延时 */
}else{
OSTimeDlyHMSM(0,0,0,KEY_TIME_DELAY,OS_OPT_TIME_DLY,&err); /* 按键去抖延时 */
}
if(key == QueryKeyCode())
{
lcd.period = 1;
switch(key){
case POWER_CTL_KEY:
if(StartADCFlag)StartADCFlag = 0;
OSFlagPost(p_arg->pfgrp,PowerDownFlag,OS_OPT_POST_FLAG_SET,&err);
CloseDev();CloseBlueLED();CloseYellowLED();
lcd.pic = ShutDownFinishLCD;
OSQPost(p_arg->pLCDQ,(void *)&lcd,sizeof(lcd),OS_OPT_POST_FIFO,&err);
OSTimeDlyResume(p_arg->LCDTaskTCB,&err);
break;
case START_RECORD_KEY:
OSFlagPost(p_arg->pfgrp,StartRecordFlag,OS_OPT_POST_FLAG_SET,&err);
OSFlagPend(p_arg->pfgrp,(OS_FLAGS)StartADCCnvFlag,0,OS_OPT_PEND_BLOCKING + OS_OPT_PEND_FLAG_SET_ALL,NULL,&err);
if(!StartADCFlag){
OSTimeSet(0,&err);
StartADCFlag = 1;
}
lcd.pic = RecordingLCD;
OSQPost(p_arg->pLCDQ,(void *)&lcd,sizeof(lcd),OS_OPT_POST_FIFO,&err);
OSTimeDlyResume(p_arg->LCDTaskTCB,&err);
OSFlagPost(p_arg->pfgrp,RecordRunFlag,OS_OPT_POST_FLAG_SET,&err);
break;
case ECG_MARK_KEY:
if(OSFlagPend(p_arg->pfgrp,(OS_FLAGS)RecordRunFlag,0,OS_OPT_PEND_FLAG_SET_ALL+
OS_OPT_PEND_NON_BLOCKING,NULL,&err)){
if(OS_ERR_NONE == err){
OSFlagPost(p_arg->pfgrp,(OS_FLAGS)ECGMarkFlag,OS_OPT_POST_FLAG_SET,&err);
lcd.pic = EcgMarkLCD;
}
}else lcd.pic = SystemNormalLCD;
OSQPost(p_arg->pLCDQ,(void *)&lcd,sizeof(lcd),OS_OPT_POST_FIFO,&err);
OSTimeDlyResume(p_arg->LCDTaskTCB,&err);
break;
case DISPLAY_INFO_KEY:
if(OSFlagPend(p_arg->pfgrp,(OS_FLAGS)StartRecordFlag,0,OS_OPT_PEND_FLAG_SET_ALL+
OS_OPT_PEND_NON_BLOCKING,NULL,&err)){
lcd.pic = DisplayInfoLCD;
}else lcd.pic = SystemNormalLCD;
OSQPost(p_arg->pLCDQ,(void *)&lcd,sizeof(lcd),OS_OPT_POST_FIFO,&err);
OSTimeDlyResume(p_arg->LCDTaskTCB,&err);
break;
}
OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_DLY,&err);
}
}else OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_DLY,&err);
}
}
/********************************************************************************************************
** 函数名称: QueryKeyCode
** 功能描述: 查询键码
** 输 入: 无
** 输 出: 无
** 返 回: 查询后的键码
********************************************************************************************************/
static CPU_INT08U QueryKeyCode(void)
{
CPU_INT08U keycode = 0;
if(DISPLAY_INFO_KEY_STATUS())keycode |= DISPLAY_INFO_KEY;
if(ECG_MARK_KEY_STATUS())keycode |= ECG_MARK_KEY;
if(START_RECORD_KEY_STATUS() )keycode |= START_RECORD_KEY;
if(POWER_CTL_KEY_STATUS())keycode |= POWER_CTL_KEY;
return keycode;
}
/********************************************************************************************************
** 函数名称: KeyIRQn
** 功能描述: 按键中断处理函数
** 输 入: 无
** 输 出: 无
** 返 回: 无
********************************************************************************************************/
void KeyIRQn(void)
{
if((EXTI->PR & EXTI_Line0)) EXTI->PR = EXTI_Line0;
if((EXTI->PR & EXTI_Line1)) EXTI->PR = EXTI_Line1;
if((EXTI->PR & EXTI_Line5)) EXTI->PR = EXTI_Line5;
if((EXTI->PR & EXTI_Line10))EXTI->PR = EXTI_Line10;
}
/****************************** (C) COPYRIGHT SmartHealth *****END OF FILE******************************/
|
|