天天看點

數位管流動顯示(自己的單片機)

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

*  标題:                  試驗數位管上顯示數字( 單片機直接實作位選 共陰極)        *

*                                                                                  *

*  連接配接方法:P0與J12 用8PIN排線連接配接     P1與JP16 用排線連接配接                            *

***********************************************************************************

*                                                                                      *

* 請學員認真消化本例程,用573鎖存器控制和單片機腳直接位選控制(非譯碼器控制)數位管 *

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

#include <reg51.h> 

void delay(unsigned int i);      //函數聲名

char DelayCNT;//定義變量

//此表為 LED 的字模, 共陰數位管 0-9  - 

unsigned char code   Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};  //段碼控制

//此表為8個數位管位選控制, 共陰數位管 1-8個  - 

unsigned char code   dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};    //位選控制   查表的方法控制

/************主函數**********************/ 

main()

{  

   unsigned int i,LedNumVal=1 ;       //變量定義

   unsigned int LedOut[10];           //變量定義

   DelayCNT=0;

  while(1)

  {     

     if(++DelayCNT>=20)      //控制數字變化速度

     {

         DelayCNT=0;          //20個掃描周期清零一次

        ++LedNumVal;      //每隔20個掃描周期加一次

     }

     LedOut[0]=Disp_Tab[LedNumVal%10000/1000];

     LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;

     LedOut[2]=Disp_Tab[LedNumVal%100/10];

     LedOut[3]=Disp_Tab[LedNumVal%10];

     LedOut[4]=Disp_Tab[LedNumVal%10000/1000];       //千位

     LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80;  //百位帶小數點

     LedOut[6]=Disp_Tab[LedNumVal%100/10];           //十位

     LedOut[7]=Disp_Tab[LedNumVal%10];             //個位     

     for( i=0; i<8; i++) 

     {     

      P0 = LedOut[i];

      P1 = dispbit[i];   //使用查表法進行位選 

/*      switch(i)               //使用switch 語句控制位選       

         {        

            case 0:P1 = 0x7F;  break;         

            case 1:P1 = 0xbF;  break;                 

            case 2:P1 = 0xdF;  break; 

            case 3:P1 = 0xeF;  break; 

            case 4:P1 = 0xf7;  break;

            case 5:P1 = 0xfb;  break;

            case 6:P1 = 0xfd;  break;

            case 7:P1 = 0xfe;  break;

         }       */

        delay(150);         //掃描間隔時間      太長會數位管會有閃爍感

      }

  }   

}    

/*******************延時函數**********************************************/

void delay(unsigned int i)

{

    char j;

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

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

}