我试了几次,似乎不能在定时器中断中直接调用,可能是异步执行的问题吧,下面是一段调用该按键程序的参考代码,可以参考。
////////////////PCA///////////////////////////////////
// PWM占空比值数组 (0x00=100%, 0x40=0%)
// 从最小值开始
const unsigned char ccapvalues[] = {0x38, 0x33, 0x2E, 0x25, 0x20, 0x16, 0x10, 0x00};
unsigned char ccapcounter = 0;//全局变量
void PCA_CONFIG(void){
P_SW1 = 0x10; // P3.1切换为PWM输出
CCON = 0x00; // 复位PCA
CMOD = 0x0A; // 系统时钟/4,6MHZ下为23.5khz
CL = 0x00; // 复位低字节
CH = 0x00; // 复位高字节
CCAPM0 = 0x42; // PCA0 PWM模式
PCA_PWM0 = 0x80;// 6位PWM模式
CCAP0H = ccapvalues[ccapcounter];//在唤醒后读取ram中的ccapcounter值
CR = 1; //初始化不开启电源
}
///////////////////////按键上层处理
bit keydet = 0;//允许按键检测
unsigned char keyevent = NOKEY;//初始化为0
void KEY_HANDLER(void){
keyevent = KEY_READ();//调用按键读取函数
switch(keyevent){
case LONGKEY:
poweron ^= 1;
break;
case SINGLEKEY:
if(poweron && ledmode<=2){
if(ccapcounter <= 7) ccapcounter++;//如果小于7就增加,等于7后不再增加
}
else if(poweron && ledmode>2){
if(ccapcounter <= 5) ccapcounter++;
}
break;
case DOUBLEKEY:
if(poweron && ledmode<=2){
if(ccapcounter > 0) ccapcounter--;//如果大于0就减小,等于0后不再减小
}
else if(poweron && ledmode>2){//不能写成>=0,否则当为0时再减1...好吧这是无符号字符,不会小于0
if(ccapcounter > 0) ccapcounter--;
}
break;
case TRIPLEKEY:
switch(ledmode){
case 0:
case 1:
case 2:
if(ccapcounter == 7){
ccapcounter = 0;
}
else{
ccapcounter = 7;
}
break;
case 3:
case 4:
case 5:
if(ccapcounter == 5){
ccapcounter = 0;
}
else{
ccapcounter =5;
}
}
break;
}
}
/////////////////////定时器中断
void TM0_ROUTINE(void) interrupt 1{//timer0中断服务函数,20ms一次
keydet = 1;
}
|