<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        單片機多功能按鍵處理程序+視頻

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年04月08日   【字體:

         

        源程序:
        /*-----------------------------------------------------------------------------
          按鍵用變量定義
        -----------------------------------------------------------------------------*/
        volatile unsigned char idata KEY1=0;//多功能按鍵功能識別器。


        volatile  unsigned char idata KEY2=0;//多功能按鍵功能識別器。
        volatile  unsigned char  idata KEYBZ2;
        volatile    unsigned char idata KEY3=0;//多功能按鍵功能識別器。
        volatile    unsigned char idata KEYBZ3;
         volatile   unsigned char  idata KEY4=0;//多功能按鍵功能識別器。

        volatile   unsigned char idata KEY5=0;//多功能按鍵功能識別器。

        volatile    unsigned   char idata KEY6=0;//多功能按鍵功能識別器。
        volatile    bit ZT=0;
        volatile  bit FWBZ;

         


         /*-----------------------------------------------------------------------------
         三變量用于默認的速度,寬度,高度。
        -----------------------------------------------------------------------------*/ 
        volatile unsigned char idata b=100;//單位是rpm/min
        volatile unsigned char idata BBZ;
        volatile unsigned  char  idata c=2; //寬度單位是毫米
        volatile unsigned char  idata CBZ;
        volatile unsigned char idata d=1;//高度單位是毫米
        volatile unsigned char idata DBZ;

         

         
        /*-------------------------------------------------------------
        P0引腳定義: P0口有5種定義,每種定義根據P2口給定功能不同而不同。
        每種功能不能同時實現,否則會出現混亂。

        -------------------------------------------------------------*/
          
        sbitLED_SD    =P0^0;      //指示燈
        sbit    LED_KD      =P0^1;
        sbitLED_HD  =P0^2;
        sbitLED_YX       =P0^3;
        sbitLED_FW       =P0^4;      //按鍵1--第一路調光
        sbit    SM_BW     =P0^5;      //按鍵2--第一路開關
        sbitSM_SW     =P0^6;      //按鍵3--第二路調光
        sbitSM_GW        =P0^7;

         /*-------------------------------------------------------------
        P1引腳定義 :P1口為限位檢測口。

        -------------------------------------------------------------*/
        sbit BUZ=P1^0;
        sbit ZZMC=P1^1;//主軸沖檢測
        sbitKEY_1=P1^2; // Z軸限位上 ,當高電平表示有限位
        sbitKEY_2=P1^3; // Z軸限位下。當高電平表示有限位
        sbitKEY_3=P1^4;      //主軸中點限位。當高電平表示有限位
        sbitKEY_4=P1^5;      //角度限位左 。當高電平表示有限位
        sbitKEY_5=P1^6;      //角度限位右  。當高電平表示有限位
        sbitKEY_6    =P1^7;      //角度電機輸入2
         sbitKEY_7    =P2^7;      //角度電機輸入2


         


         /* -------------------------------------------------------------
          P3引腳定義:P3口為主軸電機調速端口和
          主軸編碼方向編碼,還有鍵盤中斷。
        -------------------------------------------------------------*/
        sbit    CLK          = P3^0; //SPI通訊脈沖
        sbitDATAS      =P3^1; //SPI通訊數據
        sbit    STB_I        =P3^2 ; //SPI通訊反饋
        sbitZZZD     =P3^4; //主軸中點檢測
        sbitZDATA    =P3^5; //主軸SPI通訊數據口
        sbit ZCLK    =P3^6;//主軸SPI通訊脈沖口
        sbitZSTB=P3^7; //SPI通訊使能口

         

         /*-----------------------------------------------------------------------------
          LED數顯7段編碼,調用時只需table[NUM]即可。
        -----------------------------------------------------------------------------*/


         unsigned char code table[]=
        {
          0x3f,0x06,0x5b,0x4f,0x66,
          0x6d,0x7d,0x07,0x7f,0x6f,
          0x77,0x7c,0x39,0x5e,0x79,
          0x71,0x00,0x40,0x00
        };


        /*-----------------------------------------------------------------------------
        函數功能 : MS 毫秒 延遲函數
        -----------------------------------------------------------------------------*/
        void Delay(unsigned int i)
        {
        unsigned int j;
        for(i;i>0;i--)
        {
        for(j=0;j<125;j++)
        {;}
        }
        }


        /*-----------------------------------------------------------------------------
        函數功能 : us 微秒 延遲函數
        -----------------------------------------------------------------------------*/
        void MyDelay(unsigned int time)
        {
        while(time--)
        {
        _nop_();
        }
        }

        /*-----------------------------------------------------------------------------
        函數功能 : us 微秒 精確US延遲 12MHZ延遲6us
        -----------------------------------------------------------------------------*/
           void MyDelay2()
        {
        _nop_();
        }

         
        /*-----------------------------------------------------------------------------
        函數功能 :顯示功能顯示數碼管百位十位個位顯示 工作參數
        -----------------------------------------------------------------------------*/
          void XSGN(unsigned char a)
              {
               unsigned char  b,c,d;//百位、十位、個位,數顯。
                EA=0;//關中斷等待全部數據送完    
                b=a/100;//求模運算,取A的百位到百位變量。  
                if(b==0)
                  {
                    P2=0xff;//百位沒有數則沒有顯示
                    SM_BW=1;
                  }
                else
                   {
                    P2=~table[b];//百位有顯示則輸出參數
                    SM_BW=1;
                _nop_();
                _nop_();
          }  
          SM_BW=0; //關閉百位數顯
          c=a%100;//取余數運算,取得數為十位和個位。
          d=c; //保存十位和個位數。
          c=c/10; //求模運算 取十位數。   
          if(c==0&&b==0)
         {
          P2=0xff;
          SM_SW=1;
         }
         else
         {
          P2=~table[c];
          SM_SW=1;
        _nop_();
        _nop_();
          }
         SM_SW=0; 
         d=d%10; //取個位。
         Delay(20); 
        if(d==0&&c==0&&b==0)
        {
          P2=0xff;
        SM_GW=1;
        }
         else
          {
          P2=~table[d];
          SM_GW=1;
          _nop_();
        _nop_();
          }
         SM_GW=0;
          IE1=0;
         IE0=0;
        EA=1;//打開鍵盤中斷
        }


           /*-----------------------------------------------------------------------------
        函數功能 :運行狀態指示LED指示燈,與送入參數。
        -----------------------------------------------------------------------------*/
         


         
           /*-----------------------------------------------------------------------------
        函數功能 :SPI通訊(輸出)16BIT輸出,DH的高4位決定輸出控制指令還是參數數據。當DH高4位且低4位全0那么輸出為控制指令
        當高4位全高,由低4位決定送出的數據是對應于哪一塊的數據。 具體參數介紹  Control (0,0);系統關閉中。Control (0,1);電源開啟中。
        Control (0,2);系統復位中Control (0,3);系統運行中。Control (0,4);系統暫停中。 Control (0,5);系統從暫停開始運行。
        送入數據示意:Control(  0xf0,b); 送入的參數是速度參數。Control(  0xf1,c); 送入的參數是寬帶參數。  Control(  0xf2,d);
        送入的數據是厚度參數。


        -----------------------------------------------------------------------------*/

         void Control(unsigned char DH,unsigned char DL)
        {
        unsigned int i,cmd;
        EA=0;
         EX0=0;
        cmd=DL;
        cmd|=DH<<8;
        STB_I = 0;//拉低片選
        Delay(1);
        for(i=0;i<16;i++)

        CLK = 0;
         
        //這里大約是100us
        if(cmd & 0x8000)DATAS = 1;//把datas的參數與16進制數8000進行位與運算把結果給datas(如果有數則DAT=1
        else DATAS = 0;//否則DAT=0
        MyDelay(50) ;

        CLK = 1;
        MyDelay(50) ;//這里大約是100us
        cmd <<= 1;
        }
        DATAS = 1;
        STB_I = 1;
        CLK = 1;
         
         IE1=0;
         IE0=0;

        EA=1;

        }

         

         

         

        /*-----------------------------------------------------------------------------
        函數功能 :電源開啟下屏閃爍功能

        -----------------------------------------------------------------------------*/

         

         

        /*-----------------------------------------------------------------------------
        函數功能 : 數據集中處理
        -----------------------------------------------------------------------------*/
        void main(void)

                BBZ=b;     //b數據的判斷代碼 用于判斷速度值的改變
        CBZ=c;     //c數據的判斷代碼
        DBZ=d;
        KEYBZ2= KEY2;
                SM_BW=0;   //數碼管百位
        SM_SW=0;   //數碼管十位
        SM_GW=0;   //數碼管個位
        BUZ=1;     //蜂鳴器關斷           
             EX1=1;     //開啟按鍵響應
           EA=1;      //開啟所有設備響應
           IT1=1;     //設定鍵盤響應為下降沿響應
          
           IT0=1;   //復位識別為下降沿識別
          
          while(1)
          {
          if(KEY1==0){P2=0XFF;P0=0XFF;  Control (0,0); }
        while(KEY1==0){;}
        if(KEY1==1) {Control(  0,1);}
        while(KEY1==1)
                 {
        SM_BW=1;
        SM_SW=1;
        SM_GW=1;
        P2=0;
        LED_SD=0;
        LED_KD=0;
        LED_HD=0;
        LED_YX=0;
        LED_FW=0;
        BUZ=1;
        Delay(500);
        P2=0XFF;
        LED_SD=1;
        LED_KD=1;
        LED_HD=1;
        LED_YX=1;
        LED_FW=1;
        BUZ=0;    
        Delay(500); 
            }

           if(KEY1==2){P2=0XFF;LED_SD=1;LED_KD=1;LED_HD=1;LED_YX=1;LED_FW=0;BUZ=1; Control(  0,2); IE0=0; EX0=1;   }//復位狀態
        while(KEY1==2){Delay(200);}
          
        if(KEY1==3)
        {
         LED_FW=1;LED_YX=0;LED_SD=0;  XSGN(b); 
        }
        while(KEY1==3)
            {
         if (KEY1==3&&ZT==0){LED_YX=0;  Control(  0,3);}
         while(KEY1==3&&ZT==0)
         {
          if(KEYBZ2!=KEY2)
            {
             if(KEY2==0){ LED_SD=0;LED_KD=1;LED_HD=1;LED_YX=0;LED_FW=1; XSGN(b); }
             if(KEY2==1) {LED_SD=1;LED_KD=0;LED_HD=1;LED_YX=0;LED_FW=1; XSGN(c);}
             if(KEY2==2){ LED_SD=1;LED_KD=1;LED_HD=0;LED_YX=0;LED_FW=1; XSGN(d);}
         KEYBZ2=KEY2;
        }
          if(BBZ!=b)
            {
        XSGN(b);
        Control(  0xf0,b); 
        BBZ=b;
        }
          if(CBZ!=c)
        {
        XSGN(c);
        Control(  0xf1,c); 
        CBZ=c;
        }
        if(DBZ!=d)
        {
        XSGN(d);
        Control(  0xf2,d); 
        DBZ=d;
        }
         }
         if(KEY1==3&&ZT==1){Control(  0,4);}                                    //系統暫停中
         while(KEY1==3&&ZT==1)
         {
          if(KEYBZ2!=KEY2)
            {
             if(KEY2==0){ LED_SD=0;LED_KD=1;LED_HD=1;LED_YX=0;LED_FW=1; XSGN(b); }
             if(KEY2==1) {LED_SD=1;LED_KD=0;LED_HD=1;LED_YX=0;LED_FW=1; XSGN(c);}
             if(KEY2==2){ LED_SD=1;LED_KD=1;LED_HD=0;LED_YX=0;LED_FW=1; XSGN(d);}
         KEYBZ2=KEY2;
        }
          if(BBZ!=b)
            {
        XSGN(b);
        Control(  0xf0,b);
        BBZ=b;
        }
          if(CBZ!=c)
        {
        XSGN(c);
        Control(  0xf1,c);
        CBZ=c;
        }
        if(DBZ!=d)
        {
        XSGN(d);
        Control(  0xf2,d);
        DBZ=d;
        }

         LED_YX=~LED_YX;Delay(100);
         }   
        }
             
          }
         
        }
          
         
           /*-----------------------------------------------------------------------------
        函數功能 : 復位功能入口
        -----------------------------------------------------------------------------*/
           void  KEYYXFW() interrupt 0//復位完成入口。
          
           {         
          
               EX1=1;
          IE1=0;
          
           }
         
         void  Keyan() interrupt 2 


           
               unsigned int idata i, j;
        FWBZ=0;
                
          if(KEY_1==0)
            {
        IT1=1;
            BUZ=0;
            i=50;
            for(i;i>0;i--)
               {
           for(j=0;j<125;j++)
              {;}
               }
          BUZ=1;
          KEY1++;
           if(KEY1==2){ FWBZ=1;}
          while(KEY1 ==4 ) {KEY1=0;ZT=0;}
          while(KEY_1==0 ) {           ;}
          i=50;
          for  (i;i>0;i--)
               {
           for(j=0;j<125;j++)
              {;}
                 }
             }

         if(KEY_2==0&&KEY1==3)
           {
           BUZ=0;
           i=50;
           for(i;i>0;i--)
              {
           for(j=0;j<125;j++)
              {;}
              }
           BUZ=1;
          FWBZ=0;
           KEY2++;
           while(KEY2==3 ){KEY2=0; }
           while(KEY_2==0){       ;}
           i=50;
           for(i;i>0;i--)
            {
        for(j=0;j<125;j++)
           {;}
            }
         }

        if(KEY_3==0&&KEY1==3)
          {
           BUZ=0;
           i=50;
                for(i;i>0;i--)
              {
          for(j=0;j<125;j++)
             {;}
              }
          BUZ=1;
        FWBZ=0;
          if(KEY2==0){b=b+10;while(b>=250)b=100;  } 
          if(KEY2==1){c++;while(c>=6)c=1;         }   
          if(KEY2==2){d++;while(d>=4)d=1;         }
          while(KEY_3==0){;}
          i=50;
          for(i;i>0;i--)
             {
         for(j=0;j<125;j++)
            {;}
             } 
          }
              

        if(KEY_4==0&&KEY1==3) 
         {
          BUZ=0;
          i=50;
          for(i;i>0;i--)
              {
           for(j=0;j<125;j++)
              {;}
               }
        BUZ=1;
        FWBZ=0;
        if(KEY2==0){b=b-10;while(b<=100)b=240;  } 
             if(KEY2==1){c--;  while(c<1)c=5;         }   
             if(KEY2==2){d--;  while(d<1)d=3;         }
        while(KEY_4==0){;}
             i=50;
        for(i;i>0;i--)
           {
            for(j=0;j<125;j++)
                {;}
           }
         }

         

        if(KEY_5==0&&(KEY1==2||ZT==1))//當在復位狀態和暫停狀態下Z周可以調節高。
        {
         IT1=0; //z軸連續可調。
         BUZ=0;
         i=50;
         for(i;i>0;i--)
            {
         for(j=0;j<125;j++)  {;}
          
            }
         BUZ=1; 
         FWBZ=0;

        }
        if(KEY_6==0&&(KEY1==2||ZT==1))//當在復位狀態和暫停狀態下Z周可以調節低。
         {
        IT1=0;
           BUZ=0;
           i=50;
           for(i;i>0;i--)
          {
        for(j=0;j<125;j++){;}
          }
          BUZ=1; 
          FWBZ=0;

        }

        if(KEY_7==0&&KEY1==3)
         {
          IT1=1;
          BUZ=0;
          i=50;
          for(i;i>0;i--)
             {
          for(j=0;j<125;j++)
             {;}
             }
          BUZ=1;
          FWBZ=0;
          ZT=~ZT;
          while(KEY_7==0){;}
          i=50;
          for(i;i>0;i--)
              {
              for(j=0;j<125;j++) {;}
                
               }
          }
            if(KEY1==2&&FWBZ==1){EX1=1;}//當狀態是復位狀態關閉鍵盤響應,等待復位完成。
        else        {EX1=1;}

         


        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮