1.6位共陰極數碼管顯示時,分,秒。
2.調時功能,且在調時時具體調整位閃爍顯示。仿真圖及效果:
程序:
//------頭文件------
#include<reg51.h>
//------宏定義-------
#define uchar unsigned char
#define uint unsigned int
//------端口定義-----
sbit duan=P2^6;
sbit wei=P2^7;
sbit fm=P2^2;
sbit S2=P3^4;
sbit S3=P3^5;
sbit S4=P3^6;
sbit S5=P3^7;
//------變量定義-----
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//公陰極數碼管顯示0~9;
uint shi=23,fen=59,miao=55,counter=0;
uchar flag_1s,flag_m,num=0,i=0,m=0;
//------函數聲明-----
void csh();
void mode();
void zoushi();
void tiaoshi();
void xianshi();
void baoshi();
void delay(uchar x);
//---------主函數------------
void main()
{
csh();
while(1)
{
mode();
if(flag_m==1)
{
TR0=1;
zoushi();
baoshi();
}
else
{
tiaoshi();
}
xianshi();
}
}
//-----------初始化函數--------------
void csh()
{
EA=1;
TMOD=0x11; //選擇兩個定時器/計數器的方式一
ET0=1; //定時器/計數器0溢出中斷允許
TH0=15536/256;
TL0=15536&256;
ET1=1; //定時器/計數器1溢出中斷允許
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
TR1=1; //啟動定時器/計數器1
}
//-----------時鐘秒變量---------
void T0_ser() interrupt 1
{
TH0=15536/256;
TL0=15536&256;
counter++;
if(counter==20)
{
flag_1s=1;
counter=0;
}
}
//---------閃爍顯示變量---------
void T1_ser() interrupt 3
{
TH1=15536/256;
TL1=15536&256;
m++;
if(m==20)
{
m=0;
}
}
//-----------------切換模式函數---------------
void mode()
{
if(S2==0)
{
delay(10);
if(S2==0)
{
num=num+1;
while(!S2)xianshi();
switch(num%2)
{
case 0:flag_m=0;break;
case 1:flag_m=1;break;
}
if(num==2)
num=0;
}
}
}
//---------------走時函數--------------------
void zoushi()
{
if(flag_1s==1)
{
flag_1s=0;
if(++miao>59)
{
miao=0;
if(++fen>59)
{
fen=0;
if(++shi>23)
shi=0;
}
}
}
}
void tiaoshi() //調時函數定義
{
if(flag_m==0&&S3==0)
{
delay(10);
if(S3==0)
{
i++;
while(!S3)
xianshi();
}
if(i==3)
{
i=1;
}
}
if(i==1)
{
if(S4==0)
{
delay(10);
if(S4==0)
{
shi++;
if(shi==24)
shi=0;
while(!S4)
xianshi();
}
}
if(S5==0)
{
delay(10);
if(S5==0)
{
shi--;
if(shi==-1)
shi=23;
while(!S5)
xianshi();
}
}
}
if(i==2)
{
if(S4==0)
{
delay(10);
if(S4==0)
{
fen++;
if(fen==60)
fen=0;
while(!S4)
xianshi();
}
}
if(S5==0)
{
delay(10);
if(S5==0)
{
fen--;
if(fen==-1)
fen=59;
while(!S5)
xianshi();
}
}
}
}
void xianshi()
{
P0=0xdf;
wei=1;
wei=0;
P0=table_du[miao%10];
duan=1;
duan=0;
delay(10);
P0=0xef;
wei=1;
wei=0;
P0=table_du[miao/10];
duan=1;
duan=0;
delay(10);
P0=0xf7;
wei=1;
wei=0;
if(flag_m==0&&i==2) //調時顯示判斷
{
if(m<10) //閃爍顯示
P0=table_du[fen%10]|0x80;
else
P0=0x00|0x80;
}
else
P0=table_du[fen%10]|0x80;
duan=1;
duan=0;
delay(10);
P0=0xfb;
wei=1;
wei=0;
if(flag_m==0&&i==2)
{
if(m<10)
P0=table_du[fen/10];
else
P0=0x00;
}
else
P0=table_du[fen/10];
duan=1;
duan=0;
delay(10);
P0=0xfd;
wei=1;
wei=0;
if(flag_m==0&&i==1)
{
if(m<10)
P0=table_du[shi%10]|0x80;
else
P0=0x00|0x80;
}
else
P0=table_du[shi%10]|0x80;
duan=1;
duan=0;
delay(10);
P0=0xfe;
wei=1;
wei=0;
if(flag_m==0&&i==1)
{
if(m<10)
P0=table_du[shi/10];
else
P0=0x00;
}
else
P0=table_du[shi/10];
duan=1;
duan=0;
delay(10);
}
//-----------------整點提醒函數-------------
void baoshi()
{
if (fen==0&&miao==0)
fm=0;
if(miao==5)
fm=1;
}
//-----------------延時函數---------------
void delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=200;b>0;b--);
}
|