- UID
- 561154
- 阅读权限
- 1
- 推广
-
- 幽默
-
- 注册时间
- 2014-3-6
- 最后登录
- 1970-1-1
|
注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。
您需要 登录 才可以下载或查看,没有帐号?快速注册
x
一个6位电子钟程序
特点:
时位为0时不显示。
时位、分位小数点以秒闪烁
调整时、分时所调位闪动闪动。
走时精度可调到每天小于1秒。
LED为共阳极
C语言程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
int i,sec,min,h,flag;
sbit sg=P2^4;
sbit ss=P2^3;
sbit mg=P2^2;
sbit ms=P2^7;
sbit hg=P2^6;
sbit hs=P2^5;
sbit key_ch=P3^5;
sbit key_add=P3^6;
sbit key_minus=P3^7;
uchar code table[16]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code table1[16]=
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
void init();
void delay(uint);
void secont_display();
void minute_display();
void hour_display();
void control();
void time();
void main()
{
init();
while(1)
{
secont_display();
minute_display();
hour_display();
control();
}
}
void init()//初始化
{
i=0;
sec=0;
min=0;
h=0;
flag=0;
P1=0xff;
P2=0xff;
P3=0xff;
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
}
void delay(uint z)//延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void secont_display()//秒显示
{
int sec_shi,sec_ge;
sec_shi=sec/10;
sec_ge=sec%10;
P0=table[sec_ge];
sg=0;
delay(1);
sg=1;
P0=table[sec_shi];
ss=0;
delay(1);
ss=1;
}
void minute_display()//分显示
{
int min_shi,min_ge;
min_shi=min/10;
min_ge=min%10;
if(i<=10)
{P0=table1[min_ge];}
else
P0=table[min_ge];
if(i<=10&&flag==1)
mg=1;
else
mg=0;
delay(1);
mg=1;
P0=table[min_shi];
ms=0;
delay(1);
ms=1;
}
void hour_display()//时显示
{
int h_shi,h_ge;
h_shi=h/10;
h_ge=h%10;
if(i<=10)
{P0=table1[h_ge];}
else
P0=table[h_ge];
if(i<=10&&flag==2)
hg=1;
else
hg=0;
delay(1);
hg=1;
P0=table[h_shi];
if(h_shi==0)
{hs=1;}
else
hs=0;
delay(1);
hs=1;
}
void control()
{
if(!key_ch)
{
delay(5);
if(!key_ch)
{
flag++;
if(flag==3)
flag=0;
}
}
while(!key_ch);
if(flag==1 && key_add==0)
{ delay(5);}
if(flag==1 && key_add==0)
{ while(!key_add);
min++;
if(min==60)
min=0;
}
if(flag==1 && key_minus==0)
{ delay(5);}
if(flag==1 && key_minus==0)
{ while(!key_minus);
min--;
if(min==-1)
min=59;
}
if(flag==2 && key_add==0)
{delay(5);}
if(flag==2 && key_add==0)
{ while(!key_add);
h++;
if(h==13)
h=1;
}
if(flag==2 && key_minus==0)
{delay(5);}
if(flag==2 && key_minus==0)
{ while(!key_minus);
h--;
if(h==-1)
h=12;
}
}
void T0_rpt() interrupt 1
{
TH0=(65536-49972)/256;//加減49972值可精确调整时间
TL0=(65536-49972)%256;
i++;
time();
}
void time()
{
if(i==20)
{i=0;
sec++;
}
if(sec==60)
{
sec=0;
min++;
}
if(min==60)
{
min=0;
h++;
}
if(h==13)
{
h=1;
min=0;
sec=0;
}
}
|
|