//******************************************************************** // Ver 1.0 // 2021.11.19 1、新建文件。 // 2022.04.15 2、修改5V打开延时10秒关闭。 // 2022.05.24 3、增加5V检测,5V关闭后,延迟2秒关闭MOS。 // 2022.07.06 4、增加二次保护信号输出检测。 // 5、增加充、放电MOS控制信号输出检测。 //******************************************************************** #include "config.h" KEY_Str KEY_Info; //初始化按键 void KEY_Init(void) { KEY_InfoInit(); KEY_GpioInit(); } //按键扫描, void KEY_Process(void) { INT8U i; for (i = 0; i < KEY_NUM_MAX; i++) { if (KEY_Info.Key[i].Flag.BITS.bNew != KEY_Info.Key[i].Flag.BITS.bOld) //两次检测状态不一致 { KEY_Info.Key[i].Flag.BITS.bOld = KEY_Info.Key[i].Flag.BITS.bNew; KEY_Info.Key[i].Cnt = 0; } if(KEY_Info.Key[i].Cnt <= KEY_LONG_CNT_MAX) { KEY_Info.Key[i].Cnt++; } switch(KEY_Info.Key[i].Cnt) { case KEY_SHORT_CNT: if (KEY_Info.Key[i].Flag.BITS.bPress != KEY_Info.Key[i].Flag.BITS.bOld) //按下状态与旧状态不一致时,按键跳变触发有效 { if(KEY_Info.Key[i].Flag.BITS.bOld != 0) { KEY_Info.Key[i].Flag.BITS.bPress = 1; KEY_Info.Key[i].Flag.BITS.bTri = 1; //按键触发 } else { KEY_Info.Key[i].Flag.BITS.bPress = 0; KEY_Info.Key[i].Flag.BITS.bRel = 1; //按键释放 } } break; case KEY_LONG_CNT1: KEY_Info.Key[i].Flag.BITS.bLpress = KEY_Info.Key[i].Flag.BITS.bOld; //按键长按有效 break; case KEY_LONG_CNT2: KEY_Info.Key[i].Flag.BITS.bLpress2 = KEY_Info.Key[i].Flag.BITS.bOld; //按键长按有效 break; case KEY_LONG_CNT3: KEY_Info.Key[i].Flag.BITS.bLpress3 = KEY_Info.Key[i].Flag.BITS.bOld; //按键长按有效 break; default: break; } } } //按键读取,处理按键状态 void KEY_Read(void) { //按键状态更新 KEY_ReadState(); KEY_Process(); //电量显示按键, if((KEY_ReadFlag(S1, Press) != 0) && //0.2S (KEY_ReadFlag(S1, Tri) != 0)) { if(KEY_PressCnt < KEY_LONG_CNT_MAX) { KEY_PressCnt++; } if(KEY_PressCnt >= KEY_PRES_3S) { if(BATT_PowerOnState(POWERON_KEY) == 0) { //BATT_PowerOn(POWERON_KEY, ENABLE); BATT_PreDischarge(PREDISCHARGE_START); //设置预放开始标志 BATT_FetEn((CFET | DFET), ENABLE); //设置充、放电MOS使能标志 BATT_FetLock((CFET | DFET), DISABLE); //清除MOS锁定 BATT_OvCnt = 0; //按键开机清除过充计数和标志位 BATT_PovCnt = 0; BATT_FLAG_POV = 0; BATT_FLAG_OV = 0; KEY_ResetCnt(P5V); KEY_WriteFlag(P5V, Lpress2, 0); //2022.06.02 增加写入5V检测有效标志 } else { BATT_PowerOn(POWERON_KEY, DISABLE); //BATT_CrgLockTime(50); //关机锁定充电器50秒 } BATT_FLAG_CRGLINK = 0; KEY_WriteFlag(S1, Tri, 0); KEY_WriteFlag(S1, Lpress, 0); } } else { KEY_PressCnt = 0; } if(((KEY_ReadFlag(CHGS, Press) != 0) || (BATT_FLAG_WAKEUP == WAKEUP_CRG) || (BATT_FLAG_CHG != 0)) && (BATT_FLAG_CRGLINK == 0) && (FET_FLAG_PREDISCHARGE == 0)) { BATT_FLAG_CRGLINK = 1; BATT_P5vOnTime(10); //2022.04.15 修改5V打开延时10秒关闭, //BATT_FetEn((DFET | CFET), ENABLE); //2022.07.05 充电器插入后,不需要直接打开MOS BATT_PowerOn(POWERON_CRG, ENABLE); BATT_CrgOffLineCntReset(19); //检测到充电器连接,发送10秒的充电器配置请求包 KEY_ResetCnt(P5V); KEY_WriteFlag(P5V, Lpress2, 0); //2022.06.02 增加写入5V检测有效标志 } if(BATT_FLAG_STA != STA_IDLE) { BATT_SleepDelayTime(10); //延时进入休眠 } if(BATT_FLAG_STA == STA_CHG) //2022.04.14 充电器无通信,检测充电电流 { BATT_CrgOffLineCntReset(19); } //注意事项:MOS打开后10秒,P5V关闭后开始检测。 if((KEY_ReadFlag(P5V, Lpress2) != 0) && //2022.05.24 增加5V检测,5V关闭后,延迟2秒关闭MOS (BATT_FLAG_RUNMODE == 0) && (BATT_FLAG_STA != STA_CHG)) { BATT_PowerOn(POWERON_ALL, DISABLE); } if(BATT_FLAG_DFET != 0) { LED_D0On(); BATT_SleepDelayTime(10); //延时进入休眠 } else { LED_D0Off(); if((BATT_FLAG_CRGLINK != 0) && //2022.06.02 增加充电器连接状态非0,5V断开2秒 (KEY_ReadFlag(P5V, Lpress2) != 0)) { BATT_FLAG_CRGLINK = 0; BATT_FLAG_WAKEUP = 0; KEY_ResetCnt(CHGS); KEY_WriteFlag(CHGS, Press, 0); } } //2022.07.06 增加二次保护信号输出检测 if(KEY_ReadFlag(COV2, Press) != 0) { BATT_FLAG_COV2F = 1; BATT_SetAlarmFlag(COV2F); } //2022.07.06 增加充电MOS信号输出检测 if(KEY_ReadFlag(CHG3, Press) != 0) { BATT_FLAG_CFETOUT = 1; } else { BATT_FLAG_CFETOUT = 0; } //2022.07.06 增加放电MOS信号输出检测 if(KEY_ReadFlag(DSG3, Press) != 0) { BATT_FLAG_DFETOUT = 1; } else { BATT_FLAG_DFETOUT = 0; } } //void GPIOA_IRQHandler(void) void INTP0_Handler(void) { if(KEY_ReadS1Flag() != 0) { KEY_ClrS1Flag(); BATT_FLAG_WAKEUP = WAKEUP_KEY; BATT_FLAG_CRGLOCK = 0; //2021.06.12 增加ID信号清除充电锁定标志 } } //void GPIOB_IRQHandler(void) void INTP1_Handler(void) { if(KEY_ReadChgsFlag() != 0) { KEY_ClrChgsFlag(); BATT_FLAG_WAKEUP = WAKEUP_CRG; BATT_FLAG_CRGLINK = 0; BATT_P5vOnTime(10); //2022.04.15 修改5V打开延时10秒关闭, //BATT_FLAG_ON |= 0x01; BATT_CrgOffLineCntReset(19); } } //void GPIOC_IRQHandler(void) void INTP2_Handler(void) { if(KEY_ReadPlcdFlag() != 0) { KEY_ClrPlcdFlag(); BATT_FLAG_WAKEUP = WAKEUP_KEY; } } void INTP3_Handler(void) { if(UART0_ReadRxIntFlag() != 0) { UART0_ClrRxIntFlag(); BATT_FLAG_WAKEUP = WAKEUP_UART; //BATT_FLAG_ON |= 0x02; } } void KEY_Handler(void) { INTC_ClearPendingIRQ(KEY_IRQn); }