//******************************************************************** // Ver 1.0 // 2021.11.19 1、创建文件 //******************************************************************** #ifndef __KEY__H #define __KEY__H //GPIO初始化 #define KEY_GpioInit() do{ \ KEY_S1Init(); \ KEY_PlcdInit(); \ KEY_ChgsInit(); \ KEY_Chgs2Init(); \ KEY_RlvInit(); \ KEY_RegoInit(); \ KEY_Dsg3Init(); \ KEY_Chg3Init(); \ KEY_Cov2Init(); \ }while(0) //读取所有按键状态 #define KEY_ReadState() do{ \ KEY_S1Read(); \ KEY_ChgsRead(); \ }while(0) //按键唤醒使能、禁止 #define KEY_Wakeup(NewState) do{ \ KEY_S1IntConfig(NewState); \ KEY_ChgsIntConfig(NewState); \ KEY_PlcdIntConfig(NewState); \ }while(0) //******************************************************************** //按键KEY S1,电源按键检测,P10->PA12 #define KEY_S1Init() GPIO_Init(GPIOA, GPIO_Pin_12, 1, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_UP) #define KEY_S1Read() KEY_WriteFlag(S1, New, (!GPIO_ReadPin(GPIOA, GPIO_Pin_12))) #define KEY_S1IntConfig(NewState) GPIO_IrqConfig(GPIOA, GPIO_Pin_12, EXTI_Trigger_Falling, NewState) #define KEY_ReadS1Flag() GPIO_GetIrqStatus(GPIOA, GPIO_Pin_12) #define KEY_ClrS1Flag() GPIO_ClearIrq(GPIOA, GPIO_Pin_12) //按键CHGS检测,充电插入检测,P60->PA1 #define KEY_ChgsInit() GPIO_Init(GPIOA, GPIO_Pin_1, 1, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL) #define KEY_ChgsRead() KEY_WriteFlag(CHGS, New, (GPIO_ReadPin(GPIOA, GPIO_Pin_1))) #define KEY_ChgsIntConfig(NewState) GPIO_IrqConfig(GPIOA, GPIO_Pin_1, EXTI_Trigger_Rising, NewState) #define KEY_ReadChgsFlag() GPIO_GetIrqStatus(GPIOA, GPIO_Pin_1) #define KEY_ClrChgsFlag() GPIO_ClearIrq(GPIOA, GPIO_Pin_1) //按键PLCD检测,屏口通信检测,P71->PB2 #define KEY_PlcdInit() GPIO_Init(GPIOB, GPIO_Pin_2, 1, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_DOWN) #define KEY_PlcdRead() KEY_WriteFlag(PLCD, New, (!GPIO_ReadPin(GPIOB, GPIO_Pin_2))) #define KEY_PlcdPinRead() GPIO_ReadPin(GPIOB, GPIO_Pin_2) #define KEY_PlcdIntConfig(NewState) GPIO_IrqConfig(GPIOB, GPIO_Pin_2, EXTI_Trigger_Rising, NewState) #define KEY_ReadPlcdFlag() GPIO_GetIrqStatus(GPIOB, GPIO_Pin_2) #define KEY_ClrPlcdFlag() GPIO_ClearIrq(GPIOB, GPIO_Pin_2) //按键RLV 检测,P40->PC13 #define KEY_RlvInit() GPIO_Init(GPIOC, GPIO_Pin_13, 1, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL) #define KEY_RlvRead() KEY_WriteFlag(RLV, New, (!GPIO_ReadPin(GPIOC, GPIO_Pin_13))) #define KEY_RlvIntConfig(NewState) GPIO_IrqConfig(GPIOC, GPIO_Pin_13, EXTI_Trigger_Falling, NewState) #define KEY_ReadRlvFlag() GPIO_GetIrqStatus(GPIOC, GPIO_Pin_13) #define KEY_ClrRlvFlag() GPIO_ClearIrq(GPIOC, GPIO_Pin_13) //按键REGO 检测,P121->PF1 #define KEY_RegoInit() GPIO_Init(GPIOF, GPIO_Pin_1, 1, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL) #define KEY_RegoRead() KEY_WriteFlag(REGO, New, (!GPIO_ReadPin(GPIOF, GPIO_Pin_1))) //按键DSG3 检测,P62->PA8 #define KEY_Dsg3Init() GPIO_Init(GPIOA, GPIO_Pin_8, 1, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL) #define KEY_Dsg3Read() KEY_WriteFlag(DSG3, New, (!GPIO_ReadPin(GPIOA, GPIO_Pin_8))) //按键CHG3 检测,P136->PA0 #define KEY_Chg3Init() GPIO_Init(GPIOA, GPIO_Pin_0, 1, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL) #define KEY_Chg3Read() KEY_WriteFlag(CHG3, New, (!GPIO_ReadPin(GPIOA, GPIO_Pin_0))) //按键COV2 检测,P25->PA15 #define KEY_Cov2Init() GPIO_Init(GPIOA, GPIO_Pin_15, 1, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL) #define KEY_Cov2Read() KEY_WriteFlag(COV2, New, (!GPIO_ReadPin(GPIOA, GPIO_Pin_15))) //按键CHGS2 检测,P24->PB3 #define KEY_Chgs2Init() GPIO_Init(GPIOB, GPIO_Pin_3, 1, GPIO_Mode_IN, GPIO_Speed_2MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL) #define KEY_Chgs2Read() KEY_WriteFlag(CHGS2, New, (!GPIO_ReadPin(GPIOB, GPIO_Pin_3))) //******************************************************************** //按键参数定义,按键检测时基20ms enum{ S1 = 0, CHGS, CHGS2, PLCD, RLV, REGO, ALERT, P5V, DSG3, CHG3, COV2, KEY_NUM_MAX, KEY_BASE_TIME = 25, KEY_SHORT_CNT = (100UL/KEY_BASE_TIME), //短按 KEY_LONG_CNT1 = (500UL/KEY_BASE_TIME), //长按0.5 KEY_LONG_CNT2 = (2000UL/KEY_BASE_TIME), //长按2秒 KEY_LONG_CNT3 = (3000UL/KEY_BASE_TIME), //长按3秒 KEY_PRES_2S = (2000UL/KEY_BASE_TIME), //长按2秒 KEY_PRES_2D3S = (2300UL/KEY_BASE_TIME), //长按2.3秒 KEY_PRES_3S = (3000UL/KEY_BASE_TIME), //长按2.3秒 //KEY_LONG_CNT10 = (10000UL/KEY_BASE_TIME), //长按10秒 KEY_LONG_CNT_MAX = 250, }; //按键状态标志 enum{ New=0, Old, Rel, Tri, Press, Lpress, Lpress1, Lpress2, Lpress3, }; typedef union{ INT8U BYTES; struct{ INT8U bNew:1; //新状态 INT8U bOld:1; //旧状态 INT8U bRel:1; //释放状态 INT8U bTri:1; //触发状态 INT8U bPress:1; //短按状态 INT8U bLpress:1; //长按状态1 INT8U bLpress2:1; //长按状态2 INT8U bLpress3:1; //长按状态3 }BITS; }KEY_Str2; //按键数据 typedef struct{ INT8U Cnt; //状态计数 KEY_Str2 Flag; //标志位 }KEY_Str1; typedef struct{ KEY_Str1 Key[KEY_NUM_MAX]; INT16U PressNum; INT16U PressCnt; INT16U VbusCnt; INT16U PwrOnCnt; INT8U Lock; INT8U CrgCnt; INT8U OcdUnlockCnt; INT8U WakeupCode; }KEY_Str; extern KEY_Str KEY_Info; #define KEY_InfoInit() MEM_Fill((INT8U *)&KEY_Info, 0, sizeof(KEY_Info)) //按键值操作宏 #define KEY_ReadFlag(KEYn, FLAGn) (KEY_Info.Key[KEYn].Flag.BITS.b##FLAGn) #define KEY_WriteFlag(KEYn, FLAGn, Value) (KEY_Info.Key[KEYn].Flag.BITS.b##FLAGn = Value) #define KEY_ResetCnt(KEYn) KEY_Info.Key[KEYn].Cnt = 0 // #define KEY_Lock KEY_Info.Lock #define KEY_PressCnt KEY_Info.PressCnt #define KEY_CrgCnt KEY_Info.CrgCnt #define KEY_OcdUnlockCnt KEY_Info.OcdUnlockCnt #define KEY_WakeupCode KEY_Info.WakeupCode //******************************************************************** extern void KEY_Init(void); extern void KEY_Read(void); extern void KEY_SleepCnt(void); #endif