|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2016-3-12 11:36:45
|
显示全部楼层
STC官方资料中有参考例程,根据实际作些修改便可。
/**************************************************
函数:u16 Get_ADC10bitResult(u8 channl)
描述:查询法读一次ADC结果
参数:channl,选择要转换的ADC端口
返回:10位ADC结果
备注:
**************************************************/
u16 Get_ADC10bitResult(u8 channl) //channl = 0~7
{
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = 0X80 | ADC_90T | ADC_START | channl; //触发ADC
_nop_();
_nop_();
_nop_();
_nop_();
while((ADC_CONTR & ADC_FLAG) == 0); //等待ADC转换结束
ADC_CONTR = 0x80; //清除标志
return(((u16)ADC_RES << 2) | ((u16)ADC_RESL & 3)); // 返回ADC结果
}
/**************************************************
函数:viod AutoZero(void)
描述:自动0点跟踪
参数:无
返回:无
备注:250ms调用一次,这是使用相邻2个采样的差的绝对值之和来检测
**************************************************/
void AutoZero(void)
{
u8 i;
u16 j,k;
for(i = 0;i < TOUCH_CHANNEL;i ++) //处理8个通道
{
j = adc;
k = j - adc_Prev; //减去前一个读数
F0 = 0; //按下
if(k & 0x8000) //如果是负值,则去掉负号变为正值;
F0 = 1,k = 0 - k; //释放,求出两次采样的差值
if(k >= 20) //变化比较大
{
TouchZeroCnt = 0; //如果变化比较大,则清0计数器
if(F0) TouchZero = j; //如果是释放,并且变化比较大,则直接替代
}
else //变化比较小,则蠕动,自动0点跟踪
{
if(++TouchZeroCnt >= 20) //连续检测到小的变化20次/4 = 5秒
{
TouchZeroCnt = 0;
TouchZero = adc_Prev; //变化缓慢的值作为0点
}
}
adc_Prev = j; //保存这一次的采样值
}
}
/**************************************************
函数:u8 check_adc(u8 index)
描述:获取触摸信息函数
参数:index 通道号
返回:
备注:50ms调用一次
**************************************************/
u8 check_adc(u8 index)
{
u16 delta;
adc[index] = 1023 - Get_ADC10bitResult(index); //获取ADC值转换成按下键,ADC值增加
if(adc[index] < TouchZero[index]) //比0点还小的值,则认为是按键释放
return 0;
delta = adc[index] - TouchZero[index];
if(delta >= 40) //按键按下
return 1;
if(delta <= 20) //按键释放
return 0;
return 2; //保持原状态
} |
|