我现在写电容触摸按键、用的是16F722的触摸按键模块
使用TMR2作为时基、TMR1计数(TMR2门控)
按照正常的状态,手指按下时、从TMR1读出来的计数值应该是下降的,但是读出来的值居然有上升的。
读数没有经过处理、是直接显示出来的。
请问按键这里有什么问题要注意的?
比如没有按下时读数是6580、
按下时读数是6302、
异常时读数是6650、
还有更离谱的是读数是6610、基本没有变化
程序如下
按键模块的配置:
const unsigned char table_CPS[5]={0,1,9,11,10}; //5个CPS通道对应的选择
void init_timer2() //用于产生时基、TMR2的溢出周期可调
{
PR2=255; //TMR2的溢出周期
TMR2=0;
T2CKPS1=1; //预分频比1:16******************************************
T2CKPS0=1;
TOUTPS3=1; //后分频比1:16
TOUTPS2=1;
TOUTPS1=1;
TOUTPS0=1;
TMR2IF=0;
TMR2IE=1;
TMR2ON=1; //启动Timer2
}
void init_timer1()
{
TMR1CS1=1; //CPS计数
TMR1CS0=1;
T1CKPS1=0; //预分频比1:1
T1CKPS0=0;
T1SYNC=0; //与内部时钟同步-使用内部时钟源时是无关位
TMR1H=0;
TMR1L=0;
TMR1GE=1; //开启门控
T1GSPM=0; //禁止单脉冲采集模式
T1GTM=0; //禁止门控反转模式
T1GPOL=0; //门控低电平有效
T1GSS1=1; //门控源TMR2匹配PR2
T1GSS0=0;
TMR1IF=0;
TMR1IE=1;
TMR1ON=1;
}
void init_CPS()
{
CPSCON1=0; //CPS通道、初始时选择通道0
CPSRNG1=1; //CPS量程-中量程***********************************************
CPSRNG0=0;
RB0=0; //将相应引脚设为模拟输入引脚
RB1=0;
ANSB0=1;
ANSB1=1;
TRISB0=1;
TRISB1=1;
RD1=0;
RD2=0;
RD3=0;
ANSD1=1;
ANSD2=1;
ANSD3=1;
TRISD1=1;
TRISD2=1;
TRISD3=1;
CPSON=1; // 启动CPS模块
init_timer2(); //用于产生时基
init_timer1(); //用于计数CPS周期
}
在中断中读取按键计数值:
// ================ interrupt ============== //
void interrupt ISR()
{
if(T0IF && T0IE) //255us自由计数、作为公用时基
{
time1++;
T0IF=0;
}
if(TMR1IF && TMR1IE) //计数CPS周期
{
over++; //记录溢出事件
while(1) ; //拦截溢出事件
TMR1IF=0;
}
if(TMR2IF && TMR2IE) //作为CPS的时基
{
TMR1ON=0;
average[i_CPS]=(TMR1H<<8)+TMR1L;
i_CPS++;
if(i_CPS>4) { i_CPS=0; } //紧跟着检测i_CPS的值是否越界
CPSCON1=table_CPS[i_CPS]; //切换通道
TMR1H=0;
TMR1L=0;
TMR1ON=1;
TMR2IF=0;
}
}
程序打包:
按键程序
ourdev_696427TXV0WG.zip(文件大小:159K) (原文件名:CPS-keys.zip)
一周热门 更多>