數碼管

硬软發表於2024-06-06
/******************************************************************************
此程式是依據吳堅鴻程式框架,在普中51 A2微控制器開發板上的程式練習
程式目標:數碼管顯示
*******************************************************************************/
#include<REG51.H>
#define Main_Fosc 12000000L //預設系統時鐘12Mhz
#define T1MS  (65536-Main_Fosc/12/1000)  //12分頻下1ms定時器的裝載值,n=t/T=t/(12/f)=0.001*f/12=f/12/1000
#define Scan_Time 1
unsigned char Seg_ScanFlag=0;
unsigned char Seg_ScanCNT;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
void Sys_Init();    //系統初始化
void Delay_Long();   //長延時,等待系統穩定
void Perpherial_Init();  //埠初始化
unsigned char code Seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void Seg_Display();
void main()
{
    Sys_Init(); 
    Delay_Long();
    Perpherial_Init();
    while (1)
    {
        ;
    }
    
}

void Sys_Init()
{
   TMOD=0X01;
   TL0=T1MS;
   TH0=T1MS>>8;
}
void Delay_Long()
{
    unsigned char i,j;
    for ( i = 0; i < 220; i++)
    {
        for(j=0;j<220;j++)
        {
                ;
        }  
    } 
}

void Perpherial_Init()
{
    TR0=1;
    ET0=1;
    EA=1;
}

void Seg_Display()
{
    static unsigned char Seg_ScanStep=0;
    if(0==Seg_ScanCNT)
    {
        P0=0X00;//消影
        switch (Seg_ScanStep)
        {
            case(0):
				LSA=1;LSB=1;LSC=1; break;//顯示第0位
			case(1):
				LSA=0;LSB=1;LSC=1; break;//顯示第1位
			case(2):
				LSA=1;LSB=0;LSC=1; break;//顯示第2位
			case(3):	
				LSA=0;LSB=0;LSC=1; break;//顯示第3位
			case(4):
				LSA=1;LSB=1;LSC=0; break;//顯示第4位
			case(5):
				LSA=0;LSB=1;LSC=0; break;//顯示第5位
			case(6):
				LSA=1;LSB=0;LSC=0; break;//顯示第6位
			case(7):
				LSA=0;LSB=0;LSC=0; break;//顯示第7位	
        }
        P0=Seg[Seg_ScanStep];
        Seg_ScanStep++;
        if (Seg_ScanStep>7)
        {
            Seg_ScanStep=0;
        }
        Seg_ScanFlag=0;
        Seg_ScanCNT=Scan_Time;
        Seg_ScanFlag=1;   
    }
}

void Timer0_ISR() interrupt 1
{
    Seg_Display();
    if ((1==Seg_ScanFlag)&&(Seg_ScanCNT>0))
    {
        Seg_ScanCNT--;
    }
    TL0=T1MS;
    TH0=T1MS>>8;
    
}

相關文章