×
单片机 > 单片机程序设计 > 详情

经典防抖动键C51源程序

发布时间:2020-08-21 发布时间:
|
********************************************************/
//单片机四独立按键控制四LED;
//四个独立按键对应四个独立的LED.
//当某一按键按下时对应的LED亮,当第二次按下时灭。
//四个LED只能有一个亮,初学者可以参考以下程式:

/********************************************************/

#i nclude   < reg52.h >
unsigned char k_scan();
unsigned char k_pro();
unsigned char k_new,k_old;
unsigned char k;

void delay(unsigned char m);

sbit k1=P1^4;   sbit k2=P1^5;
sbit k3=P1^6;   sbit k4=P1^7; 
sbit led0=P0^0; sbit led1=P0^1;
sbit led2=P0^2; sbit led3=P0^3;

bit n;

/********************************************************/
void main(void)
{  
   P0=0xff;
   k_old=0x00;     

   while(1)
  {
    k_new=k_scan();

     if(k_new!=k_old)
      {  delay(1);
          if(k_new!=k_old)
          {k_old=k_new;
            k=k_pro();}
      }
 
     switch(k)
      {
         case 1:{if(n)led0=0;else if(!n)led0=1;} break;
         case 2:{if(n)led1=0;else if(!n)led1=1;} break;
         case 3:{if(n)led2=0;else if(!n)led2=1;} break;
         case 4:{if(n)led3=0;else if(!n)led3=1;} break;
         default: break;
       }
   }
}

/********************************************************/
unsigned char k_pro()
 {
    switch (k_new)
    {
        case 0x01:{k=1;if(led1&led2&led3){n=!n;}
        else {P0=0xff;}} 
        break;
        case 0x02:{k=2;if(led0&led2&led3){n=!n;}P0=0xff;}
        break;
        case 0x04:{k=3;if(led0&led1&led3){n=!n;}P0=0xff;} 
        break;
        case 0x08:{k=4;if(led0&led1&led2){n=!n;}P0=0xff;}
        break;

       default:
       break;
    }
     return(k);
 }

/********************************************************/
unsigned char k_scan()
{  
    P1=0xff;
    k_new=0x00;
    k_new=k_new|(!k4);
    k_new=k_new<<1;
    k_new|=(!k3);
    k_new=k_new<<1;
    k_new|=(!k2);
    k_new=k_new<<1;
    k_new|=(!k1);
    return(k_new);                      //无键按下k_new=0x00
}

/********************************************************/
void delay(unsigned char m)
{
   while(m--)
   {
    unsigned char i=255;
    while(i--);
    }
}

/********************************************************/

/*

还可以将 k_scan 函数更改为:

unsigned char k_scan()
{  
    P1=0xff;
    k_new=0x00;
    k_new=(~(P1) & 0xf0)>>4;
    return(k_new);                        //无键按下k_new=0x00
}

*/



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
qemu+chroot构建arm aarch64虚拟机