久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> 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;}

 


}

關閉窗口

相關文章

主站蜘蛛池模板: 欧美韩一区二区 | 91在线资源| www.久久99 | 亚洲高清久久 | 日本不卡一区二区三区 | 国产日韩欧美一区 | 一区二区国产精品 | 亚洲精品成人在线 | 九色.com | 白浆在线 | 色免费在线视频 | 欧美日韩大陆 | 天天干狠狠操 | 国产精品一区二区不卡 | 日韩免费视频一区二区 | 国产成人精品免高潮在线观看 | 国产精品视频久久久久 | 久久天堂网 | 欧美性大战久久久久久久蜜臀 | 亚洲综合视频 | 九九在线 | 日韩在线一区视频 | 国产99精品| 国产精品成av人在线视午夜片 | 欧美日韩中文在线 | 精品日韩| 亚洲欧洲日韩 | 欧美综合一区二区 | av毛片 | 精品国产99 | 成人一级片在线观看 | 久久精品国产亚洲一区二区三区 | 97avcc| 久久久tv | 九九九久久国产免费 | 蜜臀网| av免费网 | 国产精品久久久久久久久图文区 | 亚洲精品一区在线 | 狠狠色综合欧美激情 | 久久这里只有精品首页 |