天天看点

数码管流动显示(自己的单片机)

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

*  标题:                  试验数码管上显示数字( 单片机直接实现位选 共阴极)        *

*                                                                                  *

*  连接方法: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--);

}