采用飞思卡尔Freedom开发平台的触摸界面(3)
接触扫描
本文引用地址://www.cazqn.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()
评论