|
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code leddata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數(shù)碼管位選數(shù)據(jù)
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;//位選控制,二進(jìn)制在138譯碼器里轉(zhuǎn)成十進(jìn)制對(duì)應(yīng)的數(shù)碼管位
uint miao=0; //秒
uint fen=0; //分
uint shi=0; //時(shí)
uint n=0; //100us計(jì)數(shù)次數(shù)
uint date[]={0,0,0,0,0,0}; //時(shí),分,秒的個(gè)位和十位,此數(shù)組起到過(guò)度段碼參數(shù)的作用
void delay(uint z) //掃描顯示延時(shí)函數(shù)
{
uint x,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}
/************************************************************/
void led_num(uchar we) //數(shù)碼管位選
{
switch(we)//直接屏蔽了用不到的兩個(gè)位
{
case(0):
LSA=0;LSB=0;LSC=0; break;
case(1):
LSA=1;LSB=0;LSC=0; break;
case(3):
LSA=1;LSB=1;LSC=0; break;
case(4):
LSA=0;LSB=0;LSC=1; break;
case(6):
LSA=0;LSB=1;LSC=1; break;
case(7):
LSA=1;LSB=1;LSC=1; break;
}
}
/****************************************************************/
void led_date(uint a) //數(shù)碼管段選
{
P0=leddata[a];
}
/***************************************************************/
void display() //顯示函數(shù),逐條執(zhí)行
{
led_num(0);//送位選
led_date(date[0]);//送段選
delay(1);//顯示延時(shí)
P0 = 0x00;//結(jié)合前面的先送位選信號(hào),再送段選信號(hào),再消除段選端依然存在的高電平,可消除殘影
led_num(1);
led_date(date[1]);
delay(1);
P0 = 0x00;
led_num(3);
led_date(date[2]);
delay(1);
P0 = 0x00;
led_num(4);
led_date(date[3]);
delay(1);
P0 = 0x00;
led_num(6);
led_date(date[4]);
delay(1);
P0 = 0x00;
led_num(7);
led_date(date[5]);
delay(1);
P0 = 0x00;
}
/***********************************************************************/
void time_init() //定時(shí)器初始化函數(shù)
{
TMOD=0x02; //選擇方式2
TH0=156; //重裝初值為156
TL0=156; //運(yùn)行值為156
EA=1; //開(kāi)總中斷
ET0=1; //開(kāi)定時(shí)器0中斷
TR0=1; //開(kāi)定時(shí)器0
}
/***********************************************************************///主函數(shù)
void main()
{
time_init();
while(1)
{
display();
}
}
/************************************************************************/
void timer() interrupt 1 //定時(shí)器0中斷
{
n++;
if(n==10000) //當(dāng)n=10000時(shí),表示1s到了 !
{
n=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
date[0]=miao%10; //顯示秒的個(gè)位
date[1]=miao/10; //顯示秒的十位
date[2]=fen%10;
date[3]=fen/10;
date[4]=shi%10;
date[5]=shi/10;
}
}
//此例程使用的是8個(gè)共陰數(shù)碼管(2個(gè)4位的),位選端接138譯碼器輸出端,段選端接74HC573輸出,P0接573的輸入。
|
|