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

📄 tz_clock.c

📁 是一个关于驱动外部塔钟(多面)的C程序
💻 C
📖 第 1 页 / 共 3 页
字号:

#include <reg51.h>
#include <absacc.h>
#include <stdio.h>
#define	uchar unsigned char
#define uint unsigned int
#define RAM62256 0x8000/*外部RAM寄存器的地址*/
#define COM8279  XBYTE[0x6100]/*8279命令/状态口*/
#define DAT8279  XBYTE[0x6000]/*8279数据口*/
#define RL12887A XBYTE[0x400a]/*寄存器A*/
#define RL12887B XBYTE[0x400b]/*寄存器B*/
#define RL12887C XBYTE[0x400c]/*寄存器C*/
#define RL12887D XBYTE[0x400d]/*寄存器D*/
#define MOTO1_PORT 0x0000/*东面/南面子钟所用的端口*/
#define MOTO2_PORT 0x2000/*西面/北面子钟所用的端口*/
#define TZ3_OR_TZ9  0
#define MXB  0

typedef struct 
{uchar second;/*代表秒单元*/
uchar minute;/*代表分单元*/
uchar hour;}COMPLEX;/*代表时单元*/
COMPLEX hms_variant[7];/*hms_variant都具有COMPLEX结构类型的变量,包括母钟、东面、、、、北面,照明上限及下限*/
COMPLEX *p_timemu=hms_variant;
COMPLEX *p_timeslave;
uchar compare_zf(COMPLEX *x,COMPLEX *y);

uchar ZHUISHI,PROG_FLOW,BS_RSEG,DIS_RSEG,JS_COUNT,GPS_RSEG;
uchar bdata out_data;
sbit  DIN_DATA=out_data^7;
sbit  DOUT_DATA=out_data^0;

uint bdata biaozhi;
sbit MOTO_FLAG=biaozhi^0;
sbit MOTO_STOP_FLAG=biaozhi^1;
sbit ZM_FLAG=biaozhi^2;
sbit ADD_SUB_FLAG=biaozhi^3;
sbit MP3_FLAG=biaozhi^4;
sbit ZS_FLAG=biaozhi^5;
sbit SYN_FLAG=biaozhi^6;
sbit GPS_FLAG=biaozhi^7;
sbit COMPARE_FLAG=biaozhi^8;


sbit ZM_PIN=P1^7;      /*控制照明的引脚*/
sbit BS_PIN=P1^6;      /*控制报时的引脚*/
sbit MAX3100_DIN=P1^1; /*MAX3100的DIN接89C51的P1.1*/
sbit MAX3100_DOUT=P1^2;/*MAX3100的DOUT接89C51的P1.2*/
sbit MAX3100_SCLK=P1^3;/*MAX3100的SCLK接89C51的P1.3*/
sbit MAX3100_GPS=P1^4	;/*接受GPS的MAX3100的CS接89C51的P1.4*/
sbit MAX3100_BS=P1^5;
sbit MAX3100_DEVICE=P3^5;
sbit SEND_ENABLE=P1^0; /*控制与pc机通讯的使能位*/
	
uchar code dis_05array[14]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,\
0x7c,0x1b,0x78,0x71};/*分别代表0-9及报时与照明的段码!再加上上限与下限的段码!*/
uchar code * pdis=dis_05array; 

#if(TZ3_OR_TZ9==0)//表示是机芯tz3
	uchar code motor_forward_ew[6]={0x01,0x03,0x02,0x06,0x04,0x05};//表示东面及西面子钟正转动作 
	uchar code motor_forward_sn[6]={0x10,0x30,0x20,0x60,0x40,0x50};//表示南面及北面子钟正转动作  
	
	uchar code motor_back_ew[6]={0x04,0x06,0x02,0x03,0x01,0x05};//表示东面及西面子钟反转动作
	uchar code motor_back_sn[6]={0x40,0x60,0x20,0x30,0x10,0x50};//表示南面及北面子钟反转动作 

#elif	(TZ3_OR_TZ9==1)//表示是机芯tz9
	
	uchar code motor_forward_ew[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//表示东面及西面子钟正转动作 
	uchar code motor_forward_sn[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//表示南面及北面子钟正转动作  
	
	uchar code motor_back_ew[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//表示东面及西面子钟反转动作
	uchar code motor_back_sn[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};//表示南面及北面子钟反转动作 

#endif

uchar code *idata p_motor;//指向东南西北子钟正反转的地址

unsigned long bdata  my_24bs;
sbit bs0=my_24bs^0;sbit bs1=my_24bs^1;sbit bs2=my_24bs^2;sbit bs3=my_24bs^3;
sbit bs4=my_24bs^4;sbit bs5=my_24bs^5;sbit bs6=my_24bs^6;sbit bs7=my_24bs^7;
sbit bs8=my_24bs^8;sbit bs9=my_24bs^9;sbit bs10=my_24bs^10;sbit bs11=my_24bs^11;
sbit bs12=my_24bs^12;sbit bs13=my_24bs^13;sbit bs14=my_24bs^14;sbit bs15=my_24bs^15;
sbit bs16=my_24bs^16;sbit bs17=my_24bs^17;sbit bs18=my_24bs^18;sbit bs19=my_24bs^19; 
sbit bs20=my_24bs^20;sbit bs21=my_24bs^21;sbit bs22=my_24bs^22;sbit bs23=my_24bs^23;

void main(void)
{
void  must_go_onestep(void);
uchar compare_zf(COMPLEX * u, COMPLEX * v);
void motor_runzz_ew(uchar code *pointer);
void motor_runfz_ew(uchar code *pointer);
void motor_runzz_sn(uchar code *pointer);
void motor_runfz_sn(uchar code *pointer);
void dis_pub(COMPLEX *ux);
void display_led(void);
void initial_8279(void);
void initial_12887(void);
void initial_first(void);
void initial_gps3100(void);
void initial_bs3100(void);
void initial_device3100(void);
void func_slavehour(void);
void func_slavemin(void);
void func_muhour(void);
void func_mumin(void);
void pushdata_12887(void);
void get_all_time(void);
void push_ram62256(void);
void send_device_4byte(void);
void send_device_16byte(void);
void zm_on_off(void);
void bs_on_off(void);
void key_which_hour(void);
void key_which_min(void);
void key_which_sec(void);
void data_sendbs(void);
void data_senddevice(void);
void delay_ms(uint x);
void eastsou_slave_add(COMPLEX * ux);
void eastsou_slave_sub(COMPLEX * ux);
void westnor_slave_add(COMPLEX * ux);
void westnor_slave_sub(COMPLEX * ux);
uchar byte8(uchar x);
bit function_bs(void);
void func_zmhour(void);
uchar beijinghour(uchar *x,uchar *y);
uchar beijingmin(uchar *x,uchar *y);
uchar utlk1(uchar x,uchar y);
uchar utlk2(uchar x,uchar y);
uchar utlk3(uchar tx1,uchar tx2);
void  utlk_bs(uchar x,uchar y);
void  utlk_device(uchar x,uchar y);
void outram_topc(void);


XBYTE[MOTO1_PORT]=0x00;XBYTE[MOTO2_PORT]=0x00;
initial_8279();
delay_ms(200);biaozhi=0;
bs0=bs1=bs2=bs3=bs4=bs5=bs22=bs23=0;bs13=bs14=0;bs21=0;
bs6=bs7=bs8=bs9=bs10=bs11=bs12=bs15=bs16=bs17=bs18=bs19=bs20=1;
TMOD=0x21;
PCON=0x80;
SCON=0x50;
TH0=TH1=0xf3;
MAX3100_SCLK=0x00;
JS_COUNT=0;PROG_FLOW=1;BS_RSEG=0x00;DIS_RSEG=0x00;GPS_RSEG=0;
initial_12887();
initial_gps3100();
initial_bs3100();
initial_device3100();
initial_first();
get_all_time();//初始化所有时间及照明区域!
ES=1;TR0=1;TR1=1;IT1=1;PT0=1;
send_device_4byte();//给马工的子钟及一切区域子钟提供时间信号基准!
EA=1;
SYN_FLAG=1;
push_ram62256();//初始化进入片外RAM6264的数据准备供串口发送给pc机!

	while(1)
	{
		if(SYN_FLAG==1)
		{	
			//发送16个字节给所有从机,包括  0x5c+年高+年低+月+日+周+母时+母分+母秒+子时+子分+子秒+路数+地址+状态+累加和
			//if(p_timemu->second%1==0){send_device_16byte();}
			must_go_onestep();	//是否到了30秒要走时了别忘了正常走时动作		
			switch(PROG_FLOW)
			{	
				case 1://处理东面子钟追时动作!
				{	
					p_timeslave=&hms_variant[1];
					compare_zf(p_timemu,p_timeslave);
					if(MOTO_STOP_FLAG==0)
					{	switch(ZHUISHI)
						{	case 1:{motor_runzz_ew(motor_forward_ew);p_timeslave=&hms_variant[1];eastsou_slave_add(p_timeslave);}break;
				   		case 2:{motor_runfz_ew(motor_back_ew);p_timeslave=&hms_variant[1];eastsou_slave_sub(p_timeslave);}break;
							case 3:{XBYTE[MOTO1_PORT]=0;          PROG_FLOW=1;SYN_FLAG=0;   }break;					
						}	
					  push_ram62256();//重要数据进入片外RAM6264保存起来并且供串口发送给pc机!
					}
				}break;
			/*	case 2://处理南面子钟追时动作!
				{				
					p_timeslave=&hms_variant[2];
					compare_zf(p_timemu,p_timeslave);
					if(MOTO_STOP_FLAG==0)
					{	switch(ZHUISHI)
						{	case 1:{motor_runzz_ew(motor_forward_sn);p_timeslave=&hms_variant[2];eastsou_slave_add(p_timeslave);}break;
				   		case 2:{motor_runfz_ew(motor_back_sn);p_timeslave=&hms_variant[2];eastsou_slave_sub(p_timeslave);}break;
							case 3:{XBYTE[MOTO1_PORT]=0;PROG_FLOW=3;}break;					
						}
						push_ram62256();//重要数据进入片外RAM6264保存起来并且供串口发送给pc机!
					}	
				}break;
				case 3://处理西面子钟追时动作!
				{				
				  p_timeslave=&hms_variant[3];
					compare_zf(p_timemu,p_timeslave);
					if(MOTO_STOP_FLAG==0)
					{	switch(ZHUISHI)
						{	case 1:{motor_runzz_sn(motor_forward_ew);p_timeslave=&hms_variant[3];westnor_slave_add(p_timeslave);}break;
				   		case 2:{motor_runfz_sn(motor_back_ew);p_timeslave=&hms_variant[3];westnor_slave_sub(p_timeslave);}break;
							case 3:{XBYTE[MOTO2_PORT]=0;PROG_FLOW=4;}break;					
						}
						push_ram62256();//重要数据进入片外RAM6264保存起来并且供串口发送给pc机!
					}	
				}break;	
				case 4://处理北面子钟追时动作!
				{				
					p_timeslave=&hms_variant[4];
					compare_zf(p_timemu,p_timeslave);
					if(MOTO_STOP_FLAG==0)
					{	switch(ZHUISHI)
						{	case 1:{motor_runzz_sn(motor_forward_sn);p_timeslave=&hms_variant[4];westnor_slave_add(p_timeslave);}break;
				   		case 2:{motor_runfz_sn(motor_back_sn);p_timeslave=&hms_variant[4];westnor_slave_sub(p_timeslave);}break;
							case 3:{XBYTE[MOTO2_PORT]=0;PROG_FLOW=1;SYN_FLAG=0;}break;				
						}
						push_ram62256();//重要数据进入片外RAM6264保存起来并且供串口发送给pc机!	
					}
				}break;*/
			}
		}

		else
		{	
			push_ram62256();//重要数据进入片外RAM6264保存起来并且供串口发送给pc机!
		  /*if((p_timemu->minute%2==0)&&(p_timemu->second==5))
			{	send_device_4byte();//给马工的子钟及一切区域子钟提供时间信号基准!
			}*/
		 //发送16个字节给所有从机,包括  0x5c+年高+年低+月+日+周+母时+母分+母秒+子时+子分+子秒+路数+地址+状态+累加和
			if(p_timemu->second%1==0){send_device_16byte();}
			zm_on_off();//判断照明情况
			bs_on_off();//判断报时情况	
			must_go_onestep();//是否到了30秒要走时了
		}
		/*#elif(MXB==1)
			push_ram62256();//重要数据进入片外RAM6264保存起来并且供串口发送给pc机!		
		//发送16个字节给所有从机,包括  0x5c+年高+年低+月+日+周+母时+母分+母秒+子时+子分+子秒+路数+地址+状态+累加和
			if(p_timemu->second%1==0){send_device_16byte();}
			zm_on_off();//判断照明情况
			bs_on_off();//判断报时情况	
		#endif */
	}
}


void xt0(void) interrupt 1  
{ 
	TR0=0;TL0+=0xb9;if(CY==0){TH0+=0x3c;}else{TH0+=0x3d;}TR0=1;//调整精度很好用		
	JS_COUNT++;
	display_led();
	if(JS_COUNT==20)
	{	COMPARE_FLAG=0; 	  
		GPS_RSEG++;if(GPS_RSEG==80){GPS_FLAG=0;GPS_RSEG=0;}//用来给pc机传送gps标志信息的!
		#if(TZ3_OR_TZ9==0)
		{	JS_COUNT=0;p_timemu->second++;
			if(p_timemu->second==10){MOTO_FLAG=1;}
			else if(p_timemu->second==40){MOTO_FLAG=1;}
		  else if(p_timemu->second==60)
		  { 
			  p_timemu->second=0x00;p_timemu->minute+=1;
				if(p_timemu->minute==60)
				{	p_timemu->minute=0x00;p_timemu->hour+=1;p_timemu->hour%=24;}				
		  }
			pushdata_12887();
		}
		#elif(TZ3_OR_TZ9==1)
		{
			JS_COUNT=0;p_timemu->second++;
			if(p_timemu->second==12||p_timemu->second==24||p_timemu->second==36||p_timemu->second==48||p_timemu->second==54){MOTO_FLAG=1;}
		  else if(p_timemu->second==60)
		  { 
			  p_timemu->second=0x00;p_timemu->minute+=1;
				if(p_timemu->minute==60)
				{	p_timemu->minute=0x00;p_timemu->hour+=1;p_timemu->hour%=24;}				
		  }
			pushdata_12887();
		}
		#endif
	}
}



void xint0() interrupt 0
{	uchar temp;
	COM8279=0x40;
	temp=DAT8279;
	switch(temp)
	{
		case 0:{key_which_hour();}break;
		case 1:{key_which_min();}break;
		case 2:
		{	if(DIS_RSEG==0)
	    {	if(ADD_SUB_FLAG==1){p_timemu->second--;if(p_timemu->second==0xff){p_timemu->second=59;}}
			  else
				{p_timemu->second++;p_timemu->second%=60;}
			}
		}break;
		case 3:{ADD_SUB_FLAG=~ADD_SUB_FLAG;}break;
		case 4:{DIS_RSEG=4;BS_RSEG=0x00;}break;/*东面机芯有效!*/
	//	case 5:{DIS_RSEG=5;BS_RSEG=0x00;}break;/*南面机芯有效!*/
	//	case 6:{DIS_RSEG=6;BS_RSEG=0x00;}break;/*西面机芯有效!*/
	//	case 7:{DIS_RSEG=7;BS_RSEG=0x00;}break;/*北面机芯有效!*/
		case 8:{DIS_RSEG=0;BS_RSEG=0x00;}break;/*母钟有效!*/
		case 9:
		{	MOTO_STOP_FLAG=~MOTO_STOP_FLAG;
		  if(MOTO_STOP_FLAG==1)
			{	XBYTE[MOTO1_PORT]=0x00;
				XBYTE[MOTO2_PORT]=0x00;
			}	
		}break;
		case 10:{SYN_FLAG=1;}break;	//闰需同步追时!
		case 11:
		{	switch(BS_RSEG)//按动“子调”键可以手动设置报与不报时,与多媒体无关
				{case 0:{if(bs0==0){bs0=1;}else {bs0=0;}}break;case 1:{if(bs1==0){bs1=1;}else {bs1=0;}}break;
				 case 2:{if(bs2==0){bs2=1;}else {bs2=0;}}break;case 3:{if(bs3==0){bs3=1;}else {bs3=0;}}break;
				 case 4:{if(bs4==0){bs4=1;}else {bs4=0;}}break;case 5:{if(bs5==0){bs5=1;}else {bs5=0;}}break;
				 case 6:{if(bs6==0){bs6=1;}else {bs6=0;}}break;case 7:{if(bs7==0){bs7=1;}else {bs7=0;}}break;
				 case 8:{if(bs8==0){bs8=1;}else {bs8=0;}}break;case 9:{if(bs9==0){bs9=1;}else {bs9=0;}}break;
				 case 10:{if(bs10==0){bs10=1;}else {bs10=0;}}break;case 11:{if(bs11==0){bs11=1;}else {bs11=0;}}break;
				 case 12:{if(bs12==0){bs12=1;}else {bs12=0;}}break;case 13:{if(bs13==0){bs13=1;}else {bs13=0;}}break;
				 case 14:{if(bs14==0){bs14=1;}else {bs14=0;}}break;case 15:{if(bs15==0){bs15=1;}else {bs15=0;}}break;		
				 case 16:{if(bs16==0){bs16=1;}else {bs16=0;}}break;case 17:{if(bs17==0){bs17=1;}else {bs17=0;}}break;
				 case 18:{if(bs18==0){bs18=1;}else {bs18=0;}}break;case 19:{if(bs19==0){bs19=1;}else {bs19=0;}}break;
				 case 20:{if(bs20==0){bs20=1;}else {bs20=0;}}break;case 21:{if(bs21==0){bs21=1;}else {bs21=0;}}break;
				 case 22:{if(bs22==0){bs22=1;}else {bs22=0;}}break;case 23:{if(bs23==0){bs23=1;}else {bs23=0;}}break;
				}	
		}break;
		case 12:/*报时寄存器有效!*/
		{	DIS_RSEG=12;
		  BS_RSEG++;		  	
			if(BS_RSEG==24){BS_RSEG=0x00;}
		}break;
		case 13:{DIS_RSEG=13;ZM_FLAG=~ZM_FLAG;BS_RSEG=0xff;}break;/*对应报时的24个点的时间照明有效!*/
		case 14:
		{	if(DIS_RSEG==0)
			{p_timemu->second=0;JS_COUNT=0;}
		}break;
	}
}

void xint1(void) interrupt 2
{ uchar  idata received_gps[14];//除去起始符$后,一共有70个字节数据!包括CR+LF
  uchar *pi,*pk,jx;
	if(utlk3(0x00,0x00)==0x24)
	{ pi=received_gps;
		for(jx=0;jx<14;jx++)/*要顺次接收14个GPS格式的数据*/
		{	while((utlk1(0x40,0x00)&0x80)==0x00);
			*pi=utlk3(0x00,0x00);//读数据同时清除接收FIFO寄存器
			pi++;
	  }
	  pi=&received_gps[13];
    if(*pi==0x41 && p_timemu->second==29 )//0x41表示有效,0x56表示无效!
    {	
			pi=&received_gps[6];pk=&received_gps[7];
	    p_timemu->hour=beijinghour(pi,pk);
	    pi=&received_gps[8];pk=&received_gps[9];
	    p_timemu->minute=beijingmin(pi,pk);
	    pi=&received_gps[10];pk=&received_gps[11];
	    p_timemu->second=beijingmin(pi,pk);
			GPS_FLAG=1;GPS_RSEG=0;
    }
	}
}
	 	 /*NEWDATA1=(p_timemu->hour-received_gps[0]);
			NEWDATA2=(p_timemu->minute-received_gps[1]);
			NEWDATA3=(p_timemu->second-received_gps[2]);
			if((NEWDATA1==OLDDATA1)&&	(NEWDATA2==OLDDATA2)&&(NEWDATA3==OLDDATA3)){RXD_JS++;}else{RXD_JS=0;}
			OLDDATA1=NEWDATA1;
			OLDDATA2=NEWDATA2;
			OLDDATA3=NEWDATA3;
			if(RXD_JS==3)
		  {
				EA=0;JS_COUNT=1;
			  p_timemu->hour=received_gps[0];p_timemu->minute=received_gps[1];p_timemu->second=received_gps[2];
		 	  EA=1;
				if( NODE_ADDRESS==received_gps[9] )
				{	 T_R_ENA=0;//反馈给从机路数及地址
					 ES=0;	
					 SBUF=0xaa;while(TI==0);TI=0;							 
					 SBUF=0x58;while(TI==0);TI=0;
					 T_R_ENA=1;
					 ES=1;
				}
			}*/
//丛机回送给pc机AAH,串口初始化成功,表示主从机可以进行通讯,从机接收到AAH后,发送一个AAH字节响应主机! !
//上位机每隔设定的时间发送 bb 表示塔钟本身固化的音乐报时!
//丛机收到字节cc后,表示将要接收主机的数据包,该数据包包括母钟及四面子钟的时间和同步命令(同步命令发送DDH)!
//丛机收到字节dd后,表示塔钟多媒体音乐报时,从机返送一个数据包给pc机(15个字节最后一个是关于gps信息的)!
//寄存器存有报时开关的信息:0F0H是关,0F1H是开!

/*
select Case (register)
  Case 1
      txd_1rxd(0) = &H44                                 '要求下位机关断扩大机!
      Form1.MSComm1.Output = txd_1rxd
      GoTo myposi
  Case 2
      If (Minute(mu_time) = 59) Then
          txd_1rxd(0) = &H33
          MSComm1.Output = txd_1rxd                       '表示让下位机打开扩大机,进行MP3音乐报时!
      End If
      If (Second(mu_time) = 58 And SS(14) = &HF1) Then
          Form2.MMControl1.FileName = music_string1
          sound_flag = True
          bs_jsq = bs_temp
          Call rythem_open
      End If
  Case 3
      Form2.MMControl1.FileName = music_string0
      Call music_length
      If (SS(14) = &HF1) Then
          If (Minute(mu_time) = (59 - my_time1) And Second(mu_time) >= (60 - my_time2) + 3) Then
              Form2.MMControl1.FileName = music_string0    '对应某一点的音乐文件
              sound_flag = True
              bs_jsq = 0
              Call rythem_open
          End If
      End If
  Case 4
      Form2.MMControl1.FileName = music_string0
      Call music_length
      If (SS(14) = &HF1) Then
          If (Minute(mu_time) = (59 - my_time1) And Second(mu_time) >= (60 - my_time2) + 3) Then
              Form2.MMControl1.FileName = music_string0     '对应某一点的音乐文件
              sound_flag = True
              bs_jsq = bs_temp
              Call rythem_open
          End If
      End If
  Case Else
      txd_1rxd(0) = &H44    '要求下位机关断扩大机!
      Form1.MSComm1.Output = txd_1rxd
	分别对应:
	无前奏,无报时
	无前奏,有报时
	有前奏,无报时
	有前奏,有报时
*/

void sconn(void) interrupt 4
{	 
	 uchar jw;
	 RI=0;
	 if(SBUF==0xaa)
	 {	SEND_ENABLE=0;
	 		SBUF=0xaa;while(!TI);TI=0;
			for(jw=0;jw<15;jw++)
			{SBUF=0;while(!TI);TI=0;}	//回送15个0
			SEND_ENABLE=1;
	 }
	 else if(SBUF==0x44){XBYTE[0x800d]=0xf0;BS_PIN=1;}//关断扩大机    无前奏,无报时		 
	 else if((SBUF==0x33)&&(function_bs()==1))//表示pc机让下位机打开扩大机
	 {	XBYTE[0x800d]=0xf1;BS_PIN=0;//打开扩大机		
	 }		
	 else if(SBUF==0xbb){MP3_FLAG=0;SCON=0x40;ES=0;SEND_ENABLE=0;SBUF=0xbb;while(!TI);TI=0;outram_topc();SEND_ENABLE=1;SCON=0x50;ES=1;}
	 else if(SBUF==0xcc){;}//表示从机要接收主机的数据包,包括母钟及四面子钟的时间和同步命令(同步命令发送DDH)!
	 else if(SBUF==0xdd)
	 {	MP3_FLAG=1;SCON=0x40;ES=0;SEND_ENABLE=0;SBUF=0xdd;while(!TI);TI=0;outram_topc();SEND_ENABLE=1;SCON=0x50;ES=1;}//表示塔钟多媒体音乐报时!
	 								
	 
}

void display_led(void) //依次送出“秒分时”先送低位,再送高位
{	
	COM8279=0x90;
	switch (DIS_RSEG)
	{
		case 4:{p_timeslave=&hms_variant[1];dis_pub(p_timeslave);}break;
		case 5:{p_timeslave=&hms_variant[2];dis_pub(p_timeslave);}break;
		case 6:{p_timeslave=&hms_variant[3];dis_pub(p_timeslave);}break;	
		case 7:{p_timeslave=&hms_variant[4];dis_pub(p_timeslave);}break;
		case 0:{dis_pub(p_timemu);}break;
		case 12:
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -