6位LED电子钟程序
2014年03月07日 点击:
编辑: kmwgm
一个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;
}
}
特点:
时位为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;
}
}
相关文章
- · 三菱FX系列PLC自学视频教程 2015-10-08
- · 零基础如何入门C语言 2015-08-17
- · 51单片机开发工具 2014-05-06
- · 06CD复制机黑屏求救 2017-02-14
- · 多功能测试仪V5.2 2015-05-31
- · 遥控测码软件 2016-01-04
- · 单片机驱动液晶显示屏的控制系统设计(资料) 2014-05-24
- · 从单片机过渡到嵌入式,深圳嵌入式培训专家提醒您 2015-09-12
- · 这么老的电脑,你们见过吗,CPU是几位的? 2014-12-10
- · 西门子S7-200CN自学视频教程(全) 2015-10-11