我用的是stc12c5a60s2单片机,
现在我用了两个外部中断口,两个PCA外部中端口,
现在的情况是,四个中断都能触发,但是会存在多次触发的情况,
试过用延时函数,但是会卡在中断函数中
也试过用定时器定时,在触发外部中断时,先关闭外部中断,定时结束后,再从新打开外部中断,但是现象就是:(按键按下时的抖动应该是已经避免了,按键抬起时的抖动好像也能触发外部
下面附上自己写的代码,注释掉的是按键产生的功能,不用考虑
void Timer1Init(void) //20毫秒@11.0592MHz
{
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0x00; //设置定时初值
TH1 = 0xB8; //设置定时初值
TF1 = 0; //清除TF1标志
ET1 = 1; //使能 T1 中断
TR1 = 0; //定时器1关闭计时
}
/****************************************************/
void InterruptTimer1() interrupt 3
{
TL1 = 0x00; //设置定时初值
TH1 = 0xB8; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 0; //定时器1关闭计时
EX0=1; //开外部中断0
EX1=1; //开外部中断1
CCF0=0; //开PCA外部中断P1.3
CCF1=0; //开PCA外部中断P1.4
}
}
/****************************************************/
void caidanjiquxiao() interrupt 0 //菜单及取消的按键
{
EX0=0; //关外部中断0
// switch (xianshijiemianxuanze) //用来判断箭头指示在哪一行?
// {
// case 1000:
// xianshijiemianxuanze=1100; //主界面按下第一个键,显示菜单页
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// break;
//
// case 1100:
// xianshijiemianxuanze=1000; //菜单页按下第一个键,显示主界面
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// break;
//
// case 1110:
// xianshijiemianxuanze=1100; //标定页按下第一个键,显示菜单页
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// break;
//
// case 1120:
// xianshijiemianxuanze=1100; //报警页按下第一个键,显示菜单页
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// break;
//
// case 1130:
// xianshijiemianxuanze=1100; //通讯页按下第一个键,显示菜单页
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// break;
//
// case 1111:
// xianshijiemianxuanze=1110; //零点页按下第一个键,显示标定页
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// break;
//
// case 1112:
// xianshijiemianxuanze=1110; //标气页按下第一个键,显示标定页
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// break;
//
// default:
// break;
// }
TR1 = 1; //开消抖计时
}
/****************************************************/
void querenanjian() interrupt 2 //确认按键
{
EX1=0; //关外部中断1
// switch (xianshijiemianxuanze) //用来判断箭头指示在哪一行?
// {
// case 1000:
// //主界面按下第四个键,不作反应
// break;
//
// case 1100:
// xianshijiemianxuanze=xianshijiemianxuanze+jiantouweizhi*10; //菜单页按下第四个键,根据箭头位置打开下一页
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// break;
//
// case 1110:
// xianshijiemianxuanze=xianshijiemianxuanze+jiantouweizhi*10; //标定页按下第四个键,根据箭头位置打开下一页
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// break;
//
// case 1120:
// xianshijiemianxuanze=1100; //报警页按下第四个键,显示菜单页,并且保存报警值
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// break;
//
// case 1130:
// xianshijiemianxuanze=1100; //通讯页按下第四个键,显示菜单页,并且保存通讯地址和波特率
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// ConfigUART(tongxunbotelv); //配置波特率为 9600
// break;
//
// case 1111:
// xianshijiemianxuanze=1110; //零点页按下第四个键,显示标定页,并且根据设置值进行标定折算
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// break;
//
// case 1112:
// xianshijiemianxuanze=1110; //标气页按下第四个键,显示标定页,并且根据设置值进行标定折算,同时保存标定点
// shuaxinjiantouweizhi(); //当进入新界面时,刷新箭头和星号位置
// break;
// default:
// break;
// }
TR1 = 1; //开消抖计时
}
/****************************************************/
void zuoyouanjian() interrupt 7 //左右方向按键
{
unsigned char anjian=0;
// if(CCF0==1){anjian=2;}
// if(CCF1==1){anjian=3;}
// switch (xianshijiemianxuanze) //用来判断箭头指示在哪一行?
// {
// case 1000:
// //主界面按下箭头键,不作反应
// break;
//
// case 1100: //菜单页的箭头变化
// switch (anjian) //用来判断箭头指示在哪一行?
// {
// case 2:
// jiantouweizhi++;
// if(jiantouweizhi>=4){jiantouweizhi=1;}
// break;
//
// case 3:
// jiantouweizhi--;
// if(jiantouweizhi<=0){jiantouweizhi=3;}
// break;
//
// default:
// break;
// }
//
// case 1110: //标定页的箭头和数值变化
// switch (anjian) //用来判断箭头指示在哪一行?
// {
// case 2:
// jiantouweizhi++;
// if(jiantouweizhi>=3){jiantouweizhi=1;}
// break;
//
// case 3:
// jiantouweizhi--;
// if(jiantouweizhi<=0){jiantouweizhi=2;}
// break;
//
// default:
// break;
// }
//
// case 1120: //报警页的箭头和数值变化
// switch (anjian) //用来判断箭头指示在哪一行?
// {
// case 2:
// xinghaoweizhi++;
// if(xinghaoweizhi>=9){xinghaoweizhi=1;}
// break;
//
// case 3:
// switch(xinghaoweizhi)
// {
// case 1:
// dibao=dibao+1000;
// break;
// case 2:
// dibao=dibao+100;
// break;
// case 3:
// dibao=dibao+10;
// break;
// case 4:
// dibao=dibao+1;
// break;
// case 5:
// gaobao=gaobao+1000;
// break;
// case 6:
// gaobao=gaobao+100;
// break;
// case 7:
// gaobao=gaobao+10;
// break;
// case 8:
// gaobao=gaobao+1;
// break;
// }
// break;
//
// default:
// break;
// }
//
// case 1130: //通讯页的箭头和数值变化
// switch (anjian) //用来判断箭头指示在哪一行?
// {
// case 2:
// jiantouweizhi++;
// if(jiantouweizhi>=5){jiantouweizhi=1;}
// break;
//
// case 3:
// if(jiantouweizhi==2)
// {
// tongxundizhi++;
// if(tongxundizhi>=40)
// {
// tongxundizhi=0x01;
// }
// }
// if(jiantouweizhi==4)
// {
// botelvxuanze++;
// if(botelvxuanze>=5)
// {
// botelvxuanze=0;
// }
// }
// tongxunbotelv=botelvshuzu[botelvxuanze];
// break;
//
// default:
// break;
// }
//
// case 1111: //零点页的箭头和数值变化
// break; //零点页没有中间按键
//
// case 1112: //标气页的箭头和数值变化
// switch (anjian) //用来判断箭头指示在哪一行?
// {
// case 2:
// jiantouweizhi++;
// if(jiantouweizhi>=5){jiantouweizhi=1;}
// break;
//
// case 3:
// switch(jiantouweizhi)
// {
// case 1:
// biaodingdian=biaodingdian+1000;
// break;
// case 2:
// biaodingdian=biaodingdian+100;
// break;
// case 3:
// biaodingdian=biaodingdian+10;
// break;
// case 4:
// biaodingdian=biaodingdian+1;
// break;
// }
// break;
//
// default:
// break;
// }
// default:
// break;
// }
TR1 = 1; //开消抖计时
}
/****************************************************/