C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 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" 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 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 C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 2 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) 0x0040, #endif 74 #if (KEY_CH_COUNT > 7) 0x0080, #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}; 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 { C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 3 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--; } #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 } C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 4 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; 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) C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 5 { 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 { 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 C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 6 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 { 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 } C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 7 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; } 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) C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 8 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]) { 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; } } C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 9 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) 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 C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 10 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 } 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 C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 13 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 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 { C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 14 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; PanalCoverJudgeTimer = PANAL_COVER_JUDGE_TIME; } else { if((PanalToggleCount >= JUDGE_TK_NUM)||(TS_RefChAbnormalJudge())) { PreKeysFlagSN = 0; PanalCoverJudgeFlag = 0; TS_BaseLineForceUpdate(); } C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 15 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 } 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 { C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 16 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 { 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]; C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 17 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]; 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 { C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 18 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 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); C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 19 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 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); C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 20 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 EnterStopScanTimer = ENTER_STOP_MODE_TIME; TS_SleepEn = 1; TS_SleepMode = 0; #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; 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 C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 21 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(); 1279 4 } 1280 3 #endif 1281 3 #if SUPPORT_TOUCH_SLEEP_MODE if(!TS_StableFlag || !TS_SleepEn || (PCON & BIT2)) // ÔÚ·ÂÕæÄ£Ê½²»½øÈëSTOPģʽ { EnterStopScanTimer = ENTER_STOP_MODE_TIME; } if(!EnterStopScanTimer&&TS_SleepEn) { #if ENTER_SLEEP_PRINT_EN C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 22 TK_Debug_UartPutChar('s'); TK_Debug_UartPutChar('l'); TK_Debug_UartPutChar('e'); TK_Debug_UartPutChar('e'); TK_Debug_UartPutChar('p'); TK_Debug_UartPutChar('\r'); TK_Debug_UartPutChar('\n'); Delay_ms(1); #endif TS_EnterSleepMode(); #if ENTER_SLEEP_PRINT_EN TK_Debug_UartPutChar('e'); TK_Debug_UartPutChar('x'); TK_Debug_UartPutChar('i'); TK_Debug_UartPutChar('t'); TK_Debug_UartPutChar('\r'); TK_Debug_UartPutChar('\n'); #endif } #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 void TS_SetChannel(unsigned char index,unsigned char ch); void TS_SleepScanStart(void) { unsigned char i; for(i = 0; i < 6; i++) { if(TS_Index + i < TS_Cnt) { TS_SetChannel(i,(TS_CH[TS_Index+i])+1); } else { TS_SetChannel(i,0); } } TKCON |= TKST(1); } void TS_EnterSleepMode(void) { //Ê¡µçģʽ²ÎÊýÅäÖà #define STOP_TKDIV_VAL 0 C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 23 #define STOP_TKTMS_VAL 15 //·Åµçʱ¼ä #define STOP_VRS_VAL 7 //±È½ÏÆ÷ãÐÖµ unsigned char TS_SampleComplete = 0,i; unsigned int xdata WakeUp_PThdVal[OPENED_TS_COUNT]; unsigned int xdata WakeUp_NThdVal[OPENED_TS_COUNT]; WORD_UNION TS_Data; TKCON = 0; TKIF = 0x3F; TS_SleepMode = 1; #if SUPPORT_KEY #if TK_SHARE_LED_EN TLEN0 = 0x00; TLDAT0 = 0x00; TLEN1 = 0x00; TLDAT1 = 0x00; P01F = HIGH_Z|PU_EN; P01C &= (1<<5); //Ñ¡ÔñÈõÉÏÀ­ #endif #endif TMCON &= ~TME(1); TMCON |= TMF; TKCON = (TKCON&0xF8) | VRS(STOP_VRS_VAL); TKCON &= ~TKIE(1); TKCFG = TKDIV(STOP_TKDIV_VAL)|TKTMS(STOP_TKTMS_VAL); #if (OPENED_TS_COUNT%6 == 0) TKMTS = (SLEEP_MODE_SCAN_INTERVAL_TIME*6)/(OPENED_TS_COUNT); #else TKMTS = (SLEEP_MODE_SCAN_INTERVAL_TIME)/((OPENED_TS_COUNT/6)+1); #endif TKPWC = TKPC(1)|VDS(0)|VIRS(0)|TKPWS(0)|TKCVS(0); //Ê¡µçÉèΪVDD³äµç #ifdef LVD_RST_ENABLE LVDCON = 0; #endif I2CCON = 0; CKCON = 0; MECON |= BIT6; PWCON = (PWCON&0xF0)|0x07; TS_Index = 0; TS_SleepScanStart(); WDFLG = 0xA5; TMCON = TME(1); TMSNU = 127; while(1) { if(TS_SampleComplete) { CKCON &= ~IHCKE; CKCON = (CKCON&0xFE) | CKSEL_IRCL; EA = 0; PCON |= (1<<1); _nop_(); _nop_(); C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 24 _nop_(); CKCON |= IHCKE; CKCON = (CKCON&0xFE) | CKSEL_IRCH; EA = 1; } if(TS_HalfSecCnt >= 5) { break; } if(TKIF != 0) { if(TS_HalfSecCnt) TS_HalfSecCnt--; for(i = 0; i < 6; i++) { if(TKIF & (1<= WakeUp_NThdVal[TS_Index+i])) { goto SLEEP_EXIT; } } } } if(TS_Index+6 < TS_Cnt) C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 25 { TS_Index += 6; } else { TS_Index = 0; if(TS_SampleComplete == 0) { TS_SampleComplete = 1; TKCON |= TMEN(1); } } TS_SleepScanStart(); WDFLG = 0xA5; } } SLEEP_EXIT: TKCON = 0; TKIF = 0x3F; PWCON = (PWCON&0xF0)|0x0D; TKCFG = TKDIV(TKDIV_VAL)|TKTMS(TKTMS_VAL); #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) TKCON = TKST(0)|TKIE(1)|TMEN(0)|TWKE(0)|VRS(0); TKPWC = TKPC(TK_PC_VAL)|VDS(VDS_VAL)|VIRS(VIRS_VAL)|TKPWS(1)|TKCVS(1); #endif #if SUPPORT_KEY #if TK_SHARE_LED_EN TLEN0 = 0xFF; TLEN1 = 0x1F; P01F = 6; #endif #endif CKCON |= ILCKE; TMCON &= ~TME(1); TMCON |= TMF; Delay_50us(1); TMCON = TME(1); TMSNU = 0; TS_Index = 0; TS_ScanStart(); EnterStopScanTimer = ENTER_STOP_MODE_TIME; TS_SleepMode = 0; #ifdef LVD_RST_ENABLE LVDCON = 0xE3; //ÉèÖÃLVD¸´Î»µçѹΪ2V #endif } #endif 1526 /********************************************************************************************************* -************/ 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; C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 26 #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) { 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; C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 27 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; } else { TS_Key = KeyBak | KEY_LONG; } TS_LongKeyTimer = TS_LONG_TIME; } } else { if(!LongFlag) C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 28 { 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; } else { TS_Key = KeyBak | KEY_LONG_BREAK; } TK_State = TK_STATE_RELEASE; } #endif } #if GENERATE_DOUBLE_KEY_EN C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 29 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 { 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'); C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 30 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 1835 /********************************************************************************************************* -************/ 1836 #endif MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 1787 ---- CONSTANT SIZE = 43 ---- XDATA SIZE = 250 ---- PDATA SIZE = ---- ---- C51 COMPILER V9.60.0.0 TS_API 03/28/2026 16:50:49 PAGE 31 DATA SIZE = 9 26 IDATA SIZE = 14 ---- BIT SIZE = 3 1 EDATA SIZE = ---- ---- HDATA SIZE = ---- ---- XDATA CONST SIZE = ---- ---- FAR CONST SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)