📄 main.c
字号:
#include "fun.h"
#include "var.h"
void delay(uint i)
{while(i!=0)i--;
}
void kmg(void)
{KMG=0;
delay(1);
KMG=1;
}
void timejudge(void)
{uchar i;
if(binary_realtime.year>99)binary_realtime.year=0;
if(binary_realtime.month>12)binary_realtime.month=12;
else if(binary_realtime.month==0)binary_realtime.month=1;
if(binary_realtime.year%4)i=0;
else i=1;
if(binary_realtime.day>daytab[i][binary_realtime.month])
binary_realtime.day=daytab[i][binary_realtime.month];
else if(binary_realtime.day==0)binary_realtime.day=1;
if(binary_realtime.hour>23)binary_realtime.hour=23;
if(binary_realtime.minute>59)binary_realtime.minute=59;
if(binary_realtime.second>59)binary_realtime.second=59;
}
void datejudge(void)
{uchar i;
if(binary_24wcxx.year>99)binary_24wcxx.year=0;
if(binary_24wcxx.month>12)binary_24wcxx.month=12;
else if(binary_24wcxx.month==0)binary_24wcxx.month=1;
if(binary_24wcxx.year%4)i=0;
else i=1;
if(binary_24wcxx.day>daytab[i][binary_24wcxx.month])
binary_24wcxx.day=daytab[i][binary_24wcxx.month];
else if(binary_24wcxx.day==0)binary_24wcxx.day=1;
}
/***********************日期计算及校验************************/
//计算出昨天的日期
void yesterday(struct binary *p)
{uchar i;
//day>1时
if(--p->day)return;
//day=1,month>1时
if(--p->month)
{if(p->year%4)i=0;
else i=1;
p->day=daytab[i][p->month];
return;
}
//day=1,month=1时
p->day =31;
p->month=12;
if(p->year--)return; //year>0时
p->year =99; //year=0时
}
//累计天数校正
void totaldays(struct binary *p1,struct binary *p2)
{uchar i,j;
ulong days1,days2;
//p1存储中的日期,换算为天数days1
if(p1->year!=0)
days1=(ulong)p1->year*365+(p1->year-1)/4+1;
for(i=1;i<p1->month;i++)
{if(p1->year%4)j=0;
else j=1;
days1+=daytab[j][i];}
days1+=p1->day;
//p2实际日期,换算为天数days2
if(p2->year!=0)
days2=(ulong)p2->year*365+(p2->year-1)/4+1;
for(i=1;i<p2->month;i++)
{if(p2->year%4)j=0;
else j=1;
days2+=daytab[j][i];}
days2+=p2->day;
//days1,days2两者之差即为累计安全天数
if(days1<days2)
{p1->days+=(days2-days1);}
if(days1>days2)
{if(p1->days>(days1-days2))
p1->days-=(days1-days2);
else p1->days=0;
}
}
/*下一天*/
void nextday(uchar hpa)
{struct binary binary_buffer;
binary_buffer.year =binary_realtime.year;
binary_buffer.month=binary_realtime.month;
binary_buffer.day =binary_realtime.day;
if(binary_realtime.hour<18)yesterday(&binary_buffer);
if(binary_24wcxx.day !=binary_buffer.day ||
binary_24wcxx.month!=binary_buffer.month||
binary_24wcxx.year !=binary_buffer.year)
{totaldays(&binary_24wcxx,&binary_buffer);
//只有days的数值是正确的
//把昨天或今天的日期赋值给bcd_24wcxx
binary_24wcxx.day =binary_buffer.day;
binary_24wcxx.month=binary_buffer.month;
binary_24wcxx.year =binary_buffer.year;
wr_24wcxx(addrtab[hpa]);
}
}
//目标日期加100,目标天数加100
void adddays(struct binary *p)
{uchar i,j;
uchar num=100;
if(p->year%4)j=0;
else j=1;
for(i=(daytab[j][p->month])-(p->day)+1;num>=i;i=daytab[j][p->month])
{p->day=1;
num-=i;
if(++p->month>12)
{p->month=1;p->year++;
if(p->year%4)j=0;
else j=1;
}
}
p->day+=num;
p->days+=100;
}
/*下100天*/
void nextdays(uchar hpa)
{struct binary binary_buffer;
//取当前日期
binary_buffer.year =binary_realtime.year;
binary_buffer.month=binary_realtime.month;
binary_buffer.day =binary_realtime.day;
if(binary_realtime.hour<18)yesterday(&binary_buffer);
//目标日期计算
while((binary_buffer.year > binary_24wcxx.year)||
(binary_buffer.year ==binary_24wcxx.year &&
binary_buffer.month>binary_24wcxx.month)||
(binary_buffer.year ==binary_24wcxx.year &&
binary_buffer.month==binary_24wcxx.month&&
binary_buffer.day >=binary_24wcxx.day))
{adddays(&binary_24wcxx);
wr_24wcxx(addrtab[hpa]);
}
}
/**********************数据转换********************************/
void bcd1_binary_time(void)
{//年、月、日
binary_realtime.year =(bcd1_realtime.year >>4)*10+(bcd1_realtime.year &0x0f);
binary_realtime.month=(bcd1_realtime.month>>4)*10+(bcd1_realtime.month&0x0f);
binary_realtime.day =(bcd1_realtime.day >>4)*10+(bcd1_realtime.day &0x0f);
//时,分,秒
binary_realtime.hour =(bcd1_realtime.hour >>4)*10+(bcd1_realtime.hour &0x0f);
binary_realtime.minute=(bcd1_realtime.minute>>4)*10+(bcd1_realtime.minute&0x0f);
binary_realtime.second=(bcd1_realtime.second>>4)*10+(bcd1_realtime.second&0x0f);
}
void binary_bcd1_time(void)
{//年、月、日
bcd1_realtime.year =(binary_realtime.year /10<<4)|(binary_realtime.year %10);
bcd1_realtime.month=(binary_realtime.month/10<<4)|(binary_realtime.month%10);
bcd1_realtime.day =(binary_realtime.day /10<<4)|(binary_realtime.day %10);
//时、分、秒
bcd1_realtime.hour =(binary_realtime.hour /10<<4)|(binary_realtime.hour %10);
bcd1_realtime.minute=(binary_realtime.minute/10<<4)|(binary_realtime.minute%10);
bcd1_realtime.second=(binary_realtime.second/10<<4)|(binary_realtime.second%10);
}
void binary_bcd2_time(void)
{//年、月、日
bcd2_realtime.yearh =(binary_realtime.year /10)&0x0f;
bcd2_realtime.yearl =(binary_realtime.year %10)&0x0f;
bcd2_realtime.monthh=(binary_realtime.month/10)&0x0f;
bcd2_realtime.monthl=(binary_realtime.month%10)&0x0f;
bcd2_realtime.dayh =(binary_realtime.day /10)&0x0f;
bcd2_realtime.dayl =(binary_realtime.day %10)&0x0f;
//时、分、秒
bcd2_realtime.hourh =(binary_realtime.hour /10)&0x0f;
bcd2_realtime.hourl =(binary_realtime.hour %10)&0x0f;
bcd2_realtime.minuteh=(binary_realtime.minute/10)&0x0f;
bcd2_realtime.minutel=(binary_realtime.minute%10)&0x0f;
bcd2_realtime.secondh=(binary_realtime.second/10)&0x0f;
bcd2_realtime.secondl=(binary_realtime.second%10)&0x0f;
}
void bcd2_binary_time(void)
{//年、月、日
binary_realtime.year =bcd2_realtime.yearh *10+bcd2_realtime.yearl;
binary_realtime.month=bcd2_realtime.monthh*10+bcd2_realtime.monthl;
binary_realtime.day =bcd2_realtime.dayh *10+bcd2_realtime.dayl;
//时、分、秒
binary_realtime.hour =bcd2_realtime.hourh *10+bcd2_realtime.hourl;
binary_realtime.minute=bcd2_realtime.minuteh*10+bcd2_realtime.minutel;
binary_realtime.second=bcd2_realtime.secondh*10+bcd2_realtime.secondl;
}
//二进制转BCD
void binary_bcd(void)
{//年、月、日
bcd_24wcxx.yearh =(binary_24wcxx.year /10)&0x0f;
bcd_24wcxx.yearl =(binary_24wcxx.year %10)&0x0f;
bcd_24wcxx.monthh=(binary_24wcxx.month/10)&0x0f;
bcd_24wcxx.monthl=(binary_24wcxx.month%10)&0x0f;
bcd_24wcxx.dayh =(binary_24wcxx.day /10)&0x0f;
bcd_24wcxx.dayl =(binary_24wcxx.day %10)&0x0f;
//天数
bcd_24wcxx.days[0]=(uchar)((binary_24wcxx.days/10000)%10);
bcd_24wcxx.days[1]=(uchar)((binary_24wcxx.days/1000 )%10);
bcd_24wcxx.days[2]=(uchar)((binary_24wcxx.days/100 )%10);
bcd_24wcxx.days[3]=(uchar)((binary_24wcxx.days/10 )%10);
bcd_24wcxx.days[4]=(uchar)((binary_24wcxx.days )%10);
}
//BCD转二进制
void bcd_binary(void)
{//年、月、日
binary_24wcxx.year =bcd_24wcxx.yearh *10+bcd_24wcxx.yearl;
binary_24wcxx.month=bcd_24wcxx.monthh*10+bcd_24wcxx.monthl;
binary_24wcxx.day =bcd_24wcxx.dayh *10+bcd_24wcxx.dayl;
//天数
binary_24wcxx.days =(ulong)bcd_24wcxx.days[0]*10000;
binary_24wcxx.days+=(ulong)bcd_24wcxx.days[1]*1000 ;
binary_24wcxx.days+=(ulong)bcd_24wcxx.days[2]*100 ;
binary_24wcxx.days+=(ulong)bcd_24wcxx.days[3]*10 ;
binary_24wcxx.days+=(ulong)bcd_24wcxx.days[4] ;
}
/**************************************************/
void disp1(uchar hp)
{uchar i,j,x;
uchar *p;
if(hp==0)
{p=(uchar *)&bcd2_realtime;
for(i=0;i<12;i++)
{P2=clktab[hp][i];
j =regtab[hp][i];
j =(j<<4)|(*p++);
wr_bc728x(A_BCDReg,j);
}
}
else if(hp==1)
{p=(uchar *)&bcd_24wcxx;
p+=7;
x=0x0f;
for(i=8;i<12;i++,p++)
{P2=clktab[hp][i];
j =regtab[hp][i];
if((*p!=0)||(x!=0x0f)||(i==11))x=*p;
j =(j<<4)|x;
wr_bc728x(A_BCDReg,j);
}
}
else if(hp==2)
{p=(uchar *)&bcd_24wcxx;
p+=6;
x=0x0f;
for(i=7;i<12;i++,p++)
{P2=clktab[hp][i];
j =regtab[hp][i];
if((*p!=0)||(x!=0x0f)||(i==11))x=*p;
j =(j<<4)|x;
wr_bc728x(A_BCDReg,j);
}
}
else if(hp<29)
{p=(uchar *)&bcd_24wcxx;
for(i=1;i<7;i++)
{P2=clktab[hp][i];
j =regtab[hp][i];
j =(j<<4)|(*p++);
wr_bc728x(A_BCDReg,j);
}
x=0x0f;
for(i=7;i<12;i++,p++)
{P2=clktab[hp][i];
j =regtab[hp][i];
if((*p!=0)||(x!=0x0f)||(i==11))x=*p;
j =(j<<4)|x;
wr_bc728x(A_BCDReg,j);
}
}
}
void disp2(uchar hp)
{uchar i,j,x;
uchar *p;
if(hp==0)
{p=(uchar *)&bcd2_realtime;
for(i=0;i<12;i++)
{P2=clktab[hp][i];
j =regtab[hp][i];
j =(j<<4)|(*p++);
wr_bc728x(A_BCDReg,j);
}
}
else if(hp==1||hp==2)
{p=(uchar *)&bcd_24wcxx;
p+=6;
x=0x0f;
for(i=7;i<12;i++)
{P2=clktab[hp][i];
j =regtab[hp][i];
j =(j<<4)|(*p++);
wr_bc728x(A_BCDReg,j);
}
}
else if(hp<29)
{p=(uchar *)&bcd_24wcxx;
for(i=1;i<12;i++)
{P2=clktab[hp][i];
j =regtab[hp][i];
j =(j<<4)|(*p++);
wr_bc728x(A_BCDReg,j);
}
}
}
void disptime(void)
{rd_date();
bcd1_binary_time();
timejudge();
binary_bcd2_time();
P2=0xf7; //
while(rd_bc728x(A_ModReg)!=D_ModReg)wr_bc728x(A_ModReg,D_ModReg); //工作模式设置
disp1(0);
}
void dispall(void)
{uchar hp,i;
RST=0;
delay(0xff);
RST=1;
delay(0xff);
for(i=0xf7;i>=0xe0;i--)
{P2=i;
while(rd_bc728x(A_ModReg)!=D_ModReg)wr_bc728x(A_ModReg,D_ModReg); //工作模式设置
}
for(hp=0;hp<29;hp++)
{if(hp==0)
{rd_date();
bcd1_binary_time();
timejudge();
binary_bcd2_time();
disp1(hp);
}
else if(hp==1||hp==2)
{rd_24wcxx(addrtab[hp]);
datejudge();
nextday(hp);
binary_bcd();
if(flag_key)disp2(hp);
else disp1(hp);
}
else if(hp<29)
{rd_24wcxx(addrtab[hp]);
datejudge();
nextdays(hp);
binary_bcd();
if(flag_key)disp2(hp);
else disp1(hp);
}
}
}
void dispone(uchar hp,uchar lp,uchar value)
{P2=clktab[hp][lp];
value|=(regtab[hp][lp]<<4);
wr_bc728x(A_BCDReg,value);
wr_bc728x(0x10,0xff);
wr_bc728x(0x19,0xff);
}
void dispstop(uchar hp,uchar lp)
{P2=clktab[hp][lp];
wr_bc728x(0x10,0xff);
wr_bc728x(0x19,0xff);
}
void dispflicker(uchar hp,uchar lp)
{uchar j;
uint i;
P2=clktab[hp][lp];
i=(0x0001<<regtab[hp][lp]);
i^=0xffff;
j=(uchar)i;
wr_bc728x(0x10,j);
i>>=8;
j=(uchar)i;
wr_bc728x(0x19,j);
}
/*************************************************/
int main(void)
{
TMOD=0;
TCON=0;
SCON=0;
IP=0;
IE=0;
P0=0XFF;
P1=0XFF;
P2=0XFF;
P3=0XFF;
flag_key=FALSE;
kmg();
init_bc728x();
init_sd2300api();
kmg();
dispall();
//init_int0();
while(1)
{kmg();
if(flag_key)
{if(num_t1>0xf0)
keyout();
}
else if(!INT0)
//else if(flag_int0)
{if(binary_realtime.minute==0&&binary_realtime.second==0)
{while(!wr_control2());
dispall();
kmg();
}
else //秒中断
{while(!wr_control2());
disptime();
}
while(!INT0)wr_control2();
//flag_int0=FALSE;
// EX0=1;
}
//else EX0=1;
if(!D)
{//EX0=0;
ET1=0;
init_t0();
while(!flag_frame);
key();
ET1=1;
//if(!flag_key)EX0=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -