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

📄 hzmmimain18.c

📁 ATMEL的ATMEGA128驱动160×80液晶调试程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	for(;;)
	{//取得当前汉化表指针
		const CSTR *p;

		p=(const CSTR *)sbxh[EEPROMread(eep_sbxh)].HzTable;
		face_str=p[1].str;
		SetTable=(const DaiMa *)p[2].str;
		AnalogTable=(const DaiMa *)p[3].str;
		KeyTable=(const DaiMa *)p[4].str;
		ReportTable=(const DaiMa *)p[5].str;
		CTL_DOT_CPU=(const CSTR *)p[6].str;
		work_mode=(word)p[7].str;
		if(work_mode&0x1000)
		{
			WORK_SETTING_AREA=(word)p[8].str;
			TOTAL_SETTING_AREA=(word)p[9].str;
		}
		else
		{
			WORK_SETTING_AREA=16;
			TOTAL_SETTING_AREA=8;
		}
		break;
	}

	STATUS_WORD=0;
	RPT_TIME[0]=0x5a;

	if(EEPROMread(eep_CPU_NUB+7)!=1)
	{//如果未对cpu板设置过,则以开出表为依据设置cpu板投退
		EEPROMwrite(eep_CPU_NUB+7,1);
		for(i=1;i<=TOTAL_CPU_NUMBER;i++)
			if(CTL_DOT_CPU[i].str==0)
				EEPROMwrite(eep_CPU_NUB+i,0);
			else
			{
				if((word)CTL_DOT_CPU[i].str==1)
				{//对有录波板的装置,初始化录波报告设置
					EEPROMwrite(eep_lb_r,EEPROMread(eep_lb_r)&1);
					EEPROMwrite(eep_lb_d,EEPROMread(eep_lb_d)&1);
					EEPROMwrite(eep_lb_u,(((EEPROMread(eep_lb_u)-1)&0x0f)+1)&0x0f);
					EEPROMwrite(eep_lb_i,(((EEPROMread(eep_lb_i)-1)&0x0f)+1)&0x0f);
				}
				EEPROMwrite(eep_CPU_NUB+i,1);
			}
	}

	for(i=0;i<=TOTAL_CPU_NUMBER;i++)
		if(EEPROMread(eep_CPU_NUB+i)>=2)//如果对应cpu板设置有错,则置为无效
			EEPROMwrite(eep_CPU_NUB+i,0);

	poll_seq=0;
	CPU_ID=0;
	for(i=1;i<=TOTAL_CPU_NUMBER;i++)
		if(EEPROMread(eep_CPU_NUB+i)==1)
		{
			poll_seq=i;
			CPU_ID++;//投入的cpu板个数
			Q_KEY[poll_seq]=0xaa;
		}
	if((CPU_ID==0)||(poll_seq==1))
	{//只有一个CPU板且为CPU1
		if(EEPROMread(eep_CPU_NUB+0)!=1)
			EEPROMwrite(eep_CPU_NUB+0,1);
		if(EEPROMread(eep_CPU_NUB+1)!=1)
			EEPROMwrite(eep_CPU_NUB+1,1);
		poll_seq=1;
		CPU_ID=1;
		cpu_name=1;
	}
	else//不止一个CPU板或不为CPU1
	if((CPU_ID!=1)||(poll_seq!=1))
		if(EEPROMread(eep_CPU_NUB+0)!=0)
			EEPROMwrite(eep_CPU_NUB+0,0);

	cpu_name=poll_seq;
	CPU_ID=poll_seq<<5;
}
//毫秒定时器
void ms_cont_routine(void)//各定时器减一操作,减为一置到时标志;
{
	if(trigger)
	{
		if(trigger_t>trigger)
			trigger_t=trigger-1;
		else
		if(trigger_t)trigger_t--;
		else
		{
			trigger_t=trigger-1;
			trigger_f=TRUE;
		}
	}
	if(poll_timer)
	{
		if(poll_timer_t>poll_timer)
			poll_timer_t=poll_timer-1;
		else
		if(poll_timer_t)poll_timer_t--;
		else
		{
			poll_timer_t=poll_timer-1;
			poll_timer_f=TRUE;
		}
	}
	if(lamp_last_timer)lamp_last_timer--;
	if(wait_synch_timer>LON_WAITTIME)
		wait_synch_timer=LON_WAITTIME;
	if(wait_synch_timer)wait_synch_timer--;
	if(synch_timer>LON_WAITTIME)
		synch_timer=LON_WAITTIME;
	if(synch_timer)synch_timer--;
	if(comm_timer>COM_TIMEOUT)
		comm_timer=COM_TIMEOUT;
	if(comm_timer)comm_timer--;
}
//秒定时器
void s_cont_routine(void)//各定时器减一操作,减为零时,置到时标志;
{
	clock_timer_f=TRUE;
	s_count++;
	if(comm_timer>10)
		comm_timer=10;
	if(cycle_timer)
	{
		if(cycle_timer_t)cycle_timer_t--;
		else
		{
			cycle_timer_t=cycle_timer-1;
			cycle_timer_f=TRUE;
		}
	}
	if(key_timer)key_timer--;
	if(ATTENTION_timer>60)
		ATTENTION_timer=60;
	if(ATTENTION_timer)ATTENTION_timer--;
	if(detect_timer)detect_timer--;
	if(desk_pause>10)
		desk_pause=10;
	if(desk_pause)desk_pause--;
}
//计算与cpu串口通讯数据的校验和;
byte chk_sum(word rcv_cnt)
{
	byte sum;
	word i;

	sum=commu_buf[rcv_cnt-1];
	for(i=0;i<(rcv_cnt-1);i++)
		sum -= commu_buf[i];
	return sum;
}
//显示串口通讯的数据;本函数用于调试
void disp_comm(word num)
{
	word i;

	csprintf(disp_buffer,"com=%d   ",num);
	for(i=0;(i<16)&&(i<num);i++)
		csprintf(disp_buffer+i+i+7,(commu_buf[i]>=16)?"%x":"0%x",commu_buf[i]);
	str_sasc(64,0,disp_buffer);
}
//本函数用于查寻cpu板通过硬件送上来的信息,使MMI处于关注状态,同时记下此时的时间
//为纪录报告做准备
void trigger_routine(void)
{
	byte i,s_bit;
	static byte GPS_disp=FALSE;

	if(GPS_en&0xf0)
	{//GPS有效时显示天线图标
		if(mstimer2<500)
		{//在整秒过半秒时显示
			if(GPS_disp==FALSE)
			{
				disp_GPS();
				GPS_disp=TRUE;
			}
		}
		else
			GPS_disp=FALSE;
	}

	if((ctl_data&COM_SEL)!=COM_SEL)
	{//当处于与PC机通讯状态时,检查已有多长时间未通讯
		rcv_cnt=com_rcv(0xff);
		if(rcv_cnt==0)
		{
			if(detect_timer==0)
			{
				ctl_data|=COM_SEL;
				init_disp();
				PC_QUIT=0;
			}
		}
		else
			detect_timer=PC_DETECT;
	}
//液晶背光点亮的条件;
	if((CYCLE_FLAG!=FALSE)||(menu_in!=FALSE)||(STATUS_WORD!=0)
	||(PC_QUIT==0xa5)||(key_timer!=0)||(ATTENTION!=FALSE))
		ctl_data|=LCD_LED;
	else
		ctl_data&=~LCD_LED;
//ATTEN:
	s_bit=PINF&ATTN;
	if(s_bit==0)
	{//MMI被通知应处于关注状态
		if((menu_in!=FALSE)||(CYCLE_FLAG!=FALSE)||(STATUS_WORD==3)||
		   (PC_QUIT==0xa5)||(ALM_WORD_att))
			waiting=0;
		else
		{
			if(waiting==0)
			{
				cstrcpy(disp_buffer,"装置正在启动");
				disp_wait(1*16);
			}
			else
			{
				cstrcpy(disp_buffer,"+");
				str_hz(3*16,waiting/16,disp_buffer);
			}
			waiting++;
			if(waiting>=20*16)
				waiting=0;
		}
		if(ATTENTION==FALSE)
		{//关注标志为假,则做如下初始化:
			ATTENTION=TRUE;
			lamp_last_timer=200;
			ATTENTION_timer=60;
			ALM_WORD_att=0;		//告警状态字清零

			report_time_lock();	//记下起动时间
			if(STATUS_WORD==1)
			{
				STATUS_WORD=0;
				cls();
			}
		}
		else
		{//关注标志已经为真,则做如下处理
			if(lamp_last_timer==0)
			{//运行灯每隔200ms变换一次状态
				lamp_last_timer=200;
				PORTD^=RUN_LAMP;
			}

			if((ATTENTION_timer==0)&&(ALM_WORD_att==0))
			{//关注时间太长,告警
				alarm();
				ALM_WORD_att=1;

				if(CYCLE_FLAG==FALSE)
					rpt_ram_clr();
				cstrcpy(&disp_buffer[0],"CPU板启动超时!   ");
				memcpy(&rpt_ram_buf[ram_ptr*16],&disp_buffer[0],16);
				if(ram_ptr<(MAX_REPORT_RAM/16-1))
					ram_ptr++;
				else
					memcpy(rpt_ram_buf,rpt_ram_buf+16,MAX_REPORT_RAM-16);
				CYCLE_FLAG=TRUE;
				cycle_timer_f=TRUE;
				STATUS_WORD=0;
				
				report_time_lock();//记录此刻时间,并存于eeprom中
				sampleCPU=0;
				for(i=0;i<16;i++)
					EEPROMwrite(eep_rpt_buf+eep_ptr*17+i,RPT_TIME[i+1]);
				EEPROMwrite(eep_rpt_buf+eep_ptr*17+16,0x0a);
				eep_rpt_inc(eep_ptr);
				RPT_TIME[0]=0x5a;

				for(i=0;i<16;i++)
					EEPROMwrite(eep_rpt_buf+eep_ptr*17+i,disp_buffer[i]);//存报告
				EEPROMwrite(eep_rpt_buf+eep_ptr*17+16,0x0a);

				eep_rpt_inc(eep_ptr);
				EEPROMwrite(eep_rpt_buf+eep_ptr*17,0x04);
				EEPROMwrite(eep_rpt_buf+eep_ptr*17+1,0x04);

				i=strlen(disp_buffer)-1;
				for(;i>1;i--)
					if(disp_buffer[i]!=' ')
						break;
				disp_buffer[i+1]=0;
				cls();
				mediacy_hz(2*16,disp_buffer);
			}
		}
	}
	else
	{//如果关注状态结束,则做如下处理;
		if(ATTENTION!=FALSE)
		{//如果上一个状态是关注
			ATTENTION=FALSE;
			if(waiting!=0)
			{
				waiting=0;
				cls();
			}
			if((STATUS_WORD==3)||(STATUS_WORD==4))
			{//如果关注的起因是端口测试
				keep_timer=0;//关注保持时间清零
			}
			else
			{//设置不应期为20秒,在不应期内0Xc1报文不产生新的时间串
				PT_RST=TRUE;
				keep_timer=20*2;
			}
		}
		if(keep_timer==0)//不应期时间到
		{
			PT_RST=FALSE;
			RPT_TIME[0]=0x5a;
		}
		PORTD&=~RUN_LAMP;
	}

}
void clr_CYCLE_FLAG(void)
{
	rpt_ram_clr();
	CYCLE_FLAG=FALSE;
	S_EEP=0;
}
//LON网信息的处理进程
void nv_update_routine(void)
{
	byte i,j,k,key;
	byte temp,temp1,temp2,temp3;
	byte tm_str[10];

	if((nv_c.o_node_addr==0xff)&&(nv_c.code==0x3d))
	{//收到对时时间
		if((bgnpoint!=endpoint)&&
		  ((GPS_en&0x20)==0))//缓冲区中有其它报文,表明对时命令不是刚收到的
			return;
			
		//时间串合理性判断
		if((nv_c.data[5]-0)>(99-0))return;
		if((nv_c.data[4]-1)>(12-1))return;
		if((nv_c.data[3]-1)>(31-1))return;
		if((nv_c.data[2]-0)>(23-0))return;
		if((nv_c.data[1]-0)>(59-0))return;
		if((nv_c.data[0]-0)>(59-0))return;

		for(i=0;i<6;i++)
			tm_str[i]=((nv_c.data[i]/10)<<4)+(nv_c.data[i]%10);//16进制转换成BCD码

		poll_com=0;
		synch_timer=400;//同步时间小于400ms
		for(;;)
		{
			if(synch_timer==0)
			{
				if((GPS_en&0xf0))
					break;
				else
					return;
			}
			out_rst24();
			comm_with_lon();
			if(nv_update!=FALSE)
			{
				nv_update=FALSE;
				if((nv_c.o_node_addr==0xff)&&(nv_c.code==0x3e))
				{//收到对时确认命令
					synch_timer=0;
					break;
				}
			}
		}
		if((GPS_en&0xf0)==0)
		{//没有GPS对时
			for(;mstimer2<2;);
			if(memcmp(time_str,tm_str,6)!=0)
			{//给定时间与自己的不同时,刷新时间	
				mstimer2=1000-1;
				for(i=0;i<6;i++)
					time_str[i]=tm_str[i];
				time_str_wr(time_str);
			}
		}
		else
		{//GPS正在对时
			if(GPS_en&0x20)
			{//当为分脉冲对时
				int my_tm,net_tm;
				for(;mstimer2<2;);//即将越过整秒时,等待其越过
				my_tm =(time_str[0]&0x0f)+(time_str[0]>>4)*10+
					  ((time_str[1]&0x0f)+(time_str[1]>>4)*10)*60;
				net_tm=(tm_str[0]&0x0f)+(tm_str[0]>>4)*10+
					  ((tm_str[1]&0x0f)+(tm_str[1]>>4)*10)*60;
				my_tm=my_tm-net_tm;//计算小时内的时间之差
				if(my_tm>1800)//处理过整点时的时间差
					my_tm-=3600;
				else
				if(my_tm<-1800)//处理过整点时的时间差
					my_tm+=3600;
				if((-30<=my_tm)&&(my_tm<=30))
				{//给定时间与自己的分秒非常接近,再判断小时以上的时间串	
					if((time_str[1]==0x59)&&(tm_str[1]==0)&&(my_tm<=0))
						return;//给定时间快,但在正常范围内
					else
					if((tm_str[1]==0x59)&&(time_str[1]==0)&&(my_tm>=0))
						return;//给定时间慢,但在正常范围内
					else
					if(memcmp(time_str+2,tm_str+2,4)==0)
						return;
				}
				my_tm =(time_str[0]&0x0f)+(time_str[0]>>4)*10;
				net_tm=(tm_str[0]&0x0f)+(tm_str[0]>>4)*10;
				my_tm=my_tm-net_tm;//计算分之内的时间之差
				if(my_tm<-30)
				{//给定时间的秒接近59秒,自己的秒刚过0秒不久
					if(tm_str[1]!=0x59)
					{//自己的秒是正确的,所以给定的分要加1
						tm_str[1]++;
						if((tm_str[1]&0x0f)==0x0a)
							tm_str[1]+=6;
					}
					else
					{//给定时间的分加1会产生进位时,为了避免繁琐的进位计算,
					 //让给定时间的秒更接近59,在GPS脉冲到来时会得到已正确进位的时间串
						time_str[0]=0x59;
					}
				}
				else
				if(my_tm>30)
				{//自己的秒接近59秒,给定时间的秒刚过0秒不久
					if(tm_str[1]!=0)
					{//自己的秒是正确的,所以给定的分要减1
						tm_str[1]--;
						if((tm_str[1]&0x0f)==0x0f)
							tm_str[1]-=6;
					}
					else
						time_str[0]=0;
				}
				tm_str[0]=time_str[0];
				memcpy(time_str,tm_str,6);
				mstimer2=1000-1;
				for(i=0;i<6;i++)
					time_str[i]=tm_str[i];
				time_str_wr(time_str);
			}
			else
			if(GPS_en&0x10)
			{//当为秒脉冲对时
				for(;mstimer2<2;);
				if(memcmp(time_str,tm_str,6)!=0)
				{//给定时间串与自己的不同时,刷新时间	
					mstimer2+=200;//使下次GPS对时时用此时间串
					memcpy(time_str,tm_str,6);
				}
			}
		}
		return;
	}
	//如果不是本装置的地址,又不是广播命令则不处理;
	if((nv_c.o_node_addr!=EEPROMread(eep_node_id))&&(nv_c.o_node_addr!=0xff))
		return;

	if((STATUS_WORD==5)&&(nv_c.code>=2)&&(nv_c.code<=4))
	{
		if(poll_com!=0)
		{
			nv_update=TRUE;
			return;
		}
	}
	poll_clr();
	temp=nv_c.s_node_addr & 0xe0;
	if(temp!=0xe0)
	{//向CPU板转发
		if(temp==0)
			CPU_ID=0xe0;
		else
			CPU_ID=temp;
		commu_buf[0]=nv_c.lenth+1;
		commu_buf[1]=nv_c.o_node_addr;
		commu_buf[2]=nv_c.s_node_addr;
		commu_buf[3]=nv_c.code;
		for(i=0;i<nv_c.lenth-3;i++)
			commu_buf[4+i]=nv_c.data[i];

		commu_buf[4+nv_c.lenth-3]=0;
		for(i=0;i<4+nv_c.lenth-3;i++)//下传数据求和
			commu_buf[4+nv_c.lenth-3] +=commu_buf[i];

		temp=nv_c.lenth+2;
		com_byte(CPU_ID | 0x1f);//转发远动命令
		for(i=0;i<temp;i++)
		{
			com_byte(CPU_ID | (commu_buf[i] & 0x0f));//字节低位
			com_byte(CPU_ID | (commu_buf[i] >> 4));//字节高位
		}
		if((nv_c.code>=2)&&(nv_c.code<=6))
			return;
		dlyms(50);
		poll_seq=(CPU_ID>>5)-1;
		for(i=3;i!=0;)
		{
			if(poll_timer_f!=FALSE)
			if(poll_com!=1)
			{
				poll_timer_f=FALSE;
				if(poll_com==0)
					poll_seq--;
				poll_timer_routine();
				if(poll_timer_f==FALSE)
					i--;
			}
		}
	}
	else
	{//LON网对MMI的命令
		if(nv_c.code==0x3f)
		{//复归命令
			ans_nva(0x26);
			press_rst_key();

			if((ATTENTION==FALSE)&&(menu_in==FALSE)
			  &&(STATUS_WORD!=1)&&(STATUS_WORD!=2))
			{
				clr_CYCLE_FLAG();
				STATUS_WORD=0;
				init_disp();
			}
		}
		else

⌨️ 快捷键说明

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