石头

深入浅出玩转51单片机——学习笔记:数码管动态显示1

0
阅读(3946)

/************************************************
实现功能:数码管动态显示,依次显示01234567
硬件平台:基于MGMC-V1.0实验板
晶振频率:11.0592Mhz
时间:2014年5月14日

*************************************************/
#include<reg52.h>

typedef unsigned char uint8;
typedef unsigned int  uint16;

uint8 i = 0;
uint8 j = 0;
uint8 time_1ms = 0;

sbit We_En = P1^6;      //数码管位选端
sbit Du_En = P1^7;      //数码管段选端

uint8 code SEG_Tab[8] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
                      
void initial_myself();         //上电初始化
void Delayms(uint16 z);	   //延时函数
void initial_peripheral();     //外围设备初始化

void main()
{
    initial_myself();          //上电初始化
    Delayms(10);           //延时函数
    initial_peripheral();      //外围设备初始化
    while(1)
    {
        if(1 == time_1ms)
        {
             time_1ms = 0;
             switch(j)       //动态刷新函数
            {
                 case 0:     //刷新第1个数码管
                 Du_En = 1; P0 = 0x00; Du_En = 0;
                 We_En = 1; P0 = 0xfe; We_En = 0;
                 P0 = 0x00;
                 Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
                 j++;
                 i++;
                 break;

                 case 1:     //刷新第2个数码管
                 Du_En = 1; P0 = 0x00; Du_En = 0;
                 We_En = 1; P0 = 0xfd; We_En = 0;
                 P0 = 0x00;
                 Du_En = 1; P0 = SEG_Tab[i];Du_En = 0;
                 j++;
                 i++;
                 break;

                case 2:	 //刷新第3个数码管
                Du_En = 1; P0 = 0x00; Du_En = 0;
                We_En = 1; P0 = 0xfb; We_En = 0;
                P0 = 0x00;
                Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
                j++;
                i++;
                break;

                case 3:	   //刷新第4个数码管
                Du_En = 1; P0 = 0x00; Du_En = 0;
                We_En = 1; P0 = 0xf7; We_En = 0;
                P0 = 0x00;
                Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
                j++;
                i++;
                break;

                case 4:	   //刷新第5个数码管
                Du_En = 1; P0 = 0x00; Du_En = 0;
                We_En = 1; P0 = 0xef; We_En = 0;
                P0 = 0x00;
                Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
                j++;
                i++;
                break;

                case 5:	   //刷新第6个数码管
                Du_En = 1; P0 = 0x00; Du_En = 0;
                We_En = 1; P0 = 0xdf; We_En = 0;
                P0 = 0x00;
                Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
                j++;
                i++;
                break;

                case 6:	 //刷新第7个数码管
                Du_En = 1; P0 = 0x00; Du_En = 0;
                We_En = 1; P0 = 0xbf; We_En = 0;
                P0 = 0x00;
                Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
                j++;
                i++;
                break;

                case 7:	 //刷新第8个数码管
                Du_En = 1; P0 = 0x00; Du_En = 0;
                We_En = 1; P0 = 0x7f; We_En = 0;
                P0 = 0x00;
                Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
                j = 0;
                i = 0;
                break;
           }
        }
    }   
}

void initial_myself()     //上电初始化
{
    P0 = 0xff;
    We_En = 0;      //关位选
    Du_En = 0;       //关段选

    TMOD &= 0xf0;
    TMOD |= 0x01;     //定时器0模式1
    TH0 = 0xfc;          //赋初值,时间为1ms
    TL0 = 0x66;

}

void initial_peripheral()     //外围设备初始化
{
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void T0_interrupt() interrupt 1
{
    TF0 = 0;
    TH0 = 0xfc;
    TL0 = 0x66;
    time_1ms = 1;
}

void Delayms(uint16 z)	  //延时函数
{
    uint16 x,y;
    for(x = 0; x < z; x++)
      for(y = 0; y < 100; y++);
}