C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 1 C51 COMPILER V9.60.0.0, COMPILATION OF MODULE TS_API OBJECT MODULE PLACED IN .\hex\ts_api.obj COMPILER INVOKED BY: C:\keil5\C51\BIN\C51.EXE TS_Lib\Sources\ts_api.c OMF2 OPTIMIZE(9,SIZE) BROWSE DEBUG PRINT(.\lst\ts_ -api.lst) TABS(2) OBJECT(.\hex\ts_api.obj) line level source 1 #ifndef _TK_API_C_ 2 #define _TK_API_C_ 3 4 /********************************************************************************************************* -************/ 5 #include "ca51f5_config.h" 6 #include "includes\ca51f5sfr.h" 7 #include "includes\ca51f5xsfr.h" 8 #include "includes\gpiodef_f5.h" 9 10 #include "Library\Includes\tmc.h" 11 #include "Library\Includes\system_clock.h" 12 #include "Library\includes\uart.h" 13 #include "includes\system.h" 14 15 #include "Library\includes\delay.h" 16 #include 17 /********************************************************************************************************* -************/ 18 #include "TS_Lib\Includes\ts_configuration.h" *** WARNING C329 IN LINE 120 OF TS_Lib\Includes\ts_configuration.h: single-line comment contains line-continuation *** WARNING C329 IN LINE 121 OF TS_Lib\Includes\ts_configuration.h: single-line comment contains line-continuation *** WARNING C329 IN LINE 122 OF TS_Lib\Includes\ts_configuration.h: single-line comment contains line-continuation *** WARNING C329 IN LINE 123 OF TS_Lib\Includes\ts_configuration.h: single-line comment contains line-continuation *** WARNING C329 IN LINE 124 OF TS_Lib\Includes\ts_configuration.h: single-line comment contains line-continuation *** WARNING C329 IN LINE 125 OF TS_Lib\Includes\ts_configuration.h: single-line comment contains line-continuation *** WARNING C329 IN LINE 126 OF TS_Lib\Includes\ts_configuration.h: single-line comment contains line-continuation *** WARNING C329 IN LINE 127 OF TS_Lib\Includes\ts_configuration.h: single-line comment contains line-continuation *** WARNING C329 IN LINE 143 OF TS_Lib\Includes\ts_configuration.h: single-line comment contains line-continuation *** WARNING C329 IN LINE 144 OF TS_Lib\Includes\ts_configuration.h: single-line comment contains line-continuation 19 #include "TS_Lib\Includes\ts_def.h" 20 #include "TS_Lib\Includes\ts_api.h" 21 #include "TS_Lib\Includes\ts_service.h" 22 /********************************************************************************************************* -************/ 23 24 #include "rf_send.h" 25 26 void Debug_init(void); 27 void Debug_ParamLoad(void); 28 #if SUPPORT_KEY 29 #if TK_SENSITIVE_AUTO_TRIM_EN void TK_TouchThdTrim(unsigned char ch); #endif 32 code unsigned int TS_KEY_CH_INFO_SEQ[][2]= 33 { 34 KEY_SEQ 35 }; 36 #if TK_SENSITIVE_AUTO_TRIM_EN code unsigned int TK_BASELINE_VALUE_INFO_SEQ[]= { TK_BASELINE_VALUE_SEQ }; #endif C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 2 42 #endif 43 #if SUPPORT_WHEEL_SLIDER 44 code unsigned char TS_WHEEL_SLIDER_CH_SEQ[]= 45 { 46 WHEEL_SLIDER0_SEQ, 47 }; 48 code unsigned char WHEEL_SLIDER0_MAX_MIN_TAB[]={WHEEL_SLIDER0_CH_MIN_RATE}; 49 #else code unsigned char WHEEL_SLIDER0_MAX_MIN_TAB[1]={0}; #endif 52 #if SUPPORT_KEY 53 code TYPE_SN MASK_TAB[]= 54 { 55 0x0001, 56 #if (KEY_CH_COUNT > 1) 57 0x0002, 58 #endif 59 #if (KEY_CH_COUNT > 2) 60 0x0004, 61 #endif 62 #if (KEY_CH_COUNT > 3) 63 0x0008, 64 #endif 65 #if (KEY_CH_COUNT > 4) 66 0x0010, 67 #endif 68 #if (KEY_CH_COUNT > 5) 69 0x0020, 70 #endif 71 #if (KEY_CH_COUNT > 6) 72 0x0040, 73 #endif 74 #if (KEY_CH_COUNT > 7) 75 0x0080, 76 #endif 77 #if (KEY_CH_COUNT > 8) 0x0100, #endif 80 #if (KEY_CH_COUNT > 9) 0x0200, #endif 83 #if (KEY_CH_COUNT > 10) 0x0400, #endif 86 #if (KEY_CH_COUNT > 11) 0x0800, #endif 89 #if (KEY_CH_COUNT > 12) 0x1000, #endif 92 93 }; 94 code unsigned char AREA_CONFIRM_TIME_TAB[]= 95 { 96 FINGER_TOUCH_CONFIRM_TIME, 97 AREA_PNOISE_PLUS_CONFIRM_TIME, 98 AREA_PNOISE_CONFIRM_TIME, 99 AREA_NNOISE_CONFIRM_TIME, 100 AREA_OVERLOW_CONFIRM_TIME, 101 }; 102 #else code unsigned char AREA_CONFIRM_TIME_TAB[1]={0}; C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 3 code unsigned int MASK_TAB[1]={0}; #endif 106 void TS_MS_ISR (void) 107 { 108 1 static unsigned char xdata ms_cnt = 0; 109 1 unsigned char i; 110 1 111 1 ms_cnt++; 112 1 if(ms_cnt >= 4) 113 1 { 114 2 ms_cnt = 0; 115 2 for(i = 0; i < TS_Cnt; i++) 116 2 { 117 3 if(TS_AreaConfirmTimer[i]) 118 3 { 119 4 TS_AreaConfirmTimer[i]--; 120 4 } 121 3 } 122 2 #if SUPPORT_WHEEL_SLIDER 123 2 if(TSWheelSlider_TouchConfirmTimer) 124 2 { 125 3 TSWheelSlider_TouchConfirmTimer--; 126 3 } 127 2 #endif 128 2 #if SUPPORT_KEY 129 2 #if SUPPORT_COVER_PANAL_AFTER_POWERON if(PanalCoverJudgeTimer) PanalCoverJudgeTimer--; #endif 132 2 #endif 133 2 #if SUPPORT_KEY 134 2 #if ANTI_SPEAKER_EN if(RefChDataTimer) RefChDataTimer--; #endif 137 2 #endif 138 2 } 139 1 } 140 void TS_HS_ISR (void) 141 { 142 1 #if SUPPORT_KEY 143 1 #if (FINGER_LONG_TOUCH_TIME_LIMIT > 0) unsigned char i; #endif 146 1 #endif 147 1 TS_HalfSecCnt++; 148 1 149 1 #if SUPPORT_KEY 150 1 #if (FINGER_LONG_TOUCH_TIME_LIMIT > 0) for(i = 0; i < KEY_CH_COUNT; i++) { if(TSKey_LongTouchLimitTimer[i]) { TSKey_LongTouchLimitTimer[i]--; } } #endif 159 1 #endif 160 1 #if SUPPORT_WHEEL_SLIDER 161 1 #if (WHEEL_SLIDER_LONG_TOUCH_TIME_LIMIT > 0) if(TSWheelSlider_LongTouchLimitTimer) { TSWheelSlider_LongTouchLimitTimer--; } C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 4 #endif 167 1 #endif 168 1 if(TS_RefCHBaseLineAdjuTimer) 169 1 { 170 2 TS_RefCHBaseLineAdjuTimer--; 171 2 } 172 1 if(EnterStopScanTimer) 173 1 { 174 2 EnterStopScanTimer--; 175 2 } 176 1 } 177 void TS_ISR (void) 178 { 179 1 unsigned char i; 180 1 WORD_UNION TS_Data[6]; 181 1 #if TK_FREQ_JUMP_EN static unsigned int xdata TSDataTemp[2][OPENED_TS_COUNT+1]; unsigned int xdata delta[2]; unsigned int min_delta; unsigned char min_index; unsigned char j; #endif 188 1 if(TLFLG & (TLERR|TLKOV|TLLOV)) 189 1 { 190 2 TLFLG |= TLERR|TLKOV|TLLOV; 191 2 } 192 1 193 1 if(TKIF & TKIF0) 194 1 { 195 2 TKIF = TKIF0; 196 2 TS_Data[0].bVal[0] = TK0MSH; 197 2 TS_Data[0].bVal[1] = TK0MSL; 198 2 } 199 1 if(TKIF & TKIF1) 200 1 { 201 2 TKIF = TKIF1; 202 2 TS_Data[1].bVal[0] = TK1MSH; 203 2 TS_Data[1].bVal[1] = TK1MSL; 204 2 } 205 1 if(TKIF & TKIF2) 206 1 { 207 2 TKIF = TKIF2; 208 2 TS_Data[2].bVal[0] = TK2MSH; 209 2 TS_Data[2].bVal[1] = TK2MSL; 210 2 } 211 1 if(TKIF & TKIF3) 212 1 { 213 2 TKIF = TKIF3; 214 2 TS_Data[3].bVal[0] = TK3MSH; 215 2 TS_Data[3].bVal[1] = TK3MSL; 216 2 } 217 1 if(TKIF & TKIF4) 218 1 { 219 2 TKIF = TKIF4; 220 2 TS_Data[4].bVal[0] = TK4MSH; 221 2 TS_Data[4].bVal[1] = TK4MSL; 222 2 } 223 1 if(TKIF & TKIF5) 224 1 { 225 2 TKIF = TKIF5; 226 2 TS_Data[5].bVal[0] = TK5MSH; 227 2 TS_Data[5].bVal[1] = TK5MSL; C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 5 228 2 } 229 1 230 1 for(i = 0; i < 6; i++) 231 1 { 232 2 #if TK_FREQ_JUMP_EN if(TS_State == TS_DEAL) { TSDataTemp[NowTKFreqIndex][TS_Index+i] = TS_Data[i].wVal; if(NowTKFreqIndex == 1) { min_delta = 0xFFFF; for(j = 0; j < 2; j++) { if(TSDataTemp[j][TS_Index+i] > TS_JumpFreqData[j][TS_Index+i]/TS_ACQ_TIMES) { delta[j] = TSDataTemp[j][TS_Index+i] - TS_JumpFreqData[j][TS_Index+i]/TS_ACQ_TIMES; } else { delta[j] = TS_JumpFreqData[j][TS_Index+i]/TS_ACQ_TIMES - TSDataTemp[j][TS_Index+i]; } if(delta[j] < min_delta) { min_delta = delta[j]; min_index = j; } } TS_Data[i].wVal = TSDataTemp[min_index][TS_Index+i] + TS_JumpFreqData[1][TS_Index+i]/TS_ACQ_TIMES - TS -_JumpFreqData[min_index][TS_Index+i]/TS_ACQ_TIMES; } } #endif 261 2 #if TK_FREQ_JUMP_EN if(((TS_State == TS_DEAL)&&(NowTKFreqIndex == 1)) ||(TS_State != TS_DEAL)) #endif 264 2 { 265 3 #if (TS_ACQ_TIMES == 1) 266 3 TS_RawData[TS_Index+i] = TS_Data[i].wVal; 267 3 #else TS_DataSum[TS_Index+i] += TS_Data[i].wVal; #endif 270 3 } 271 2 if(TS_Index+i == TS_Cnt) 272 2 { 273 3 break; 274 3 } 275 2 276 2 } 277 1 #if TK_FREQ_JUMP_EN if(TS_State == TS_DEAL) { if(NowTKFreqIndex == 1) { NowTKFreqIndex = 0; TKCFG = TKDIV(TKDIV_VAL2)|TKTMS(TKTMS_VAL); TKCON |= TKST(1); return; } else { C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 6 NowTKFreqIndex = 1; TKCFG = TKDIV(TKDIV_VAL)|TKTMS(TKTMS_VAL); } } #endif 294 1 if(TS_Index+6 > TS_Cnt) 295 1 { 296 2 #if (TS_ACQ_TIMES == 1) 297 2 TS_CycleScanDoneFlag = 1; 298 2 #else TS_Acq_Counter++; if(TS_Acq_Counter >= TS_ACQ_TIMES) { for(i = 0; i < TS_Cnt+1; i++) { TS_RawData[i] = TS_DataSum[i]; TS_DataSum[i] = 0; } TS_CycleScanDoneFlag = 1; TS_Acq_Counter = 0; } #endif 311 2 TS_Index = 0; 312 2 } 313 1 else 314 1 { 315 2 TS_Index += 6; 316 2 } 317 1 TS_ScanStart(); 318 1 if(TS_HalfSecCnt) TS_HalfSecCnt--; 319 1 if(MainLoopCnt1 != MainLoopCnt2) 320 1 { 321 2 MainLoopCnt2 = MainLoopCnt1; 322 2 WDFLG = 0xA5; 323 2 } 324 1 } 325 void TS_DataFiltering(void) 326 { 327 1 unsigned char i; 328 1 #if (FILTER_COUNT > 1) 329 1 unsigned char j; 330 1 unsigned int DataSum,DataMax,DataMin; 331 1 #endif 332 1 for(i = 0; i < TS_Cnt+1; i++) 333 1 { 334 2 #if (FILTER_COUNT == 1) TS_PostData[i] = TS_RawData[i]; #else 337 2 TS_FilterPosIdx[i]++; 338 2 if(TS_FilterPosIdx[i] >= FILTER_COUNT) 339 2 { 340 3 TS_FilterPosIdx[i] = 0; 341 3 } 342 2 INT3EN = 0; 343 2 TS_FilterBuf[i][TS_FilterPosIdx[i]] = TS_RawData[i]; 344 2 INT3EN = 1; 345 2 346 2 DataSum = 0; 347 2 DataMax = 0; 348 2 DataMin = 0xFFFF; 349 2 for(j = 0; j < FILTER_COUNT; j++) 350 2 { C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 7 351 3 DataSum += TS_FilterBuf[i][j]; 352 3 #if (FILTER_COUNT > 2) 353 3 if(TS_FilterBuf[i][j] > DataMax) 354 3 { 355 4 DataMax = TS_FilterBuf[i][j]; 356 4 } 357 3 if(TS_FilterBuf[i][j] < DataMin) 358 3 { 359 4 DataMin = TS_FilterBuf[i][j]; 360 4 } 361 3 #endif 362 3 } 363 2 #if (FILTER_COUNT == 2) TS_PostData[i] = (DataSum)/(FILTER_COUNT); #else 366 2 TS_PostData[i] = (DataSum - DataMax - DataMin)/(FILTER_COUNT-2); 367 2 #endif 368 2 #endif 369 2 } 370 1 } 371 #if SUPPORT_KEY 372 #if ANTI_SPEAKER_EN bit TS_RefChAbnormalJudge(void) { unsigned int ref_value,crt_value,delta; if(RefChDataBufIdx == (REF_CH_DATA_BUF_SIZE-1)) { ref_value = RefChDataBuf[0]; } else { ref_value = RefChDataBuf[RefChDataBufIdx + 1]; } crt_value = TS_PostData[OPENED_TS_COUNT]; if(ref_value > crt_value) { delta = ref_value - crt_value; } else { delta = crt_value - ref_value; } if(delta >= REF_CH_ABNORMAL_THD) { return 1; } else { return 0; } } void TS_RefChCheck(void) { if(!RefChDataTimer) { RefChDataTimer = 3; RefChDataBufIdx++; if(RefChDataBufIdx >= REF_CH_DATA_BUF_SIZE) { RefChDataBufIdx = 0; } C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 8 RefChDataBuf[RefChDataBufIdx] = TS_PostData[OPENED_TS_COUNT]; } } #endif 417 #endif 418 void TS_RunInit(void) 419 { 420 1 unsigned char i,j; 421 1 static unsigned char TS_ScanTimes=0; 422 1 #if (POWER_ON_WAIT_TK_STABLE_EN || TK_FREQ_JUMP_EN) static unsigned char TS_Init_Step_Sub; #endif 425 1 if(TS_Init_Step == 0) 426 1 { 427 2 #if (TS_ACQ_TIMES > 1) for(i = 0; i < TS_Cnt; i++) { TS_DataSum[i] = 0; } TS_Acq_Counter = 0; #endif 434 2 #if TK_FREQ_JUMP_EN NowTKFreqIndex = 0; TKCFG = TKDIV(TKDIV_VAL2)|TKTMS(TKTMS_VAL); TS_Init_Step_Sub = 0; #endif 439 2 TS_CycleScanDoneFlag = 0; 440 2 TS_HalfSecCnt = 0; 441 2 TS_Index = 0; 442 2 TS_ScanStart(); 443 2 #if POWER_ON_WAIT_TK_STABLE_EN TS_Init_Step = 1; TS_Init_Step_Sub = 0; TS_ScanTimes = 5; #else 448 2 TS_Init_Step = 2; 449 2 TS_ScanTimes = 50; 450 2 #endif 451 2 } 452 1 #if POWER_ON_WAIT_TK_STABLE_EN else if(TS_Init_Step == 1) { if(TS_CycleScanDoneFlag) { TS_CycleScanDoneFlag = 0; if(TS_Init_Step_Sub == 0) { if(--TS_ScanTimes) { return; } for(i = 0; i < TS_Cnt+1; i++) { TS_PostData[i] = TS_RawData[i]; } TS_Init_Step_Sub = 1; TS_AreaConfirmTimer[0] = 40; } else if(TS_Init_Step_Sub == 1) { if(!TS_AreaConfirmTimer[0]) { C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 9 int delta; for(i = 0; i < TS_Cnt+1; i++) { delta = (int)TS_PostData[i] - (int)TS_RawData[i]; if((delta > NOISE_THRESHOLD) || (delta < -NOISE_THRESHOLD)) { TS_Init_Step_Sub = 0; return; } } TS_Init_Step = 2; TS_ScanTimes = 10; } } } } #endif 492 1 else if(TS_Init_Step == 2) 493 1 { 494 2 if(TS_CycleScanDoneFlag) 495 2 { 496 3 TS_CycleScanDoneFlag = 0; 497 3 if(--TS_ScanTimes) 498 3 { 499 4 return; 500 4 } 501 3 #if TK_FREQ_JUMP_EN if(TS_Init_Step_Sub == 0) { for(i = 0; i < TS_Cnt+1; i++) { TS_JumpFreqData[0][i] = TS_RawData[i]; } TS_Init_Step_Sub++; NowTKFreqIndex = 1; TKCFG = TKDIV(TKDIV_VAL)|TKTMS(TKTMS_VAL); TS_ScanTimes = 3; return; } #endif 516 3 TS_RefCHBaseLineAdjuTimer = 0; 517 3 for(i = 0; i < TS_Cnt+1; i++) 518 3 { 519 4 for(j = 0; j < FILTER_COUNT; j++) 520 4 { 521 5 TS_FilterBuf[i][j] = TS_RawData[i]; 522 5 } 523 4 TS_FilterPosIdx[i] = 0; 524 4 525 4 #if TK_FREQ_JUMP_EN TS_JumpFreqData[1][i] = TS_RawData[i]; #endif 528 4 529 4 if(i == TS_Cnt) break; 530 4 TS_BaseLineData[i] = TS_RawData[i]; 531 4 TS_FirstAreaData[i] = TS_RawData[i]; 532 4 #if TK_BASE_TRIM_WHILE_KEY_PRESSED RefChDataBak[i] = TS_RawData[OPENED_TS_COUNT]; TS_BaseLineDataBak[i] = TS_BaseLineData[i]; #endif 536 4 #if (SUPPORT_KEY && SUPPORT_WHEEL_SLIDER) C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 10 537 4 if(i < KEY_CH_COUNT) 538 4 { 539 5 #if TK_SENSITIVE_AUTO_TRIM_EN TK_TouchThdTrim(i); #else 542 5 TSKey_FingerThd[i] = TS_KEY_CH_INFO_SEQ[i][1]; 543 5 #endif 544 5 TS_AreaConfirmTimerSet(i,AREA_PNOISE); 545 5 } 546 4 else 547 4 { 548 5 TS_AreaConfirmTimer[i] = WHEEL_SLIDER_BASELINE_UPDATE_TIME; 549 5 } 550 4 #elif SUPPORT_KEY #if TK_SENSITIVE_AUTO_TRIM_EN TK_TouchThdTrim(i); #else TSKey_FingerThd[i] = TS_KEY_CH_INFO_SEQ[i][1]; #endif TS_AreaConfirmTimerSet(i,AREA_PNOISE); #elif SUPPORT_WHEEL_SLIDER TS_AreaConfirmTimer[i] = WHEEL_SLIDER_BASELINE_UPDATE_TIME; #endif 560 4 } 561 3 #if SUPPORT_KEY 562 3 #if ANTI_SPEAKER_EN for(i = 0; i < REF_CH_DATA_BUF_SIZE; i++) { RefChDataBuf[i] = TS_PostData[OPENED_TS_COUNT]; } RefChDataBufIdx = 0; #endif 569 3 #endif 570 3 #if (DEBUG) Debug_ParamLoad(); #endif 573 3 TS_State = TS_DEAL; 574 3 } 575 2 } 576 1 } 577 #if SUPPORT_KEY 578 #if TK_SHARE_LED_EN void TKLED_Set(unsigned char ch,unsigned char mode) { unsigned char real_ch,idx,mask_bit; switch(mode) { case LED_ON: case LED_OFF: real_ch = TS_KEY_CH_INFO_SEQ[ch][0]; idx = real_ch>>3; mask_bit = (real_ch&0x07); if(mode == LED_ON) { if(idx == 0) TLDAT0 |= 1< 0) TSKey_LongTouchLimitTimer[i] = FINGER_LONG_TOUCH_TIME_LIMIT; #endif 721 6 TS_AreaConfirmTimer[i] = FINGER_TOUCH_RELEASE_CONFIRM_TIME; 722 6 } C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 13 723 5 } 724 4 else 725 4 { 726 5 #if SUPPORT_ANTI_WATER_FUNCTION if(i != AntiWaterModeGetMaxDeltaCh()) { goto ANTI_WATER_MODE_KEY_RELEASE; } #endif 732 5 733 5 #if TK_BASE_TRIM_WHILE_KEY_PRESSED TS_BaseLineData[i] = ((unsigned long int)TS_BaseLineDataBak[i]*TS_PostData[OPENED_TS_COUNT])/RefChDat -aBak[i]; #endif 736 5 737 5 TS_AreaConfirmTimer[i] = FINGER_TOUCH_RELEASE_CONFIRM_TIME; 738 5 #if (FINGER_LONG_TOUCH_TIME_LIMIT > 0) if(!TSKey_LongTouchLimitTimer[i]) { PreKeysFlagSN &= ~MASK_TAB[i]; TS_FirstAreaData[i] = TS_PostData[i]; TS_BaseLineData[i] = TS_PostData[i]; #if TK_SENSITIVE_AUTO_TRIM_EN TK_TouchThdTrim(i); #endif TS_AreaConfirmTimerSet(i,AREA_PNOISE); #if SUPPORT_ANTI_WATER_FUNCTION KeyPressedFlag = 0; break; #endif } #endif 754 5 } 755 4 } 756 3 else 757 3 { 758 4 if(PreKeysFlagSN & MASK_TAB[i]) 759 4 { 760 5 if(!TS_AreaConfirmTimer[i]) 761 5 { 762 6 #if SUPPORT_ANTI_WATER_FUNCTION ANTI_WATER_MODE_KEY_RELEASE: KeyPressedFlag = 0; #endif 766 6 PreKeysFlagSN &= ~MASK_TAB[i]; 767 6 768 6 TS_FirstAreaData[i] = TS_BaseLineData[i]; 769 6 TS_AreaConfirmTimerSet(i,AREA_PNOISE); 770 6 #if SUPPORT_ANTI_WATER_FUNCTION break; #endif 773 6 } 774 5 } 775 4 else 776 4 { 777 5 TS_FirstAreaData[i] = TS_PostData[i]; 778 5 TS_AreaConfirmTimerSet(i,NowArea); 779 5 } 780 4 } 781 3 continue; 782 3 } 783 2 else C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 14 784 2 { 785 3 if(NowArea == AREA_FINGER_TOUCH) 786 3 { 787 4 TS_FirstAreaData[i] = TS_PostData[i]; 788 4 TS_AreaConfirmTimerSet(i,AREA_FINGER_TOUCH); 789 4 continue; 790 4 } 791 3 } 792 2 if(PreKeysFlagSN != 0) 793 2 { 794 3 TS_FirstAreaData[i] = TS_BaseLineData[i]; 795 3 TS_AreaConfirmTimerSet(i,AREA_PNOISE); 796 3 continue; 797 3 } 798 2 if(TS_AreaDeviateDetection(TS_FirstAreaData[i],TS_PostData[i],NOISE_THRESHOLD)) //ÅÐ¶ÏÆ«²îÊÇ·ñÔÚÔÊÐí· -¶Î§ÄÚ 799 2 { 800 3 if(!TS_AreaConfirmTimer[i]) 801 3 { 802 4 TS_FirstAreaData[i] = TS_PostData[i]; 803 4 TS_BaseLineData[i] = TS_PostData[i]; 804 4 805 4 #if TK_SENSITIVE_AUTO_TRIM_EN TK_TouchThdTrim(i); #endif 808 4 809 4 #if TK_BASE_TRIM_WHILE_KEY_PRESSED RefChDataBak[i] = TS_PostData[OPENED_TS_COUNT]; TS_BaseLineDataBak[i] = TS_BaseLineData[i]; #endif 813 4 TS_AreaConfirmTimerSet(i,AREA_PNOISE); 814 4 } 815 3 } 816 2 else 817 2 { 818 3 TS_FirstAreaData[i] = TS_PostData[i]; 819 3 TS_AreaConfirmTimerSet(i,NowArea); 820 3 } 821 2 } 822 1 #if SUPPORT_ANTI_WATER_FUNCTION if(KeysFlagSN == 0) { if(PreKeysFlagSN != 0) { PressedKeyIndex = AntiWaterModeGetMaxDeltaCh(); PreKeysFlagSN = MASK_TAB[PressedKeyIndex]; #if (FINGER_LONG_TOUCH_TIME_LIMIT > 0) TSKey_LongTouchLimitTimer[PressedKeyIndex] = FINGER_LONG_TOUCH_TIME_LIMIT; #endif TS_AreaConfirmTimer[PressedKeyIndex] = FINGER_TOUCH_RELEASE_CONFIRM_TIME; KeyPressedFlag = 1; } } #endif 837 1 #if SUPPORT_COVER_PANAL_AFTER_POWERON if(!PanalCoverJudgeFlag) { if(PreKeysFlagSN != 0) { if(KeysFlagSN == 0) { PanalCoverJudgeFlag = 1; C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 15 PanalCoverJudgeTimer = PANAL_COVER_JUDGE_TIME; } else { if((PanalToggleCount >= JUDGE_TK_NUM)||(TS_RefChAbnormalJudge())) { PreKeysFlagSN = 0; PanalCoverJudgeFlag = 0; TS_BaseLineForceUpdate(); } KeysFlagSN = PreKeysFlagSN; } } else { KeysFlagSN = PreKeysFlagSN; } } else { if(!PanalCoverJudgeTimer) { PanalCoverJudgeFlag = 0; KeysFlagSN = PreKeysFlagSN; } else { if((PanalToggleCount >= JUDGE_TK_NUM)||(TS_RefChAbnormalJudge())) { PreKeysFlagSN = 0; PanalCoverJudgeFlag = 0; TS_BaseLineForceUpdate(); } } } #else 881 1 #if ANTI_SPEAKER_EN if((PreKeysFlagSN != 0)&&(KeysFlagSN == 0)) { if(TS_RefChAbnormalJudge()) { PreKeysFlagSN = 0; #if SUPPORT_ANTI_WATER_FUNCTION KeyPressedFlag = 0; #endif TS_BaseLineForceUpdate(); } } #endif 895 1 KeysFlagSN = PreKeysFlagSN; 896 1 897 1 #endif 898 1 if(KeysFlagSN != 0) 899 1 { 900 2 ActiveTouchType = 1; 901 2 } 902 1 else 903 1 { 904 2 ActiveTouchType = 0; 905 2 } 906 1 } C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 16 907 #endif 908 #if SUPPORT_WHEEL_SLIDER 909 void TS_WheelSliderDeal(void) 910 { 911 1 unsigned char i; 912 1 unsigned int Delta,Position; 913 1 bit WheelSliderTogFlag = 0; 914 1 TS_BaseCh = KEY_CH_COUNT; 915 1 if(!W_S_RefChSet) 916 1 { 917 2 W_S_RefChSet = 1; 918 2 SetWheelSliderRefCh(WHEEL_SLIDER0_CH_COUNT); 919 2 } 920 1 921 1 #if PRINT_WHEEL_SLIDER_DATA_EN TK_Debug_UartPutChar('s'); TK_Debug_UartPutChar('l'); TK_Debug_UartPutChar('i'); TK_Debug_UartPutChar('d'); TK_Debug_UartPutChar('e'); TK_Debug_UartPutChar('r'); TK_Debug_UartPutChar(' '); TK_Debug_UartPutChar('d'); TK_Debug_UartPutChar('a'); TK_Debug_UartPutChar('t'); TK_Debug_UartPutChar('a'); TK_Debug_UartPutChar(':'); TK_Debug_UartPutChar(0xaa); for(i = TS_BaseCh; i < TS_BaseCh + WHEEL_SLIDER0_CH_COUNT; i++) { if(TS_BaseLineData[i] > TS_PostData[i]) { Delta = (int)TS_BaseLineData[i] - (int)TS_PostData[i]; } else { Delta = 0; } TK_Debug_UartPutChar(30+i); TK_Debug_UartPutChar(30+TS_PostData[i]>>8); TK_Debug_UartPutChar(30+TS_PostData[i]); TK_Debug_UartPutChar(30+TS_BaseLineData[i]>>8); TK_Debug_UartPutChar(30+TS_BaseLineData[i]); TK_Debug_UartPutChar(30+Delta>>8); TK_Debug_UartPutChar(30+Delta); } #endif 954 1 #if (WHEEL_OR_SLIDER_DEF0 == SLIDER) Position = SliderTouchJudge(WHEEL_SLIDER0_CH_COUNT,WHEEL_SLIDER0_TOUCH_THD); #elif (WHEEL_OR_SLIDER_DEF0 == WHEEL) 957 1 Position = WheelTouchJudge(WHEEL_SLIDER0_CH_COUNT,WHEEL_SLIDER0_TOUCH_THD); 958 1 #endif 959 1 if(Position != -1) 960 1 { 961 2 TS_StableFlag = 0; 962 2 } 963 1 if(WheelSliderState == WHEEL_SLIDER_NO_TOUCH) 964 1 { 965 2 if(!WheelSliderTouchFlag) 966 2 { 967 3 if(Position != -1) 968 3 { C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 17 969 4 WheelSliderTouchFlag = 1; 970 4 TSWheelSlider_TouchConfirmTimer = WHEEL_SLIDER_TOUCH_CONFIRM_TIME; 971 4 } 972 3 else 973 3 { 974 4 for(i = TS_BaseCh; i < TS_BaseCh + WHEEL_SLIDER0_CH_COUNT; i++) 975 4 { 976 5 if(TS_FirstAreaData[i] > TS_PostData[i]) 977 5 { 978 6 Delta = TS_FirstAreaData[i] - TS_PostData[i]; 979 6 } 980 5 else 981 5 { 982 6 Delta = TS_PostData[i] - TS_FirstAreaData[i]; 983 6 } 984 5 if(Delta <= WHEEL_SLIDER0_NOISE_THD) 985 5 { 986 6 if(!TS_AreaConfirmTimer[i]) 987 6 { 988 7 TS_FirstAreaData[i] = TS_PostData[i]; 989 7 TS_BaseLineData[i] = TS_PostData[i]; 990 7 TS_AreaConfirmTimer[i] = WHEEL_SLIDER_BASELINE_UPDATE_TIME; 991 7 } 992 6 } 993 5 else 994 5 { 995 6 TS_FirstAreaData[i] = TS_PostData[i]; 996 6 TS_AreaConfirmTimer[i] = WHEEL_SLIDER_BASELINE_UPDATE_TIME; 997 6 } 998 5 } 999 4 } 1000 3 } 1001 2 else 1002 2 { 1003 3 if(Position != -1) 1004 3 { 1005 4 if(!TSWheelSlider_TouchConfirmTimer) 1006 4 { 1007 5 WheelSliderState = WHEEL_SLIDER_TOUCH; 1008 5 #if (WHEEL_SLIDER_LONG_TOUCH_TIME_LIMIT > 0) TSWheelSlider_LongTouchLimitTimer = WHEEL_SLIDER_LONG_TOUCH_TIME_LIMIT; #endif 1011 5 } 1012 4 } 1013 3 else 1014 3 { 1015 4 WheelSliderTouchFlag = 0; 1016 4 for(i = TS_BaseCh; i < TS_BaseCh + WHEEL_SLIDER0_CH_COUNT; i++) 1017 4 { 1018 5 TS_AreaConfirmTimer[i] = WHEEL_SLIDER_BASELINE_UPDATE_TIME; 1019 5 } 1020 4 } 1021 3 } 1022 2 } 1023 1 else if(WheelSliderState == WHEEL_SLIDER_TOUCH) 1024 1 { 1025 2 #if (WHEEL_SLIDER_LONG_TOUCH_TIME_LIMIT > 0) if(!TSWheelSlider_LongTouchLimitTimer) { for(i = TS_BaseCh; i < TS_BaseCh + WHEEL_SLIDER0_CH_COUNT; i++) { TS_FirstAreaData[i] = TS_PostData[i]; C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 18 TS_BaseLineData[i] = TS_PostData[i]; } WheelSliderTouchFlag = 0; goto WHEEL_SLIDER_RELEASE; } #endif 1037 2 if(WheelSliderTouchFlag) 1038 2 { 1039 3 if(Position == -1) 1040 3 { 1041 4 WheelSliderTouchFlag = 0; 1042 4 TSWheelSlider_TouchConfirmTimer = WHEEL_SLIDER_TOUCH_RELEASE_CONFIRM_TIME; 1043 4 } 1044 3 } 1045 2 else 1046 2 { 1047 3 if(Position == -1) 1048 3 { 1049 4 if(!TSWheelSlider_TouchConfirmTimer) 1050 4 { 1051 5 //WHEEL_SLIDER_RELEASE: 1052 5 WheelSliderState = WHEEL_SLIDER_NO_TOUCH; 1053 5 WheelSliderCapRateFilter = 0; 1054 5 WheelSliderPosition = -1; 1055 5 for(i = TS_BaseCh; i < TS_BaseCh + WHEEL_SLIDER0_CH_COUNT; i++) 1056 5 { 1057 6 TS_AreaConfirmTimer[i] = WHEEL_SLIDER_BASELINE_UPDATE_TIME; 1058 6 } 1059 5 } 1060 4 } 1061 3 else 1062 3 { 1063 4 WheelSliderTouchFlag = 1; 1064 4 } 1065 3 } 1066 2 } 1067 1 if(WheelSliderState == WHEEL_SLIDER_TOUCH) 1068 1 { 1069 2 if(Position != -1) 1070 2 { 1071 3 WheelSliderPosition = Position; 1072 3 } 1073 2 #if PRINT_WHEEL_SLIDER_POSITION_EN TK_Debug_UartPutChar('s'); TK_Debug_UartPutChar('l'); TK_Debug_UartPutChar('i'); TK_Debug_UartPutChar('d'); TK_Debug_UartPutChar('e'); TK_Debug_UartPutChar('r'); TK_Debug_UartPutChar(' '); TK_Debug_UartPutChar('p'); TK_Debug_UartPutChar('o'); TK_Debug_UartPutChar('s'); TK_Debug_UartPutChar('i'); TK_Debug_UartPutChar(':'); TK_Debug_UartPutChar(WheelSliderPosition/100+0x30); TK_Debug_UartPutChar((WheelSliderPosition%100)/10+0x30); TK_Debug_UartPutChar((WheelSliderPosition%10)+0x30); TK_Debug_UartPutChar('\r'); TK_Debug_UartPutChar('\n'); #endif C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 19 1093 2 #if PRINT_WHEEL_SLIDER_RATE_EN { unsigned char DeltaRate; DeltaRate = WheelSliderCapRateFilter/4; TK_Debug_UartPutChar(WheelSliderMaxIdx + 0x30); TK_Debug_UartPutChar(' '); TK_Debug_UartPutChar(DeltaRate/100+0x30); TK_Debug_UartPutChar((DeltaRate%100)/10+0x30); TK_Debug_UartPutChar((DeltaRate%10)+0x30); TK_Debug_UartPutChar('\r'); TK_Debug_UartPutChar('\n'); } #endif 1107 2 } 1108 1 else 1109 1 { 1110 2 WheelSliderPosition = -1; 1111 2 } 1112 1 1113 1 if(WheelSliderPosition != -1) 1114 1 { 1115 2 ActiveTouchType = 2; 1116 2 } 1117 1 else 1118 1 { 1119 2 ActiveTouchType = 0; 1120 2 } 1121 1 } 1122 #endif 1123 1124 void TS_init(void) 1125 { 1126 1 unsigned char i,ch_idx; 1127 1 #if (DEBUG) Debug_init(); #endif 1130 1 1131 1 TS_Cnt = OPENED_TS_COUNT; 1132 1 ch_idx = 0; 1133 1 for(i = 0;i < OPENED_TS_COUNT; i++) 1134 1 { 1135 2 #if (SUPPORT_KEY && SUPPORT_WHEEL_SLIDER) 1136 2 if(i < KEY_CH_COUNT) 1137 2 { 1138 3 TS_CH[ch_idx++] = TS_KEY_CH_INFO_SEQ[i][0]; 1139 3 } 1140 2 else 1141 2 { 1142 3 TS_CH[ch_idx++] = TS_WHEEL_SLIDER_CH_SEQ[i-KEY_CH_COUNT]; 1143 3 } 1144 2 #elif SUPPORT_KEY TS_CH[ch_idx++] = TS_KEY_CH_INFO_SEQ[i][0]; #elif SUPPORT_WHEEL_SLIDER TS_CH[ch_idx++] = TS_WHEEL_SLIDER_CH_SEQ[i]; #endif 1149 2 } 1150 1 CKCON |= ILCKE; 1151 1 TMCON = TME(1); 1152 1 TMSNU = 0; 1153 1 INT3EN =1; 1154 1 C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 20 1155 1 TS_IO_init(); 1156 1 1157 1 1158 1 TKCFG = TKDIV(TKDIV_VAL)|TKTMS(TKTMS_VAL); 1159 1 #if (TK_CHARGE_REF_SELECT == SOURCE_VDD) TKCON = TKST(0)|TKIE(1)|TMEN(0)|TWKE(0)|VRS(VRS_VAL); TKPWC = TKPC(TK_PC_VAL)|VDS(0)|VIRS(0)|TKPWS(0)|TKCVS(0); #elif (TK_CHARGE_REF_SELECT == SOURCE_INNER) 1163 1 TKCON = TKST(0)|TKIE(1)|TMEN(0)|TWKE(0)|VRS(0); 1164 1 TKPWC = TKPC(TK_PC_VAL)|VDS(VDS_VAL)|VIRS(VIRS_VAL)|TKPWS(1)|TKCVS(1); 1165 1 #endif 1166 1 1167 1 #if SUPPORT_KEY 1168 1 #if TK_SHARE_LED_EN TLEN0 = 0xFF; TLDAT0 = 0x00; TLEN1 = 0x1F; TLDAT1 = 0x00; TLCON = TLEIE(0)|TLKIE(0)|TLLIE(0)|TLLVS(0)|TLPOL(0); TLCKS = TLCKS(2); TLCNTKH = 0x00; TLCNTKL = 0x20; TLCNTLH = LED_DRV_CNT/256; TLCNTLL = LED_DRV_CNT%256; TLDIV = 0; TLCOMS = 0x01; P01F = 6; P01C &= (1<<5); #endif 1188 1 #endif 1189 1 INT3EN = 1; 1190 1 1191 1 TS_CycleScanDoneFlag = 0; 1192 1 #if SUPPORT_KEY 1193 1 KeysFlagSN = 0; 1194 1 PreKeysFlagSN = 0; 1195 1 #endif 1196 1 ActiveTouchType = 0; 1197 1 #if SUPPORT_KEY 1198 1 #if SUPPORT_COVER_PANAL_AFTER_POWERON PanalCoverJudgeFlag = 0; #endif 1201 1 #endif 1202 1 #if SUPPORT_TOUCH_SLEEP_MODE 1203 1 EnterStopScanTimer = ENTER_STOP_MODE_TIME; 1204 1 TS_SleepEn = 1; 1205 1 TS_SleepMode = 0; 1206 1 #endif 1207 1 #if SUPPORT_WHEEL_SLIDER 1208 1 W_S_RefChSet = 0; 1209 1 1210 1 WheelSliderState = WHEEL_SLIDER_NO_TOUCH; 1211 1 WheelSliderTouchFlag = 0; 1212 1 WheelSliderPosition = -1; 1213 1 WheelSliderCapRateFilter = 0; 1214 1 #endif 1215 1 TS_State = TS_INIT; 1216 1 TS_Init_Step = 0; C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 21 1217 1 1218 1 #if SUPPORT_KEY 1219 1 #if ANTI_SPEAKER_EN RefChDataTimer = 0; #endif 1222 1 #endif 1223 1 1224 1 MainLoopCnt1 = MainLoopCnt2 = 0; 1225 1 #if SUPPORT_KEY 1226 1 #if GENERATE_TS_KEY_EN TK_State = TK_STATE_RELEASE; TS_Key = 0; #endif 1230 1 #endif 1231 1 } 1232 1233 extern unsigned char flagSend; 1234 void TS_Action(void) 1235 { 1236 1 switch(TS_State) 1237 1 { 1238 2 case TS_INIT: 1239 2 TS_RunInit(); 1240 2 break; 1241 2 case TS_DEAL: 1242 2 if(TS_CycleScanDoneFlag) 1243 2 { 1244 3 TS_CycleScanDoneFlag = 0; 1245 3 1246 3 MainLoopCnt1 = MainLoopCnt2 + 1; 1247 3 1248 3 #if SUPPORT_KEY 1249 3 #if ANTI_SPEAKER_EN TS_RefChCheck(); #endif 1252 3 #endif 1253 3 TS_DataFiltering(); 1254 3 TS_StableFlag = 1; 1255 3 1256 3 // if(flagSend &&(RF_Time>5)) 1257 3 // { 1258 3 // flagSend = 0; 1259 3 // RF_Time=0; 1260 3 // EA = 0; 1261 3 // RF_send(15); 1262 3 // EA = 1; 1263 3 // } 1264 3 1265 3 1266 3 #if SUPPORT_KEY 1267 3 if(ActiveTouchType != 2) 1268 3 { 1269 4 TSKey_DataDeal(); 1270 4 } 1271 3 #endif 1272 3 #if (DEBUG) Debug_ParamLoad(); #endif 1275 3 #if SUPPORT_WHEEL_SLIDER 1276 3 if(ActiveTouchType != 1) 1277 3 { 1278 4 TS_WheelSliderDeal(); C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 22 1279 4 } 1280 3 #endif 1281 3 #if SUPPORT_TOUCH_SLEEP_MODE 1282 3 if(!TS_StableFlag || !TS_SleepEn || (PCON & BIT2)) // ÔÚ·ÂÕæÄ£Ê½²»½øÈëSTOPģʽ 1283 3 { 1284 4 EnterStopScanTimer = ENTER_STOP_MODE_TIME; 1285 4 } 1286 3 if(!EnterStopScanTimer&&TS_SleepEn) 1287 3 { 1288 4 #if ENTER_SLEEP_PRINT_EN 1289 4 TK_Debug_UartPutChar('s'); 1290 4 TK_Debug_UartPutChar('l'); 1291 4 TK_Debug_UartPutChar('e'); 1292 4 TK_Debug_UartPutChar('e'); 1293 4 TK_Debug_UartPutChar('p'); 1294 4 TK_Debug_UartPutChar('\r'); 1295 4 TK_Debug_UartPutChar('\n'); 1296 4 Delay_ms(1); 1297 4 #endif 1298 4 TS_EnterSleepMode(); 1299 4 #if ENTER_SLEEP_PRINT_EN 1300 4 TK_Debug_UartPutChar('e'); 1301 4 TK_Debug_UartPutChar('x'); 1302 4 TK_Debug_UartPutChar('i'); 1303 4 TK_Debug_UartPutChar('t'); 1304 4 TK_Debug_UartPutChar('\r'); 1305 4 TK_Debug_UartPutChar('\n'); 1306 4 #endif 1307 4 } 1308 3 #endif 1309 3 } 1310 2 if(TS_HalfSecCnt >= 5) 1311 2 { 1312 3 TKCON = 0; 1313 3 TKIF = 0x3F; 1314 3 TS_init(); 1315 3 } 1316 2 break; 1317 2 default: 1318 2 break; 1319 2 } 1320 1 #if SUPPORT_KEY 1321 1 #if TK_SHARE_LED_EN TKLED_Update(); #endif 1324 1 #if GENERATE_TS_KEY_EN TS_GetKey(); #endif 1327 1 #endif 1328 1 } 1329 #if SUPPORT_TOUCH_SLEEP_MODE 1330 void TS_SetChannel(unsigned char index,unsigned char ch); 1331 void TS_SleepScanStart(void) 1332 { 1333 1 unsigned char i; 1334 1 for(i = 0; i < 6; i++) 1335 1 { 1336 2 if(TS_Index + i < TS_Cnt) 1337 2 { 1338 3 TS_SetChannel(i,(TS_CH[TS_Index+i])+1); 1339 3 } 1340 2 else C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 23 1341 2 { 1342 3 TS_SetChannel(i,0); 1343 3 } 1344 2 } 1345 1 TKCON |= TKST(1); 1346 1 } 1347 void TS_EnterSleepMode(void) 1348 { 1349 1 //Ê¡µçģʽ²ÎÊýÅäÖà 1350 1 #define STOP_TKDIV_VAL 0 1351 1 #define STOP_TKTMS_VAL 15 //·Åµçʱ¼ä 1352 1 #define STOP_VRS_VAL 7 //±È½ÏÆ÷ãÐÖµ 1353 1 unsigned char TS_SampleComplete = 0,i; 1354 1 unsigned int xdata WakeUp_PThdVal[OPENED_TS_COUNT]; 1355 1 unsigned int xdata WakeUp_NThdVal[OPENED_TS_COUNT]; 1356 1 WORD_UNION TS_Data; 1357 1 1358 1 TKCON = 0; 1359 1 TKIF = 0x3F; 1360 1 1361 1 TS_SleepMode = 1; 1362 1 #if SUPPORT_KEY 1363 1 #if TK_SHARE_LED_EN TLEN0 = 0x00; TLDAT0 = 0x00; TLEN1 = 0x00; TLDAT1 = 0x00; P01F = HIGH_Z|PU_EN; P01C &= (1<<5); //Ñ¡ÔñÈõÉÏÀ­ #endif 1371 1 #endif 1372 1 TMCON &= ~TME(1); 1373 1 TMCON |= TMF; 1374 1 1375 1 TKCON = (TKCON&0xF8) | VRS(STOP_VRS_VAL); 1376 1 TKCON &= ~TKIE(1); 1377 1 TKCFG = TKDIV(STOP_TKDIV_VAL)|TKTMS(STOP_TKTMS_VAL); 1378 1 1379 1 #if (OPENED_TS_COUNT%6 == 0) 1380 1 TKMTS = (SLEEP_MODE_SCAN_INTERVAL_TIME*6)/(OPENED_TS_COUNT); 1381 1 #else TKMTS = (SLEEP_MODE_SCAN_INTERVAL_TIME)/((OPENED_TS_COUNT/6)+1); #endif 1384 1 1385 1 TKPWC = TKPC(1)|VDS(0)|VIRS(0)|TKPWS(0)|TKCVS(0); //Ê¡µçÉèΪVDD³äµç 1386 1 1387 1 #ifdef LVD_RST_ENABLE 1388 1 LVDCON = 0; 1389 1 #endif 1390 1 I2CCON = 0; 1391 1 CKCON = 0; 1392 1 1393 1 MECON |= BIT6; 1394 1 PWCON = (PWCON&0xF0)|0x07; 1395 1 1396 1 TS_Index = 0; 1397 1 TS_SleepScanStart(); 1398 1 WDFLG = 0xA5; 1399 1 1400 1 TMCON = TME(1); 1401 1 TMSNU = 127; 1402 1 C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 24 1403 1 while(1) 1404 1 { 1405 2 if(TS_SampleComplete) 1406 2 { 1407 3 CKCON &= ~IHCKE; 1408 3 CKCON = (CKCON&0xFE) | CKSEL_IRCL; 1409 3 EA = 0; 1410 3 PCON |= (1<<1); 1411 3 _nop_(); 1412 3 _nop_(); 1413 3 _nop_(); 1414 3 CKCON |= IHCKE; 1415 3 CKCON = (CKCON&0xFE) | CKSEL_IRCH; 1416 3 EA = 1; 1417 3 } 1418 2 if(TS_HalfSecCnt >= 5) 1419 2 { 1420 3 break; 1421 3 } 1422 2 if(TKIF != 0) 1423 2 { 1424 3 if(TS_HalfSecCnt) TS_HalfSecCnt--; 1425 3 for(i = 0; i < 6; i++) 1426 3 { 1427 4 if(TKIF & (1<= WakeUp_NThdVal[TS_Index+i])) 1468 6 { 1469 7 goto SLEEP_EXIT; 1470 7 } 1471 6 } 1472 5 } 1473 4 } 1474 3 if(TS_Index+6 < TS_Cnt) 1475 3 { 1476 4 TS_Index += 6; 1477 4 } 1478 3 else 1479 3 { 1480 4 TS_Index = 0; 1481 4 if(TS_SampleComplete == 0) 1482 4 { 1483 5 TS_SampleComplete = 1; 1484 5 TKCON |= TMEN(1); 1485 5 } 1486 4 } 1487 3 TS_SleepScanStart(); 1488 3 WDFLG = 0xA5; 1489 3 } 1490 2 } 1491 1 SLEEP_EXIT: 1492 1 TKCON = 0; 1493 1 TKIF = 0x3F; 1494 1 PWCON = (PWCON&0xF0)|0x0D; 1495 1 1496 1 TKCFG = TKDIV(TKDIV_VAL)|TKTMS(TKTMS_VAL); 1497 1 #if (TK_CHARGE_REF_SELECT == SOURCE_VDD) TKCON = TKST(0)|TKIE(1)|TMEN(0)|TWKE(0)|VRS(VRS_VAL); TKPWC = TKPC(TK_PC_VAL)|VDS(0)|VIRS(0)|TKPWS(0)|TKCVS(0); #elif (TK_CHARGE_REF_SELECT == SOURCE_INNER) 1501 1 TKCON = TKST(0)|TKIE(1)|TMEN(0)|TWKE(0)|VRS(0); 1502 1 TKPWC = TKPC(TK_PC_VAL)|VDS(VDS_VAL)|VIRS(VIRS_VAL)|TKPWS(1)|TKCVS(1); 1503 1 #endif 1504 1 #if SUPPORT_KEY 1505 1 #if TK_SHARE_LED_EN TLEN0 = 0xFF; TLEN1 = 0x1F; P01F = 6; #endif 1510 1 #endif 1511 1 CKCON |= ILCKE; 1512 1 TMCON &= ~TME(1); 1513 1 TMCON |= TMF; 1514 1 Delay_50us(1); 1515 1 TMCON = TME(1); 1516 1 TMSNU = 0; 1517 1 TS_Index = 0; 1518 1 TS_ScanStart(); 1519 1 EnterStopScanTimer = ENTER_STOP_MODE_TIME; 1520 1 TS_SleepMode = 0; 1521 1 #ifdef LVD_RST_ENABLE 1522 1 LVDCON = 0xE3; //ÉèÖÃLVD¸´Î»µçѹΪ2V 1523 1 #endif 1524 1 } 1525 #endif 1526 /********************************************************************************************************* C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 26 -************/ 1527 #if SUPPORT_KEY 1528 #if GENERATE_TS_KEY_EN #if GENERATE_DOUBLE_KEY_EN typedef struct { unsigned char TogKeyNum; unsigned char TogKeyList[2]; } T_TogKeyInfo; #endif code unsigned char TS_KEY_TAB[]= { K1,K2,K3,K4,K5,K6,K7,K8,K9,K10,K11,K12,K13 }; #if GENERATE_DOUBLE_KEY_EN void TS_GetTogKeyInfor(T_TogKeyInfo *pKeyInfo) { unsigned char i,index; pKeyInfo->TogKeyNum = 0; index = 0; for(i = 0; i < KEY_CH_COUNT; i++) { if(KeysFlagSN & MASK_TAB[i]) { pKeyInfo->TogKeyNum++; if(pKeyInfo->TogKeyNum <= 2) { pKeyInfo->TogKeyList[index++] = TS_KEY_TAB[i]; } } } } #endif #if PRINT_TS_KEY_EN void Hex2CharPrint(unsigned int integar) { unsigned char CharBuf[4]; unsigned char i, temp; for(i = 0; i < 4; i++) { temp = (unsigned char)(integar&0x0F); if(temp >= 0x0A) { CharBuf[i] = (temp - 0x0A) + 'A'; } else { CharBuf[i] = temp + '0'; } integar >>= 4; } TK_Debug_UartPutChar('0'); TK_Debug_UartPutChar('x'); TK_Debug_UartPutChar(CharBuf[2]); TK_Debug_UartPutChar(CharBuf[1]); TK_Debug_UartPutChar(CharBuf[0]); } #endif void TS_GetKey(void) { C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 27 static unsigned int KeyBak; static bit LongFlag; #if GENERATE_DOUBLE_KEY_EN T_TogKeyInfo KeyInfo; TS_GetTogKeyInfor(&KeyInfo); #else static unsigned char KeyidxBak; unsigned char i; #endif TS_Key = 0; if(TK_State == TK_STATE_RELEASE) { #if GENERATE_DOUBLE_KEY_EN if(KeyInfo.TogKeyNum != 0) { if(KeyInfo.TogKeyNum == 1) { KeyBak = (unsigned int)KeyInfo.TogKeyList[0]; TK_State = TK_STATE_SINGLE_KEY_PRESS; } else if(KeyInfo.TogKeyNum == 2) { KeyBak = ((unsigned int)KeyInfo.TogKeyList[0]<<5)|(unsigned int)KeyInfo.TogKeyList[1]; TK_State = TK_STATE_DOUBLE_KEY_PRESS; } TS_Key = KeyBak; LongFlag = 0; TS_LongKeyTimer = TS_LONG_START_TIME; } #else if(KeysFlagSN != 0) { for(i = 0; i < KEY_CH_COUNT; i++) { if(KeysFlagSN & MASK_TAB[i]) { KeyidxBak = i; KeyBak = TS_KEY_TAB[i]; break; } } TS_Key = KeyBak; LongFlag = 0; TS_LongKeyTimer = TS_LONG_START_TIME; TK_State = TK_STATE_SINGLE_KEY_PRESS; } #endif } else if(TK_State == TK_STATE_SINGLE_KEY_PRESS) { #if GENERATE_DOUBLE_KEY_EN if(KeyInfo.TogKeyNum == 1) { if(KeyBak == (unsigned int)KeyInfo.TogKeyList[0]) { if(!TS_LongKeyTimer) { if(!LongFlag) { LongFlag = 1; TS_Key = KeyBak | KEY_LONG_START; } C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 28 else { TS_Key = KeyBak | KEY_LONG; } TS_LongKeyTimer = TS_LONG_TIME; } } else { if(!LongFlag) { TS_Key = KeyBak | KEY_BREAK; } else { TS_Key = KeyBak | KEY_LONG_BREAK; } TK_State = TK_STATE_RELEASE; } } else if(KeyInfo.TogKeyNum == 2) { KeyBak = ((unsigned int)KeyInfo.TogKeyList[0]<<5) | (unsigned int)KeyInfo.TogKeyList[1]; TK_State = TK_STATE_DOUBLE_KEY_PRESS; TS_Key = KeyBak; LongFlag = 0; TS_LongKeyTimer = TS_LONG_START_TIME; } else if(KeyInfo.TogKeyNum == 0) { if(!LongFlag) { TS_Key = KeyBak | KEY_BREAK; } else { TS_Key = KeyBak | KEY_LONG_BREAK; } TK_State = TK_STATE_RELEASE; } #else if(KeysFlagSN & MASK_TAB[KeyidxBak]) { if(!TS_LongKeyTimer) { if(!LongFlag) { LongFlag = 1; TS_Key = KeyBak | KEY_LONG_START; } else { TS_Key = KeyBak | KEY_LONG; } TS_LongKeyTimer = TS_LONG_TIME; } } else { if(!LongFlag) { TS_Key = KeyBak | KEY_BREAK; C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 29 } else { TS_Key = KeyBak | KEY_LONG_BREAK; } TK_State = TK_STATE_RELEASE; } #endif } #if GENERATE_DOUBLE_KEY_EN else if(TK_State == TK_STATE_DOUBLE_KEY_PRESS) { if(KeyInfo.TogKeyNum == 2) { if(KeyBak == ((unsigned int)KeyInfo.TogKeyList[0]<<5)|(unsigned int)KeyInfo.TogKeyList[1]) { if(!TS_LongKeyTimer) { if(!LongFlag) { LongFlag = 1; TS_Key = KeyBak | KEY_LONG_START; } else { TS_Key = KeyBak | KEY_LONG; } TS_LongKeyTimer = TS_LONG_TIME; } } } else if(KeyInfo.TogKeyNum == 0) { if(!LongFlag) { TS_Key = KeyBak | KEY_BREAK; } else { TS_Key = KeyBak | KEY_LONG_BREAK; } TK_State = TK_STATE_RELEASE; } } #endif #if PRINT_TS_KEY_EN if(TS_Key != 0) { if((TS_Key & 0xFF00) == 0) { #if GENERATE_DOUBLE_KEY_EN if(TS_Key > 0x1F) { TK_Debug_UartPutChar('d'); TK_Debug_UartPutChar('o'); TK_Debug_UartPutChar('u'); TK_Debug_UartPutChar('b'); TK_Debug_UartPutChar('l'); TK_Debug_UartPutChar('e'); } else { C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 30 TK_Debug_UartPutChar('s'); TK_Debug_UartPutChar('i'); TK_Debug_UartPutChar('n'); TK_Debug_UartPutChar('g'); TK_Debug_UartPutChar('l'); TK_Debug_UartPutChar('e'); } TK_Debug_UartPutChar(' '); #endif TK_Debug_UartPutChar('k'); TK_Debug_UartPutChar('e'); TK_Debug_UartPutChar('y'); TK_Debug_UartPutChar(' '); TK_Debug_UartPutChar('='); TK_Debug_UartPutChar(' '); Hex2CharPrint(TS_Key); TK_Debug_UartPutChar('\r'); TK_Debug_UartPutChar('\n'); } else if(TS_Key & KEY_BREAK) { TK_Debug_UartPutChar('k'); TK_Debug_UartPutChar('e'); TK_Debug_UartPutChar('y'); TK_Debug_UartPutChar(' '); TK_Debug_UartPutChar('u'); TK_Debug_UartPutChar('p'); TK_Debug_UartPutChar('\r'); TK_Debug_UartPutChar('\n'); } else if(TS_Key & KEY_LONG_START) { TK_Debug_UartPutChar('l'); TK_Debug_UartPutChar('o'); TK_Debug_UartPutChar('n'); TK_Debug_UartPutChar('g'); TK_Debug_UartPutChar(' '); TK_Debug_UartPutChar('s'); TK_Debug_UartPutChar('t'); TK_Debug_UartPutChar('a'); TK_Debug_UartPutChar('r'); TK_Debug_UartPutChar('t'); TK_Debug_UartPutChar('\r'); TK_Debug_UartPutChar('\n'); } else if(TS_Key & KEY_LONG) { TK_Debug_UartPutChar('l'); TK_Debug_UartPutChar('o'); TK_Debug_UartPutChar('n'); TK_Debug_UartPutChar('g'); TK_Debug_UartPutChar('\r'); TK_Debug_UartPutChar('\n'); } } #endif } #endif 1832 #endif 1833 /********************************************************************************************************* -************/ 1834 C51 COMPILER V9.60.0.0 TS_API 05/05/2026 17:41:52 PAGE 31 1835 /********************************************************************************************************* -************/ 1836 #endif MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 2377 ---- CONSTANT SIZE = 53 ---- XDATA SIZE = 296 48 PDATA SIZE = ---- ---- DATA SIZE = 9 30 IDATA SIZE = 16 ---- BIT SIZE = 5 1 EDATA SIZE = ---- ---- HDATA SIZE = ---- ---- XDATA CONST SIZE = ---- ---- FAR CONST SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 10 WARNING(S), 0 ERROR(S)