采用飛思卡爾Freedom開發(fā)平臺的觸摸界面(3)
接觸掃描
本文引用地址:http://2s4d.com/article/142533.htm這可以完成TSI的設(shè)置。因?yàn)檐浖顔訙y量掃描,它必須讓我們具備掃描功能:
01 void ScanTSI(void)
02 {
03 short delta;
04 unsigned short conversionCount[2];
05
06 TSI0_DATA |= TSI_DATA_SWTS_MASK; // 發(fā)布掃描
07
08 while(!(TSI0_GENCS & TSI_GENCS_EOSF_MASK)); // 等待完成
09 TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // 清除掃描結(jié)束標(biāo)志
10
11 // 屏蔽寄存器的電流采樣計數(shù)數(shù)據(jù),并且保存
12 conversionCount[currentElectrode] = (TSI0_DATA & TSI_DATA_TSICNT_MASK);
13 // 利用校準(zhǔn)基準(zhǔn)計數(shù)計算增量
14 delta = conversionCount[currentElectrode] - baselineValue[currentElectrode];
15
16 // 處理下溢
17 if( delta < 0)
18 deltaResult[currentElectrode] = 0;
19 else
20 deltaResult[currentElectrode] = delta;
21
22 SwapElectrode(); // 切換至其他電極
23
24 } // 結(jié)束ScanTSI()
該功能簡單明了。對于當(dāng)前選定的電極而言,代碼開始掃描,以循環(huán)方式旋轉(zhuǎn)直到掃描完成,然后清除掃描結(jié)束標(biāo)志。它可以通過TSIx_Data寄存器檢索電容測量值,并從中減去基準(zhǔn)值,獲得校準(zhǔn)測量值。這個值被稱為delta,經(jīng)過正確檢查之后會將它插入全局陣列deltaResult[]之中,就像基準(zhǔn)測量值一樣。最后,調(diào)用SwapElectrode()將隨后的測量值切換至其他TSI通道。
以下為SwapElectrode()功能:
01 void SwapElectrode(void)
02 {
03 // 與其他電極交換
04 if(currentElectrode == 0) {
05 currentElectrode = 1; // 更改標(biāo)志
06 // 選擇掃描的電極
07 TSI0_DATA = (TSI10 << TSI_DATA_TSICH_SHIFT);
08 } else {
09 currentElectrode = 0;
10 TSI0_DATA = (TSI9 << TSI_DATA_TSICH_SHIFT);
11 }
12 } // 結(jié)束SwapElectrode()
它所做的工作就是更改TSIx_DATA寄存器適合的通道位,將采樣切換至其他電極。
因此,為了掃描觸摸板,你需要重復(fù)調(diào)用ScanTSI()以便觸發(fā)掃描,并將測量值累積到deltaResult[]陣列。為了從這個陣列中“讀取”電流測量值,并將其轉(zhuǎn)換為實(shí)際讀數(shù),你需要調(diào)用ReadTSI():
01 #define NO_TOUCH
02 #define THRESHOLD
03
04 unsigned short sliderPercentagePosition[2] = {NO_TOUCH,NO_TOUCH};
05 unsigned short absolutePercentagePosition = NO_TOUCH;
06
07 unsigned char ReadTSI(void)
08 {
09 // 如果存在接觸,計算其滑動的位置
10 if((deltaResult[0] > THRESHOLD) || (deltaResult[1] > THRESHOLD)){
11
12 sliderPercentagePosition[0] = (deltaResult[0]*100)/(deltaResult[0]+deltaResult[1]);
13 sliderPercentagePosition[1] = (deltaResult[1]*100)/(deltaResult[0]+deltaResult[1]);
14
15 absolutePercentagePosition = ((100 - sliderPercentagePosition[0]) + sliderPercentagePosition[1])/2;
16
17 } else { // 無接觸,清理變量,以防止發(fā)生虛擬事件
18 sliderPercentagePosition[0] = NO_TOUCH;
19 sliderPercentagePosition[1] = NO_TOUCH;
20 absolutePercentagePosition = NO_TOUCH;
21 } // 否則結(jié)束
22
23 return ((unsigned char)absolutePercentagePosition);
24
25 } // 結(jié)束ReadTSI()
評論