单片机按键问题
时间:10-02
整理:3721RD
点击:
下面是我写的程序
每次中断大概3.3ms左右,第一次检测到按键赋值标志位,中间执行三次中断后再判断是不是还有按键。
延迟10ms应该说可以防止抖动了,可是现在按下去会跳变好多下。如果我用检测按键松开来执行程序的话,就不会出现这种问题。就是想问下是不是我的思路有问题,如果不检测按键松开能不能防止跳变。急急急!
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
int k_num=0;
unsigned char codeduan[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void interrupt 13 int_123(void) ;
int flag=0,a=0,b=0,c,i=15,k=1;
void main(void) {
EnableInterrupts;
/* include your code here */
/*******************数码管端口初始化************/
PTCDD=0XFF;
PTBDD_PTBDD0=1;
PTBDD_PTBDD3=1;
PTDDD_PTDDD4=1;
/********************按键端口初始化*************/
PTDPE_PTDPE0=1;
PTDPE_PTDPE1=1;
PTDPE_PTDPE5=1;
/*******************定时器初始化****************/
TPM1SC=0X48;//中断使能、总线时钟、1分频。
TPM1MODH=62;
TPM1MODL=128;//计数16000次=3.5ms
while(1){
PTDD_PTDD2=1;
}
//for(;;) {
/* feeds the dog */
// } /* loop forever */
/* please make sure that you never leave main */
}
void interrupt 13 int_123(void) {
TPM1SC_TOF=0;
__RESET_WATCHDOG();
c=(i>0)?i:-i;
switch (flag){
case 0:
PTDD_PTDD4=0;
PTCD=codeduan[c%10];
PTBD_PTBD3=1;break;
case 1:
PTBD_PTBD3=0;
PTCD=codeduan[c/10];
PTBD_PTBD0=1;break;
case 2:
PTBD_PTBD0=0;
if(i<0) {
PTCD=0XBF;
PTDD_PTDD4=1;
};break;
}
flag++;
if(flag==3){
k++;
flag=0;
if(PTDD_PTDD0==0&&a==1){
i++; a=0}
if(PTDD_PTDD1==0&&b==1){
i--; b=0; }
if(PTDD_PTDD0==0)
a++;
if(PTDD_PTDD1==0)
b++;
if(i>50)i=-50;
if(i<-50)i=50;
}
}
每次中断大概3.3ms左右,第一次检测到按键赋值标志位,中间执行三次中断后再判断是不是还有按键。
延迟10ms应该说可以防止抖动了,可是现在按下去会跳变好多下。如果我用检测按键松开来执行程序的话,就不会出现这种问题。就是想问下是不是我的思路有问题,如果不检测按键松开能不能防止跳变。急急急!
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
int k_num=0;
unsigned char codeduan[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void interrupt 13 int_123(void) ;
int flag=0,a=0,b=0,c,i=15,k=1;
void main(void) {
EnableInterrupts;
/* include your code here */
/*******************数码管端口初始化************/
PTCDD=0XFF;
PTBDD_PTBDD0=1;
PTBDD_PTBDD3=1;
PTDDD_PTDDD4=1;
/********************按键端口初始化*************/
PTDPE_PTDPE0=1;
PTDPE_PTDPE1=1;
PTDPE_PTDPE5=1;
/*******************定时器初始化****************/
TPM1SC=0X48;//中断使能、总线时钟、1分频。
TPM1MODH=62;
TPM1MODL=128;//计数16000次=3.5ms
while(1){
PTDD_PTDD2=1;
}
//for(;;) {
/* feeds the dog */
// } /* loop forever */
/* please make sure that you never leave main */
}
void interrupt 13 int_123(void) {
TPM1SC_TOF=0;
__RESET_WATCHDOG();
c=(i>0)?i:-i;
switch (flag){
case 0:
PTDD_PTDD4=0;
PTCD=codeduan[c%10];
PTBD_PTBD3=1;break;
case 1:
PTBD_PTBD3=0;
PTCD=codeduan[c/10];
PTBD_PTBD0=1;break;
case 2:
PTBD_PTBD0=0;
if(i<0) {
PTCD=0XBF;
PTDD_PTDD4=1;
};break;
}
flag++;
if(flag==3){
k++;
flag=0;
if(PTDD_PTDD0==0&&a==1){
i++; a=0}
if(PTDD_PTDD1==0&&b==1){
i--; b=0; }
if(PTDD_PTDD0==0)
a++;
if(PTDD_PTDD1==0)
b++;
if(i>50)i=-50;
if(i<-50)i=50;
}
}
一般都用10ms防抖,3.3ms没必要,连续两次相同的状态就认为是正常的变化了,你试试看
刚找到原因,是我忽略了按键的延迟,所以才会执行很多次。