/** * @copyright None * @file KeyScan.c * @author Comment Vivre * @date 2024-08-26 * @brief None */ #include #include uint8 SW1_Flag = 0; uint8 SW2_Flag = 0; uint8 SW2_Flag2 = 0; uint8 SW3_Flag = 0; uint8 Flag_Key1Value = 0; //档位变换顺序 uint8 Flag_Key2Value = 0; /* Private variables ----------------------------------------------------------------------------*/ KeyScanParam_TypeDef xdata KS; /* ------------------------------------------------------------------------------------------------- Function Name : void KeyInit(void) Description : 按键参数初始化 Input : 无 Output : 无 -------------------------------------------------------------------------------------------------*/ void KeyInit(void) { uint8 i = 0; uint8 Check_code = 0; //写入数值为Write_Lenght,最后一位为校验位0xFF uint16 ReadInfor_Addr = 0; //读取信息地址 KS.Key1Value = 0x01; KS.Key2Value = 0x40; KS.Key3Value = 0x00; KS.KeyValuetotal = KS.Key1Value ^ KS.Key2Value ^ KS.Key3Value; /*----- 获取写入首地址 -----*/ // FlashData.WriteAddress = GetWrite_Black_Addr(START_WriteADDRESS, Write_Lenght); if (FlashData.WriteAddress > START_WriteADDRESS) { /*----- 获取读取数值首地址 -----*/ FlashData.ReadAddress = FlashData.WriteAddress - Write_Lenght; while ((FlashData.WriteAddress > START_WriteADDRESS) && (Check_code != Verify_Ture)) { ReadInfor_Addr = FlashData.ReadAddress + Verify_Bit; Check_code = *(uint8 code *)(ReadInfor_Addr); if (Check_code == Verify_Ture) { /*----- 读取数值到FlashData.ReadValue -----*/ ReadFromFlash(FlashData.ReadAddress, Write_Lenght, FlashData.ReadValue); KS.KeyValuetotal = FlashData.ReadValue[0]; //有数值直接读回上次保存的数值 } else { FlashData.ReadAddress = FlashData.ReadAddress - Write_Lenght; } } } else { /*----- 获取读取数值首地址 -----*/ FlashData.ReadAddress = FlashData.WriteAddress; } /*Flash写一个扇区 2/3 区域后开始尝试擦写*/ if (FlashData.WriteAddress >= START_WriteADDRESS + 0x060) // { for (i = 0; i < Write_Lenght; i++) { FlashData.WriteValue[i] = FlashData.ReadValue[i]; } FlashData.Flag_FlashErase = 1; } KS.Key1Value = KS.KeyValuetotal & 0x0F; KS.Key2Value = KS.KeyValuetotal & 0x70; KS.Key3Value = 0x00; KS.OldKeyValuetotal = 0; KS.ChangeKeyFlg = 0; KS.Key1PressCnt = 0; KS.TwoCarrierCnt = 0; User.ScrOnZeroFlag = 0; User.ScrOnZeroCnt = 0; } /* ------------------------------------------------------------------------------------------------- Function Name : uint8 KeyValue(void) Description : 功能函数,获取按键值,选择返回键位值还是管脚电平KeyValue Input : 无 Output : 键位值或者管脚电平KeyValue -------------------------------------------------------------------------------------------------*/ int KeyValue(void) { /* SW1 Scan */ if ((KS.KeyADCValue > 10922) && (KS.KeyADCValue < 19000)) { if (SW1_Flag == 0) { KS.Key1PressCnt ++; if (KS.Key1PressCnt >= KeyFilterTime) { KS.Key1PressCnt = KeyFilterTime; SW1_Flag = 1; SW2_Flag = 0; SW3_Flag = 0; if ((KS.Key1Value < 0x08) && (Flag_Key1Value == 0)) { KS.Key1Value = KS.Key1Value << 1; } else if ((KS.Key1Value > 0x01) && (Flag_Key1Value == 1)) { KS.Key1Value = KS.Key1Value >> 1; } else if (KS.Key1Value == 0x08) { Flag_Key1Value = 1; KS.Key1Value = KS.Key1Value >> 1; } else if (KS.Key1Value == 0x01) { Flag_Key1Value = 0; KS.Key1Value = KS.Key1Value << 1; } else { Flag_Key1Value = 0; KS.Key1Value = 0x01; } } } else if (SW1_Flag == 1) { KS.Key1Value = KS.Key1Value ; } else { SW1_Flag = 0; } } /* SW2 Scan */ else if ((KS.KeyADCValue >= 0) && (KS.KeyADCValue < 10922)) { if (SW2_Flag == 0) { KS.Key2PressCnt ++; if (KS.Key2PressCnt >= KeyFilterTime) { KS.Key2PressCnt = KeyFilterTime; SW2_Flag = 1; SW1_Flag = 0; SW3_Flag = 0; if ((KS.Key2Value < 0x40) && (Flag_Key2Value == 0)) { KS.Key2Value = KS.Key2Value << 1; } else if ((KS.Key2Value > 0x10) && (Flag_Key2Value == 1)) { KS.Key2Value = KS.Key2Value >> 1; } else if (KS.Key2Value == 0x40) { Flag_Key2Value = 1; KS.Key2Value = KS.Key2Value >> 1; } else if (KS.Key2Value == 0x10) { Flag_Key2Value = 0; KS.Key2Value = KS.Key2Value << 1; } else { Flag_Key2Value = 0; KS.Key2Value = 0x20; } } } else if (SW2_Flag == 1) { KS.Key2Value = KS.Key2Value ; } else { SW2_Flag = 0; } } /* SW3 Scan */ else if ((KS.KeyADCValue > 19000) && (KS.KeyADCValue < 25000)) { KS.Key3releaseCnt = 0; if (KS.Key3PressCnt < KeyFilterTime * 2 + 10) { KS.Key3PressCnt++; } if (SW3_Flag == 0) { if (KS.Key3PressCnt >= KeyFilterTime * 2) { KS.Key3PressCnt = KeyFilterTime * 2; SW3_Flag = 1; SW1_Flag = 0; SW2_Flag = 0; KS.Key3Value = 0x80; } } else if (SW3_Flag == 1) { KS.Key3Value = KS.Key3Value ; } } else { KS.Key2PressCnt --; KS.Key1PressCnt --; KS.Key3PressCnt = 0; if (KS.Key3releaseCnt < 100) { KS.Key3releaseCnt++; } if ((KS.Key2PressCnt <= 0) && (KS.Key1PressCnt <= 0) && (KS.Key3releaseCnt >= 80)) { SW3_Flag = 0; SW1_Flag = 0; SW2_Flag = 0; } if (KS.Key2PressCnt <= 0) { KS.Key2PressCnt = 1; } if (KS.Key1PressCnt <= 0) { KS.Key1PressCnt = 1; } if (KS.Key3releaseCnt >= 80) { KS.Key3Value = 0x00; } } return (KS.Key1Value ^ KS.Key2Value ^ KS.Key3Value); } /* ------------------------------------------------------------------------------------------------- Function Name : uint8 KeyValue(void) Description : 功能函数,获取按键值,选择返回键位值还是管脚电平KeyValue Input : 无 Output : 键位值或者管脚电平KeyValue -------------------------------------------------------------------------------------------------*/ int KeyValue1(void) { /* SW1 温度 */ if ((KS.KeyADCValue > 14000) && (KS.KeyADCValue < 18000)) { if (SW1_Flag == 0) { KS.Key1PressCnt ++; if (KS.Key1PressCnt >= KeyFilterTime) { KS.Key1PressCnt = KeyFilterTime; SW1_Flag = 1; SW2_Flag = 0; SW3_Flag = 0; SW2_Flag2 = 0; if ((KS.Key1Value < 0x08) && (Flag_Key1Value == 0)) { KS.Key1Value = KS.Key1Value << 1; } else if ((KS.Key1Value > 0x01) && (Flag_Key1Value == 1)) { KS.Key1Value = KS.Key1Value >> 1; } else if (KS.Key1Value == 0x08) { Flag_Key1Value = 1; KS.Key1Value = KS.Key1Value >> 1; } else if (KS.Key1Value == 0x01) { Flag_Key1Value = 0; KS.Key1Value = KS.Key1Value << 1; } else { Flag_Key1Value = 0; KS.Key1Value = 0x01; } } } else if (SW1_Flag == 1) { KS.Key1Value = KS.Key1Value ; } else { SW1_Flag = 0; } } /* SW2 风速2 */ else if ((KS.KeyADCValue > 20000) && (KS.KeyADCValue < 26000)) { if (SW2_Flag == 0) { KS.Key2PressCnt ++; if (KS.Key2PressCnt >= KeyFilterTime) { KS.Key2PressCnt = KeyFilterTime; SW2_Flag = 1; SW1_Flag = 0; SW3_Flag = 0; SW2_Flag2 = 0; KS.Key2Value = 0x20; } } else if (SW2_Flag == 1) { KS.Key2Value = KS.Key2Value ; } else { SW2_Flag = 0; } } else { if (KS.Key2PressCnt > 0) { KS.Key2PressCnt --; } if (KS.Key1PressCnt > 0) { KS.Key1PressCnt --; } KS.Key3PressCnt = 0; if (KS.Key3releaseCnt < 100) { KS.Key3releaseCnt++; } if ((KS.Key2PressCnt <= 0) && (KS.Key1PressCnt <= 0) && (KS.Key3releaseCnt >= 80)) { SW3_Flag = 0; SW1_Flag = 0; SW2_Flag = 0; } if (KS.Key3releaseCnt >= 80) { KS.Key3Value = 0x00; } /* SW2 风速1 */ if (KS.KeyADCValue > 30000) { if (SW2_Flag2 == 0) { KS.Key2PressCnt2++; if (KS.Key2PressCnt2 >= KeyFilterTime) { KS.Key2PressCnt2 = KeyFilterTime; SW2_Flag2 = 1; SW2_Flag = 0; SW1_Flag = 0; SW3_Flag = 0; KS.Key2Value = 0x10; } } else if (SW2_Flag2 == 1) { KS.Key2Value = KS.Key2Value ; } else { SW2_Flag2 = 0; } } } return (KS.Key1Value ^ KS.Key2Value ^ KS.Key3Value); } /* ------------------------------------------------------------------------------------------------- Function Name : void KeyScan(void) Description : 功能函数,按键扫描,按键触发传递出按键命令 Input : 无 Output : 无 -------------------------------------------------------------------------------------------------*/ void KeyScan(void) { KS.OldKeyValuetotal = KS.KeyValuetotal; #if (SwitchMode == HighVoltageSwitch) { KS.KeyValuetotal = KeyValue1(); } #elif (SwitchMode == LowVoltageSwitch) { KS.KeyValuetotal = KeyValue(); } #endif if (KS.OldKeyValuetotal != KS.KeyValuetotal) { if ((mcState == mcRun)) { KS.ChangeKeyFlg = 1; } } }