專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

用C語言實(shí)現(xiàn)鍵控彩燈系統(tǒng)

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2011年06月08日   【字體:

      用按鍵(采用外部中斷方式)控制彩燈的運(yùn)行。通過按動(dòng)按鍵,彩燈在三種閃亮方式(左移,右移和自定義花樣)之間切換。

        在主程序中,設(shè)置一個(gè)判斷的的標(biāo)志變量flag,當(dāng)沒有中斷發(fā)生時(shí),標(biāo)志flag的值沒有被改變,程序保持運(yùn)行使彩燈按其中某一種花樣閃亮顯示。若按下鍵后,使單片機(jī)產(chǎn)生中斷,中斷函數(shù)被調(diào)用,則標(biāo)志flag的值將發(fā)生一次改變(這里的中斷函數(shù)就是修改flag的值),在退出中斷后,主程序再次執(zhí)行到判斷標(biāo)志flag時(shí),由于標(biāo)志flag的值已經(jīng)是新的值,所以將執(zhí)行另一彩燈控制子程序,彩燈將按另一種花樣進(jìn)行顯示。

        需要說明一點(diǎn)是:如果產(chǎn)生中斷的是低電平不是由按鍵產(chǎn)生的,而是由于其他按鍵產(chǎn)生的沒有抖動(dòng)的信號(hào),在中斷程序中則不需要消抖處理。

 源程序:

#include     "reg51.h"

#define   uchar  unsigned  char

uchar   flag;

uchar   light,assum;

void  delay05s()

{

    unsigned  char   i,j,k;

     for(i=5;i>0;i--)

      for(j=200;j>0;j--)

        for(k=250;k>0;k--);

}

void   delay10ms(void)

{

    unsigned   char  i,j;

   for(i=20;i>0;i--)

     for(j=250;j>0;j--)

} 

void   left()

{

   light=light<<1;

   if(light==1)  light=0x01;

   P2=~light;

}

void  right()

{

    light=light>>1;

    if(light==0)  light=0x80;

    P2=~light;

}

void  assum()

{

   uchar  code  dispcode[8]={0x7e,0xbd.0xdb,0xe7,0xdb,0xbd,0x7e,0xff};

   if(assum==7)   assum=0;

   else

  assum++;

}

void  main()

{

   IT0=1;

  EX0=1;

  EA==1;

  flag=1;

  light=0x01;

  assum=0;

  while(1)

    {

         switch(flag)

             {

                   case  1:  left();   break;

                   case  2:   right();    break;

                   case  3:   assum()   break;

             }

        delay05s();

    }

}

void  int-0()   interrupt   0

{

     delay10ms();

     if(INT0==0)

       {

          flag++;

          if(flag>3)   flag=1;

       }

}
關(guān)閉窗口

相關(guān)文章