新闻中心

EEPW首页 > 模拟技术 > 设计应用 > 采用飞思卡尔Freedom开发平台的触摸界面(3)

采用飞思卡尔Freedom开发平台的触摸界面(3)

作者:TomThompson时间:2013-02-28来源:电子产品世界

  接触扫描

本文引用地址:http://www.eepw.com.cn/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()



关键词: 飞思卡尔 寄存器

评论

技术专区

关闭