- 打卡等级:偶尔看看I
- 打卡总天数:10
- 最近打卡:2025-07-05 10:36:05
已绑定手机
注册会员
- 积分
- 99
|
按键程序调用举例:下面这段代码通过一个ledmode变量来进入不同的状态,限制最大档位,需要在定时器中断内设置keydet =1 允许检测,在主循环中添加
if(keydet){
KEY_HANDLER();
}
这个函数会调用中层和底层的按键处理代码。
如果只是测试就把ledmode变量初始化为0就可以了
const unsigned char ccapvalues[] = {0x36, 0x33, 0x2E, 0x27, 0x20, 0x16, 0x10, 0x00};
unsigned char ccapcounter;
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; //初始化不开启电源
}
void TM0_ROUTINE(void) interrupt 1{//timer0中断服务函数,20ms一次
keydet = 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;
}
} |
|