//******************************************************************** // 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(); \ KEY_RlvRead(); \ KEY_RegoRead(); \ KEY_P5vRead(); \ KEY_Dsg3Read(); \ KEY_Chg3Read(); \ KEY_Cov2Read(); \ }while(0) //按键唤醒使能、禁止 #define KEY_Wakeup(NewState) do{ \ KEY_S1IntConfig(NewState); \ KEY_ChgsIntConfig(NewState); \ KEY_PlcdIntConfig(NewState); \ }while(0) //******************************************************************** //按键KEY S1,电源按键检测,P10 #define KEY_S1Init() GPIO_Init(P1, 0, 1, IO_IN_PU) #define KEY_S1Read() KEY_WriteFlag(S1, New, (!GPIO_ReadPin(P1, 0))) #define KEY_S1IntConfig(NewState) GPIO_IrqConfig(P1, 0, INTP0, INTP_FALLING, NewState) #define KEY_ReadS1Flag() GPIO_GetIrqStatus(INTP0) #define KEY_ClrS1Flag() GPIO_ClearIrq(INTP0) //按键CHGS检测,充电插入检测,P60 #define KEY_ChgsInit() GPIO_Init(P6, 0, 1, IO_IN_NULL) #define KEY_ChgsRead() KEY_WriteFlag(CHGS, New, (GPIO_ReadPin(P6, 0))) #define KEY_ChgsIntConfig(NewState) GPIO_IrqConfig(P6, 0, INTP1, INTP_RISING, NewState) #define KEY_ReadChgsFlag() GPIO_GetIrqStatus(INTP1) #define KEY_ClrChgsFlag() GPIO_ClearIrq(INTP1) //按键PLCD检测,屏口通信检测,P71 #define KEY_PlcdInit() GPIO_Init(P7, 1, 1, IO_IN_PD) #define KEY_PlcdRead() KEY_WriteFlag(PLCD, New, (!GPIO_ReadPin(P7, 1))) #define KEY_PlcdIntConfig(NewState) GPIO_IrqConfig(P7, 1, INTP2, INTP_RISING, NewState) #define KEY_ReadPlcdFlag() GPIO_GetIrqStatus(INTP2) #define KEY_ClrPlcdFlag() GPIO_ClearIrq(INTP2) #if ((__VER_HW__ == 1) || \ (__VER_HW__ == 2)) //按键RLV 检测,P50,2022.07.06 此功能已取消,IO映射到未使用引脚 #define KEY_RlvInit() GPIO_Init(P5, 0, 1, IO_IN_PU) #define KEY_RlvRead() KEY_WriteFlag(RLV, New, (!GPIO_ReadPin(P5, 0))) #define KEY_RlvIntConfig(NewState) GPIO_IrqConfig(P5, 0, INTP3, INTP_FALLING, NewState) #define KEY_ReadRlvFlag() GPIO_GetIrqStatus(INTP3) #define KEY_ClrRlvFlag() GPIO_ClearIrq(INTP3) #else //按键RLV 检测,P40 #define KEY_RlvInit() GPIO_Init(P4, 0, 1, IO_IN_PU) #define KEY_RlvRead() KEY_WriteFlag(RLV, New, (!GPIO_ReadPin(P4, 0))) #define KEY_RlvIntConfig(NewState) GPIO_IrqConfig(P4, 0, INTP3, INTP_FALLING, NewState) #define KEY_ReadRlvFlag() GPIO_GetIrqStatus(INTP3) #define KEY_ClrRlvFlag() GPIO_ClearIrq(INTP3) #endif //按键REGO 检测,P121 #define KEY_RegoInit() GPIO_Init(P12, 1, 1, IO_IN_NULL) #define KEY_RegoRead() KEY_WriteFlag(REGO, New, (!GPIO_ReadPin(P12, 1))) //按键DSG3 检测,P62 #define KEY_Dsg3Init() GPIO_Init(P6, 2, 1, IO_IN_NULL) #define KEY_Dsg3Read() KEY_WriteFlag(DSG3, New, (!GPIO_ReadPin(P6, 2))) //按键CHG3 检测,P136 #define KEY_Chg3Init() GPIO_Init(P13, 6, 1, IO_IN_NULL) #define KEY_Chg3Read() KEY_WriteFlag(CHG3, New, (!GPIO_ReadPin(P13, 6))) //按键COV2 检测,P25 #define KEY_Cov2Init() GPIO_Init(P2, 5, 1, IO_IN_NULL) #define KEY_Cov2Read() KEY_WriteFlag(COV2, New, (!GPIO_ReadPin(P2, 5))) //按键CHGS2 检测,P24 #define KEY_Chgs2Init() GPIO_Init(P2, 4, 1, IO_IN_NULL) #define KEY_Chgs2Read() KEY_WriteFlag(CHGS2, New, (!GPIO_ReadPin(P2, 4))) //******************************************************************** //按键参数定义,按键检测时基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; } 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 //******************************************************************** extern void KEY_Init(void); extern void KEY_Read(void); extern void KEY_SleepCnt(void); #endif