原理图及运行效果
源代码
#include "reg51.h"
#define TT 50000
unsigned char code seg[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};
void disp(char h,char m,char s);
char hour=11,minute=59,second=0,MODE=24,PM_FLAG=0,flash;
unsigned char t_50ms=0;
sbit H_key=P0^0;
sbit M_key=P0^1;
sbit RST_key=P0^2;
sbit MODE_key=P0^3;
delay(int t)
{
while(t--);
}
void timer_1() interrupt 3
{
TH1=(65536-TT)/256;
TL1=(65536-TT)%256;
t_50ms++;
if(t_50ms==20)
{
t_50ms=0;
second++;
}
if(t_50ms<10) flash=0;
else flash=1;
}
void process_key(void)
{
if(H_key==0)
{
hour++;
while(H_key==0);
}
if(M_key==0)
{
minute++;
while(M_key==0);
}
if(RST_key==0)
{
hour=0;
minute=0;
second=0;
PM_FLAG=0;
while(RST_key==0);
}
if(MODE_key==0)
{
if(MODE==24)
{
MODE=12;
if(hour>=12)
{
hour-=12;
PM_FLAG=1;
}
}
else
{
MODE=24;
hour=12*PM_FLAG+hour;
}
while(MODE_key==0);
}
}
int main()
{
TMOD=0X10;
TH1=(65536-TT)/256;
TL1=(65536-TT)%256;
ET1=1;
EA=1;
TR1=1;
while(1)
{
disp(hour,minute,second);
process_key();
if(second==60)
{
minute++;
second=0;
}
if(minute==60)
{
hour++;
minute=0;
}
if(hour==MODE)
{
hour=0;
if(MODE==12)
{
if(PM_FLAG==1) PM_FLAG=0;
else PM_FLAG=1;
}
}
if(MODE==24 && hour >=12)
{
PM_FLAG=1;
}
}
}
void disp(char h,char m,char s)
{
char n=0;
P1=0XFF;
P1=~seg[h/10%10];
P2=~(0x01<<n);
n++;
delay(100);
P1=0XFF;
P1=~seg[h%10];
P2=~(0x01<<n);
n++;
delay(100);
P1=0XFF;
P1=~seg[16+flash];
P2=~(0x01<<n);
n++;
delay(100);
P1=0XFF;
P1=~seg[m/10%10];
P2=~(0x01<<n);
n++;
delay(100);
P1=0XFF;
P1=~seg[m%10];
P2=~(0x01<<n);
n++;
delay(100);
P1=0XFF;
P1=~seg[16+flash];
P2=~(0x01<<n);
n++;
delay(100);
P1=0XFF;
P1=~seg[s/10%10];
P2=~(0x01<<n);
n++;
delay(100);
P1=0XFF;
P1=~seg[s%10];
P2=~(0x01<<n);
n++;
delay(100);
}