⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是铁路各工区
💻 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 + -