微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机按键问题

单片机按键问题

时间: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;
             }
}

一般都用10ms防抖,3.3ms没必要,连续两次相同的状态就认为是正常的变化了,你试试看

刚找到原因,是我忽略了按键的延迟,所以才会执行很多次。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top