新聞中心

        EEPW首頁 > 模擬技術 > 設計應用 > 采用飛思卡爾Freedom開發平臺的觸摸界面(3)

        采用飛思卡爾Freedom開發平臺的觸摸界面(3)

        作者:TomThompson 時間:2013-02-28 來源:電子產品世界 收藏

          接觸掃描

        本文引用地址:http://www.104case.com/article/142533.htm

          這可以完成TSI的設置。因為軟件命令啟動測量掃描,它必須讓我們具備掃描功能:

          01 void ScanTSI(void)
          02 {
          03 short delta;
          04 unsigned short conversionCount[2];
          05
          06 TSI0_DATA |= TSI_DATA_SWTS_MASK; // 發布掃描
          07
          08 while(!(TSI0_GENCS & TSI_GENCS_EOSF_MASK)); // 等待完成
          09 TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // 清除掃描結束標志
          10
          11 // 屏蔽的電流采樣計數數據,并且保存
          12 conversionCount[currentElectrode] = (TSI0_DATA & TSI_DATA_TSICNT_MASK);
          13 // 利用校準基準計數計算增量
          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 } // 結束ScanTSI()

          該功能簡單明了。對于當前選定的電極而言,代碼開始掃描,以循環方式旋轉直到掃描完成,然后清除掃描結束標志。它可以通過TSIx_Data檢索電容測量值,并從中減去基準值,獲得校準測量值。這個值被稱為delta,經過正確檢查之后會將它插入全局陣列deltaResult[]之中,就像基準測量值一樣。最后,調用SwapElectrode()將隨后的測量值切換至其他TSI通道。

          以下為SwapElectrode()功能:

          01 void SwapElectrode(void)
          02 {
          03 // 與其他電極交換
          04 if(currentElectrode == 0) {
          05 currentElectrode = 1; // 更改標志
          06 // 選擇掃描的電極
          07 TSI0_DATA = (TSI10 << TSI_DATA_TSICH_SHIFT);
          08 } else {
          09 currentElectrode = 0;
          10 TSI0_DATA = (TSI9 << TSI_DATA_TSICH_SHIFT);
          11 }
          12 } // 結束SwapElectrode()

          它所做的工作就是更改TSIx_DATA適合的通道位,將采樣切換至其他電極。

          因此,為了掃描觸摸板,你需要重復調用ScanTSI()以便觸發掃描,并將測量值累積到deltaResult[]陣列。為了從這個陣列中“讀取”電流測量值,并將其轉換為實際讀數,你需要調用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 { // 無接觸,清理變量,以防止發生虛擬事件
          18 sliderPercentagePosition[0] = NO_TOUCH;
          19 sliderPercentagePosition[1] = NO_TOUCH;
          20 absolutePercentagePosition = NO_TOUCH;
          21 } // 否則結束
          22
          23 return ((unsigned char)absolutePercentagePosition);
          24
          25 } // 結束ReadTSI()



        關鍵詞: 飛思卡爾 寄存器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 肥城市| 囊谦县| 五河县| 通渭县| 宜良县| 抚顺县| 泸西县| 定州市| 马山县| 栾城县| 滨州市| 临夏县| 闸北区| 射阳县| 黄石市| 石首市| 栾川县| 通山县| 高青县| 蒙城县| 武夷山市| 浠水县| 东明县| 桐庐县| 睢宁县| 孟津县| 清流县| 黄大仙区| 贡山| 通山县| 洪泽县| 静宁县| 株洲县| 开鲁县| 永州市| 沙雅县| 淮北市| 双峰县| 盐源县| 八宿县| 栾城县|