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

独立按键非延时去抖

时间:10-02 整理:3721RD 点击:
/*
         研究独立按键非延时去抖程序
          程序按键检测未模块化,有待改进
          各按键处于研究状态,未有明确的含义
*/
#include<reg52.h>
#define N 50
typedef unsigned char uint8;
typedef unsigned int uint16;
code uint8 number[10]={0xc0,0xf9,0xa4,0xb0,0x99,
                                    0x92,0x82,0xf8,0x80,0x90};//0到9
uint8 a[4]={0};
uint16 x = 0;
sbit buff = P1^5;
        
void timer1_init(void)
{
      TMOD |= 0x10;
      TMOD &= 0xDF;
      TH1   = 0XEC;   
      TL1   = 0X78;  //刷新速度约为4ms
      TR1   = 1;
      ET1   = 1;
}
refresh(uint16 m)  //加M是为了清掉高位0       数码管动态刷新函数
{
       static uint8 j=0;
       switch(j)
      {
             case 0:P1=0xf7;P0=number[a[0]];j++;break;
            case 1:if(m>9)P1=0xfb;else P1=0xff;P0=number[a[1]];j++;break;
            case 2:if(m>99)P1=0xfd;else P1=0xff;P0=number[a[2]];j++;break;
            case 3:if(m>999)P1=0xfe;else P1=0xff;P0=number[a[3]];j=0;
            default:j=0;
      }
}
void delay(uint8 t)//延时函数,用在蜂鸣器中
{
       uint8 i;
      while(t--)
      for(i=0;i<200;i++);
}
void buzzer()  //无源蜂鸣器程序
{
     uint8 i,j;
     buff = 1;
     for(i=0;i<60;i++)
    {   
         buff = ~buff;
         for(j=0;j<200;j++);
    }
}
main()
{
        uint8 i;
        timer1_init();
        EA = 1;
        while(1)
       {
             for(i=0;i<9;i++)//P2控制led,用于检测单片机是否延时
             {
                     P2=0xff>>i;
                     delay(N);
              }
              for(i=0;i<9;i++)
             {
                     P2=0xff<<i;
                      delay(N);
              }
         }

}
void interrupt_timer1() interrupt 3
{
         static char m=0;
         timer1_init();
         if(P3 == 0xff)
               m=0;
         else
               m++;
         if(m == 10)
         {
                 m=-150;//x++;
         switch(P3)
           {
                   case 0x7f:x++;buzzer();break;
                   case 0xbf:x--;buzzer();break;
                   case 0xdf:x=3;break;
                   case 0xef:x=4;break;
                   case 0xf7:x=5;break;
                   case 0xfb:x=6;break;
            }
             a[0] = x%10;//数码管各位值
             a[1] = x/10%10;
             a[2] = x/100%10;
             a[3] = x/1000%10;
           }
           refresh(x);//数码管刷新
}

欢迎各位提出更好的建议

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

网站地图

Top