|
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define SMG_A_DP_PORT P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共陰0-F
u8 XS[8];//8段數(shù)碼管
u16 h,min,s,ms;//時(shí),分,秒 毫秒;
void delay_10us(u16 ten_us)//當(dāng)傳入Ten_us=1時(shí),大約延時(shí)10us
{
while(ten_us--);
}
void ZD0_init(void)
{
TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1
TH0=0XFC;//給定時(shí)器賦初值,定時(shí)1ms
TL0=0X17;
ET0=1; //打開定時(shí)器0中斷
EA=1; //打開總中斷
TR0=1;//打開定時(shí)器
}
void smg_display(void)//數(shù)碼管主程序
{
u8 i=0;
for(i=0;i<8;i++)
{
switch(i)//位選
{
case 0: LSC=1;LSB=1;LSA=1;break;
case 1: LSC=1;LSB=1;LSA=0;break;
case 2: LSC=1;LSB=0;LSA=1;break;
case 3: LSC=1;LSB=0;LSA=0;break;
case 4: LSC=0;LSB=1;LSA=1;break;
case 5: LSC=0;LSB=1;LSA=0;break;
case 6: LSC=0;LSB=0;LSA=1;break;
case 7: LSC=0;LSB=0;LSA=0;break;
}
P0=XS[i];//段送碼
delay_10us(100);
P0=0x00;//消音
}
}
void xianshishu()//第7 6 4 3 1 0位顯示數(shù)字
{
XS[0]=gsmg_code[s%10]; //秒位
XS[1]=gsmg_code[s/10]; //秒位
XS[3]=gsmg_code[min%10];//分位
XS[4]=gsmg_code[min/10];//分位
XS[6]=gsmg_code[h%10];//時(shí)位
XS[7]=gsmg_code[h/10];//時(shí)位
}
void hg()//橫杠閃爍判斷
{
if(ms==500)//橫杠500毫秒的判斷
{
XS[2]=0x40;//橫杠顯示
XS[5]=0x40;//橫杠顯示
}
else
{
XS[2]=0x00;//橫杠不顯示
XS[5]=0x00;//橫杠不顯示
}
}
void main()
{
ZD0_init();//定時(shí)器初始化
while(1)
{
xianshishu();//顯示位數(shù)程序
smg_display();//數(shù)碼管程序
}
}
void ZD0() interrupt 1 //定時(shí)器0中斷函數(shù)
{
TH0=0XFC;//給定時(shí)器賦初值,定時(shí)1ms
TL0=0X17;
ms++;
if(ms>=1000)//1000*ms=1s
{
ms=0;//毫秒清零
s++;
if(s>=60)//60秒
{
s=0;//秒清零
min++;
if(min>=60)//60分鐘
{
min=0;//分清零
h++;
if(h>=24)//24小時(shí)
{
h=0;//時(shí)清零
}
}
}
}
if(ms%500==0)////橫杠500毫秒的判斷
{
hg(); //橫杠程序
}
}
|
|