赛元单片机-触摸库使用总结
SC95F8617觸摸庫使用筆記
一、資料概述
主要參考資料:《賽元SC95F系列TouchKey MCU 應用指南v0.0.1.pdf》。資料包鏈接如下:
1.我下載時的地址:
SC95F8X1X觸控資料
2.我轉存的百度盤:[SC95F8X1X觸控資料] 鏈接:https://pan.baidu.com/s/1FaoaZUbpgLb9LvdgFPGV7w?pwd=fnn7
提取碼:fnn7
3.csdn下載 SC95F8X1X觸控資料
先來看看資料包的內容:
觸摸庫分為2種(高可靠模式和高靈敏度模式),3個(高靈敏度有T1和T2兩種),看看他們有什么區別:
通過上表的信息,我只用到一路觸摸,我就選用了高靈敏度模式T1。因為T2至少要3個按鍵。
二、關鍵的配置參數
下面來看看配置文件的源碼《S_TOUCHKEYCFG.H》:
//************************************************************************************************* // Copyright (c) 深圳市賽元微電子有限公司 // 文件名稱 : S_TouchKeyCFG.h // 作者 : // 模塊功能 : 觸控鍵配置文件 // 版本 : V0.1 // 更改記錄 : //************************************************************************************************ #ifndef __S_TOUCHKEYCFG_H__ #define __S_TOUCHKEYCFG_H__ #define SOCAPI_SET_TOUCHKEY_TOTAL 2 // 觸摸按鍵總數 #define SOCAPI_SET_TOUCHKEY_CHANNEL 0x000000c0 // 1個bit對應的引腳 unsigned int code TKCFG[17] = { 1, // [0]應用類型(0-彈簧,1-隔空) 0, // [1]按鍵類型(0-單鍵,1-雙鍵) 0, // [2]AirSeparationDistance 隔空距離 7, // [3]CONFIRMTOUCHCNT 確認按鍵次數:該參數決定觸控算法運行的出鍵速度,出鍵速度與一輪按鍵掃描時間有關,若// 掃描一輪按鍵需要 12MS,按鍵確認次數為5次,則按鍵需要的響應時間為5*12MS=60MS. 10, // [4]INIT_AUTO_UPDATE_TIME 初始化自動更新時間,這個意思可能是沒有按鍵時,自動更新按鍵AD基值 3000, // [5]SET_KEY_CONTI_TIME 按鍵最長輸出,單位為輪數.//如果按鍵一直觸摸,超過這個時間,就會取消按鍵有效狀態,并把這時的AD當做新的按鍵AD基值。 300, // [6]SET_SYNC_UPDATE 動態更新基線時間:該參數用于處理按鍵浮起的更新速度,保持默認不改動200, // [7]SET_UPDATE_SPEED 基線更新速度:該參數用于更新基線。保持默認不改動 2, // [8]AUTO_UPDATE_TIME 基線復位速度:該參數決定基線復位的速度。值越大,更新速度越慢,保持默認不改動 0, // [9]FilteredKValue 濾波 K值:保持默認不改動 0, // [10]SET_ANTIJAM 抗干擾設置:用于掃描時鐘變頻,有助于通過 EMI 測試,當項目有 EMI 測試要求,// 需要選擇打開 1:12bit。 4, // [11]BAUD 100, // [12]DwellTime 采樣時間 10, // [13]SaveTime 65535, // [14]SaveTime 65535, // [15]SaveTime 10 // [16]NOISE }; unsigned char code TKChannelCfg[SOCAPI_SET_TOUCHKEY_TOTAL][8]={0x03, //SET_TOUCH_FREQ 時鐘 0x18, //SET_RESOLUTION 分辨率 0x04, //SET_GAIN_CFG 增益0x1f, //SCANTIME 掃描周期0x1f, //SET_ICHA 0x05, // 0x0C, //FINGER_THRESHOLD_H 觸摸閾值高字節 0xbe, //FINGER_THRESHOLD_L 觸摸閾值低字節0x03,0x18,0x04,0x1f,0x1f,0x05,0x05,0x3a, }; #endif我就更改了3個地方:
三、把觸摸庫整合到自己的工程
高靈敏度模式T1包含了2個庫,區別在于庫使用到的臨時變量區間選擇在哪個區域。我選用了Small。
SC95F8X1X_HighSensitive_Lib_T1_S_V0.0.2.LIB --- 使用Small模式編譯,變量區間在data SC95F8X1X_HighSensitive_Lib_T1_L_V0.0.2.LIB --- 使用Large模式編譯,變量區間在xdata3.1把庫文件添加進工程
把庫文件添加到自己的工程中,下面4個文件:
這幾個文件的官方介紹:
觸摸庫API函數接口說明:
觸摸庫使用流程圖:
3.2觸摸庫API使用源碼分析
3.2.1 設置IO口為推挽輸出,且輸出高電平(我用了P31-TK6作為觸摸口)
P3CON = B0011_1111; 設置P3.6,P3.7輸入模式P3PH = 0x00;P31 = 1; // P31作為觸控,配置成強推挽,輸出13.2.2 在main函數中調用初始化函數TouchKeyInit
TouchKeyInit(); //調用庫函數,初始化TouchKey3.2.3 在main函數中,1ms掃描一次按鍵
void main(void) {...TouchKeyInit();...while(1){WDT_CLR ; //清看門狗if(FlagTick_1ms){FlagTick_1ms = 0; #if CFG_TOUCH_BODY == 1 Sys_Scan(); // 掃描觸摸按鍵 #endif}...} } void Sys_Scan(void) {if(SOCAPI_TouchKeyStatus&0x80) //重要步驟2: 觸摸鍵掃描一輪標志,是否調用TouchKeyScan()一定要根據此標志位置起后{ SOCAPI_TouchKeyStatus &=0x7f; //重要步驟3: 清除標志位, 需要外部清除。 exKeyValueFlag = TouchKeyScan(); ChangeTouchKeyvalue(); //鍵值 TouchKeyRestart(); //啟動下一輪轉換 } }/************************************************** *函數名稱:void ChangeTouchKeyvalue(void) *函數功能:鍵值轉換函數 *入口參數:void *出口參數:void *功能說明:請參考觸控庫使用手冊進行操作 **************************************************/ #define KEY_STAT_DELAY_TICK 15 #define KEY_UP_STAT_DELAY_TICK 15 unsigned char xdata bKeyIsDown; /// 記錄前一個狀態,累計10次確認 unsigned char xdata keyChangeDelay; /// 狀態時間累計void ChangeTouchKeyvalue(void) { if(exKeyValueFlag != 0x00000000) //有鍵按下{switch(exKeyValueFlag){case 0x00000040: if(!bKeyIsDown){ // 前一個狀態是松開的,累計時間keyChangeDelay++;if(keyChangeDelay > KEY_STAT_DELAY_TICK){keyChangeDelay = 0;bKeyIsDown = 1;FlagPeopleNotInBed = 0;LED1 = 1;}}break; default: exKeyValueFlag = 0x00000000; }}else { //釋放按鍵 if(bKeyIsDown){ // 前一個狀態是按下的,累計時間keyChangeDelay++;if(keyChangeDelay > KEY_UP_STAT_DELAY_TICK){keyChangeDelay = 0;bKeyIsDown = 0;LED1 = 0;FlagPeopleNotInBed = 1;}}} }四、針對特殊應用修改觸摸庫函數
我的應用有些特殊,我是在按摩椅系統中,用來檢測人體是否到位。在按摩椅表層放置一根細長的導線。一開始,我把TKCFG[5]SET_KEY_CONTI_TIME 按鍵最長輸出 設置為0xFFFF(默認為十進制3000),按鍵最長輸出為8分鐘左右,我需要按鍵能夠持續輸出30分鐘。于是找到了觸摸庫文件《S_TouchKeyCFG.C》
/************************************************** *函數名稱:unsigned int TouchKeyScan(void) *函數功能:檢測按鍵接口 *入口參數:void *出口參數:按鍵通道, 返回的是一個int , 通道數 *備注 :1, 調用觸控庫檢測函數SensorKeyFlag()2, 分析得出16個通道,哪個通道有按下,按下bit 位設置為1,否則為03, 檢測是否需要立即更新baseline: 大于MAX_KEY_RESET_BASELINE 個按鍵按下時立即更新baseline4, 雙鍵或者單鍵按下時, 時間大于SetOneKeyPushResetTime()結果時更新baseline **************************************************/ unsigned long int TouchKeyScan(void) {unsigned char t;unsigned char MultipleCnt = 0;//按鍵計數unsigned long int Keyvalue = 0; unsigned long int KeyData = 0; if(GetIsNeedUpdateBaseline() == 0) //檢測是否需要更新baseline {Keyvalue = SensorKeyFlag(); //Sensor判斷, 這里如果bMultiple = 1 表示中間有干擾 //分析按鍵,得出標準的16通道bit 位 for(t=0;t<CurrentChannelMax;t++){Keyvalue = Keyvalue>>1;if(TK_CY){KeyData |= ((unsigned long int)0x01 << (CurrentChannel[t])); MultipleCnt++; }} if(MultipleCnt >= 2) //進入多按鍵處理{ bMultiple = 1; if(MultipleCnt >= SOCAPI_MAX_KEY_NUM_INVALID){SetNeedUpdateBaseline(); // 立即更新baseline ,例如亞克力板蓋上去}else{ if(IsDoubleKeyOrSlideKey()){bMultiple = 0;} } } if(bMultiple == 0) //進入按鍵判斷{ if(KeyData != 0x0) //單個按鍵達到多長時間就update baseline ,松手檢測{ UpdateBaseLNum++; }else {UpdateBaseLNum = 0; } } else{ //考慮基線更新 MultipleLNum++; KeyData = 0x00;}// if(UpdateBaseLNum > SetOneKeyPushResetTime()){ //按鍵超出最長輸出時間更新基線 // SetNeedUpdateBaseline(); // UpdateBaseLNum = 0; // }if(MultipleLNum >SOCAPI_MAX_KEY_MUTIPLE) //干擾計數大于最大計數更新基線{SetNeedUpdateBaseline(); MultipleDealTpye = 1; MultipleLNum = 0;} } else{MultipleDeal(TKCFG[AUTO_UPDATE_TIME]); //基線復位處理} return KeyData; }注釋掉的如下代碼,就可以保證按鍵持續輸出時間超過30分鐘:
if(UpdateBaseLNum > SetOneKeyPushResetTime()) //按鍵超出最長輸出時間更新基線{SetNeedUpdateBaseline(); UpdateBaseLNum = 0;}總結
以上是生活随笔為你收集整理的赛元单片机-触摸库使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL基础查询笔记【动力节点的视频】
- 下一篇: ajax实现翻书效果,jquery实现的