/******************************************************************************
此程式是依據吳堅鴻程式框架,在普中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;
}