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

📄 hzmmimain18.c

📁 ATMEL的ATMEGA128驱动160×80液晶调试程序
💻 C
📖 第 1 页 / 共 5 页
字号:
						keep_timer=0;
					}
					else
					{//置不应期为10秒
						PT_RST=TRUE;
						keep_timer=10*2;
					}
				}
				if((RPT_TIME[0]&0xf0)==0xa0)
				{//报告产生的时间是未曾使用的,保存时间
					if(S_EEP)
					{//如果MMI中的报告正在显示,则指针加1,最新行指向当前位置
						frist_line=eep_ptr;
						if(S_EEP>0)
							S_EEP++;
					}

					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);
				}
			}

			if(commu_buf[2] & 0x10)//点亮运行灯
				PORTD|=RUN_LAMP;
			else
				PORTD&=~RUN_LAMP;

			if(commu_buf[2] & 0x04)//接收到停止发送代码则告警
				alarm();

			key=0x02;
			if(commu_buf[2]&0x02)	
			if((RPT_TIME[0]&0xf0)==0xa0)//向网络转发报告产生的时间
			{
				NV_ram_buf[0]=20; 		//lenth
				NV_ram_buf[1]=commu_buf[3];	//o.addr
				NV_ram_buf[2]=EEPROMread(eep_node_id);
				NV_ram_buf[3]=commu_buf[5];		//code
				memcpy(&NV_ram_buf[4],&RPT_TIME[2],15);
				NV_ram_buf[19]=0x0d;
				NV_ram_buf[20]=0x0a;
				net_out(1);
				if(RPT_TIME[0]==0xa5)
				{
					rpt_ram_clr();
					memcpy(rpt_ram_buf,&RPT_TIME[2],15);
					rpt_ram_buf[15]=' ';
					ram_ptr++;
					CYCLE_FLAG=TRUE;
					STATUS_WORD=0;
				}
				RPT_TIME[0]=0x5a;//设置报告产生的时间已经使用过了
			}
			if(STATUS_WORD!=1)
			if(keep_timer!=1)
			while((commu_buf[2]&0x0b)==0)
			{
				if(sampleCPU==0)
				{//在不应期内,CPU发出单一(采样)打印报文,则记下CPU号,
					sampleCPU=poll_seq;
					if((STATUS_WORD==5)&&(keep_timer>0))
					{//菜单选择的打印,报文不暂存
						keep_timer=1;
					}
					else
					{//将报文存于0x400处,不应期即将结束时再打印
						memmove(&commu_buf[400],&commu_buf[0],commu_buf[1]+1);
						key=0x05;
						if(keep_timer==0)
							keep_timer=2;
					}
				}
				else
				if((sampleCPU==poll_seq)&&(keep_timer>1))
				{//只有一个CPU,则不应期结束,打印0x400处报文
					keep_timer=1;
					key=net_send(1,commu_buf[1+400]-5,commu_buf[3+400],
						commu_buf[5+400],2,0,&commu_buf[6+400]);
				}
				break;
			}
			if(key==0x02)
			{
				if((commu_buf[1]-5)>32)
					key|=0x80;
				net_send(1,commu_buf[1]-5,commu_buf[3],
					commu_buf[5],key,0,&commu_buf[6]);
			}

			if(commu_buf[2] & 0x08)			//数据要求存RAM
				ram_save(rcv_cnt,0xc1);
			if(RPT_TIME[0]!=0xb5)
			if(commu_buf[2] & 0x02)			//数据要求存EEPROM
				eep_save(rcv_cnt,0xc1);

			if((commu_buf[2] & 0x01)		//送当地显示
			 &&(CYCLE_FLAG==FALSE)&&(menu_in==FALSE))
			{
				memcpy(disp_buffer1,&commu_buf[6],rcv_cnt);
				disp_buffer1[rcv_cnt]=0;
				if(reportchinese(rcv_cnt,1));//调用报文显示子程序
			}
			break;
	}
}
//向cpu板发送时间
void send_time(void)
{
	byte i,k;
	
	if(mstimer2<(1000-1-5))//当前时刻不在整秒附近
		return;
	if(poll_com==1)
		return;
	com_byte(0xe0);
	for(i=2;i<=2;i--)
	{//下发时分秒
		k=(time_str[i]>>4)*10+(time_str[i]&0x0f);//BCD码转换
		com_byte(0xe0|(k>>4));//取高位下发
		com_byte(0xe0|(k&0x0f));//取低位下发
	}
	com_byte(0xe1);
}
//时钟显示进程
void clock_timer_routine(void)
{
	byte str[64],tmp[10];
	byte i;
	static byte cyc=0;
	static byte prg_sum=FALSE;

	soft_dog=7;
	if((cyc==0)||(cyc==20))
		send_time();

	if(cyc>=38)//计算新的滚动位置
		cyc=0;
	else
		cyc+=2;
	if(cyc==0)
	{//每20秒检查一次本程序的校验码
		if(VERSION3[1]!='0')
			prg_sum=FALSE;//调试状态不用校验
		else
		{
			poll_clr();
			csprintf(tmp,"0000%X",chk_prg_sum());
			i=strlen(tmp)-4;
			cstrcpy(str,VERSION3);
			if(strncmp(&str[3],&tmp[i],4))
				prg_sum=TRUE;
			else
				prg_sum=FALSE;
		}
	}
	if((time_setting!=FALSE)||(CYCLE_FLAG==FALSE)&&(menu_in==FALSE))
	{
		if((net_err!=FALSE)&&(time_setting==FALSE))
		{//如果网络CPU有错误
			alarm();
			ctl_data|=LCD_LED;
			cstrcpy(str,"   网络通讯有错误!  ");
			str_hz(0,0,str);
		}
		else
		if((prg_sum!=FALSE)&&(time_setting==FALSE))
		{//如果校验不正确则告警
			alarm();
			ctl_data|=LCD_LED;
			cstrcpy(str,"   面板程序校验错!  ");
			str_hz(0,0,str);
		}
		else
		if((time_setting!=FALSE)||(face_str[0]==0)||(face_str==0))
		{
			disp_time(0);
			if((time_setting!=FALSE)&&((GPS_en&0x0f)==2))
			if((time_str[5]==1)&&(time_str[4]==1)&&(time_str[3]<10))
			{//当时间设置在2001年1月1-9日,且分脉对时时,可测脉宽,调整时钟快慢
				csprintf(str,"GPS脉宽:%ums ",ms_val);
				mediacy_hz(3*16+8,str);
				key_timer=10;//不断延长键盘输入等待时间
			}
		}
		else
		{//时间与设备题头滚动显示
			str[0]='2';
			str[1]='0';
			for(;mstimer2<2;);//快到整秒时等待过整秒,防止时间串出错
			for(i=5;i<6;i--)
				csprintf(&str[2+15-i*3],(time_str[i]>=16)?"%x-":"0%x-",time_str[i]);
			str[10]=' ';
			str[13]=':';
			str[16]=':';
			str[19]=' ';
			memset(str+20,' ',20);
			i=cstrlen(face_str);
			i=10-(((i/2)+1)&0xfe);
			cstrcpy(str+i+20,face_str);
			str[strlen(str)]=' ';
			memcpy(str+40,str,20);
			str[cyc+20]=0;
			str_hz(0,0,str+cyc);
		}
	}
}
//报告滚屏显示进程,组织报告显示的格式
void cycle_timer_routine(void)
{
	static byte bgn;//第一行借用第二行字符的个数
	byte i;

	if((CYCLE_FLAG==FALSE)||(menu_in!=FALSE)||(STATUS_WORD==5))
		return;

	cycle_timer_t=3;
	if(STATUS_WORD!=1);
		STATUS_WORD=0;
	if(cycle_ptr==0)
		bgn=0;

	if(S_EEP)
	{//报告来自MMI的eeprom中
		if(S_EEP==1)
			cstrcpy(disp_buffer1,"MMI中最新报告:");
		else
		if(S_EEP==-1)
			cstrcpy(disp_buffer1,"MMI中最老报告:");
		else
		if(S_EEP>0)
			csprintf(disp_buffer1,"MMI中第%d新报告:",S_EEP);
		else
			csprintf(disp_buffer1,"MMI中第%d老报告:",-S_EEP);
	}
	else
	if(STATUS_WORD==1)
	{//在零漂刻度菜单选择开入时,有时会进入报告滚屏状态
		csprintf(disp_buffer1,"CPU%d的开入压板:",poll_seq);
	}
	else
		cstrcpy(disp_buffer1,"最新报告:");
		
	cls();
	str_hz(0,0,disp_buffer1);//显示标题
	i=20-strlen(disp_buffer1);
	csprintf(disp_buffer,"第%d行",cycle_ptr+1);
	if(i>7)
		str_hz(0,20-strlen(disp_buffer),disp_buffer);//显示行号
	else
	if(i>strlen(disp_buffer+2))
		str_hz(0,20-strlen(disp_buffer+2),disp_buffer+2);//显示行号
	else
	{
		csprintf(disp_buffer,"%d",cycle_ptr+1);
		str_hz(0,20-strlen(disp_buffer),disp_buffer);//显示行号
	}

	memcpy(disp_buffer1,&rpt_ram_buf[cycle_ptr*16],80);
	cycle_ptr++;
	if(cycle_ptr>=ram_ptr)
	{
		disp_buffer1[16]=0;
		cycle_ptr=0;
	}
	else
	if(cycle_ptr==(ram_ptr-1))
		disp_buffer1[32]=0;
	else
	if(cycle_ptr==(ram_ptr-2))
		disp_buffer1[48]=0;
	else
	if(cycle_ptr==(ram_ptr-3))
		disp_buffer1[64]=0;
	else
		disp_buffer1[80]=0;

	//将第一行借用第二行的字符摸去,
	//解决因分段引起的完整数据被不合理分割的问题,如3.06被分断
	for(i=0;i<bgn;i++)
		disp_buffer1[i]=' ';
	bgn=reportchinese(80,1);
}
//等待获取键值子程序
byte get_key(void)
{
	byte key;

	for(key=0;key_timer;)
	{//等待按键
		event_routine();
		out_rst24();
		if(STATUS_WORD==5)
			return 0;
		if(has_key&0x80)
		{
			has_key&=0x7f;
			key=has_key&0x7f;
			if(cpu_set_flag!=FALSE)
				key_timer=KEY_SET_TIMEOUT;//重置等待时间
			else
				key_timer=KEY_TIMEOUT;//重置等待时间
			break;
		}
	}
	return key;
}

//DZ1,DZ2,DZ3
void set_chg(void)
{
	static byte DZ123_L,DZ123_X,DZ123_N;
	static word DZ123_T;
	byte i,key;

	key=(~PIND)&(DZ1|DZ2|DZ3);
	if((DZ123_L==key)&&((~DZ123_X)==key))
	{
		DZ123_N=0x80;
		return;
	}
	if(DZ123_N!=key)
	{
		DZ123_N=key;
		DZ123_T=ms_count;
		return;
	}
	if((ms_count-DZ123_T)<500)
		return;
	if(DZ123_L!=~DZ123_X)
	{
		DZ123_L=key;
		DZ123_X=~key;
		return;
	}
	else
	{
		menu_in=TRUE;
		csprintf(disp_buffer,"切换定值区:0%d到0%d ?",DZ123_L,DZ123_N);
		LCD_display(8,0);
		cstrcpy(disp_buffer,"按SET键或RESET键确认");
		str_hz(16*2,0,disp_buffer);
		cstrcpy(disp_buffer,"或切回原定值区");
		str_hz(16*3+8,0,disp_buffer);
		key_timer=KEY_TIMEOUT;
		for(;;)
		{
			event_routine();
			if(CYCLE_FLAG!=FALSE)
				break;
			key=(~PIND)&(DZ1|DZ2|DZ3);
			if(DZ123_N!=key)
			{
				DZ123_N=0x80;
				break;
			}
			if(key_timer==0)
			{
				key_timer=KEY_SET_TIMEOUT;
				alarm();
			}
			if(has_key&0x80)
			{
				if(((has_key&0x7f)==KEY_SET)
				 ||((has_key&0x7f)==KEY_RST24))
				{
					if((has_key&0x7f)==KEY_SET)
					{
						has_key&=0x7f;
						press_rst_key();
					}
					else
					{
						out_rst24();
						for(;(has_key&0x80)==0;soft_dog=5)
							comm_with_lon();
						out_rst24();
					}
					cpu_set_flag=TRUE;
					for(key=0;key<3;key++)
					{
						soft_dog=5;
						for(i=1;i<=6;i++)
						{
							if(EEPROMread(eep_CPU_NUB+i)==1)
							if(EEPROMread(eep_COMERR_CNT+i)<ALM_NUMBER)
							if((word)CTL_DOT_CPU[i].str!=0x0001)//录波CPU
							{
								dlyms(50);
								cpu_name=i;
								if(rmtc_op(DZ123_N,0x67)==1)
								{
									dlyms(200);
									break;
								}
							}
						}
						if(i>6)break;
					}
					cpu_set_flag=FALSE;
					if(i>6)
					{
						DZ123_L=DZ123_N;
						DZ123_X=~DZ123_N;
					}
					break;
				}
				else
					has_key&=0x7f;
			}
		}
		cls();
		menu_in=FALSE;
		STATUS_WORD=0;
		key_timer=0;
	}
}

//键盘进程,处理循环状态时的所有按键操作
void key_routine(void)
{
	byte key,i;
	const byte *cpp;

	out_rst24();
	if((CYCLE_FLAG==FALSE)&&(PC_QUIT!=0xa5))
		set_chg();
	key=has_key;
	if((key&0x80)==0)//没有新键,返回
		return;
	has_key&=0x7f;
	key&=0x7f;

	menu_in=FALSE;
	key_timer=KEY_TIMEOUT;//设置读键等待时间,点亮背光
	if(key==KEY_QUIT)
	{
		if(waiting!=0)
		{
			waiting=0;
			cls();
		}
		desk_pause=0;
		if((ctl_data & COM_SEL)!=COM_SEL)		//PC<-->CPU//
			ctl_data|=COM_SEL;//切换到MMI控制状态

		if((CYCLE_FLAG!=FALSE)&&(STATUS_WORD!=3)&&(STATUS_WORD!=5))
			clr_CYCLE_FLAG();
		else
		if(STATUS_WORD==3)
		{//让操作者多按一次退出键
			STATUS_WORD=0;
			if(ATTENTION==TRUE)
				press_rst_key();
			return;
		}
		else
		{
			static byte quit_count;
			
			if((STATUS_WORD>=4)||(STATUS_WORD==2))
				STATUS_WORD=0;
			if(STATUS_WORD==1)
			{
				quit_count++;
				if(quit_count>5)
				{
					STATUS_WORD=0;//让操作者多按一次退出键
					quit_count=0;
				}
			}

			key_timer=0;//键盘输入等待时间清零,背光消失
		}
		for(i=0;i<7;i++)
			Q_KEY[i]=0xaa;
		init_disp();
		PC_QUIT=0;
		return;
	}
	else
	if((key==KEY_UP)||(key==KEY_DOWN))
	{//处理上下键
		if(STATUS_WORD==2)
		{//对对点的特殊处理:发复归命令
			if(key==KEY_UP)
				return;
			press_rst_key();
			has_key=KEY_NOUSE;
			return;
		}
		if(STATUS_WORD==1)
		{//对零漂、刻度、阻抗,特殊处理
			CYCLE_FLAG=FALSE;
			if(key==KEY_UP)
			{//调零漂,刻度的上键处理:前推一项
				if((clz_old&0x1f00)!=0)
					clz_old-=256;
				else
					clz_old=clz_total-256;
				if(clz_old==clz_bzd)//如果遇到对点,则再前推一项
					clz_old=((clz_old-256)&0x1f00)|(clz_old&0xe0ff);
				if(clz_old==clz_prt)//如果遇到打印,则再前推一项
					clz_old=((clz_old-256)&0x1f00)|(clz_old&0xe0ff);
				if(clz_old==clz_bzd)//如果遇到对点,则再前推一项
					clz_old=((clz_old-256)&0x1f00)|(clz_old&0xe0ff);
			}
			else
			{//调零漂,刻度的下键处理:后推一项
				clz_old=((clz_old+256)&0x1f00)|(clz_old&0xe0ff);
				if(clz_old==clz_prt)//如果遇到打印,则再后推一项
					clz_old=((clz_old+256)&0x1f00)|(clz_old&0xe0ff);
				if(clz_old==clz_bzd)//如果遇到对点,则再后推一项
					clz_old=((clz_old+256)&0x1f00)|(clz_old&0xe0ff);
				if(clz_old==clz_prt)//如果遇到打印,则再后推一项
					clz_old=((clz_old+256)&0x1f00)|(clz_old&0xe0ff);
				if(clz_old>=clz_total)//如果遇到结尾,则再后推一项
					clz_old=clz_old&0xe0ff;
			}
			csprintf(disp_buffer," 正在调取零漂第%d项, ",((clz_old/256)&0x1f)+1);
			if((clz_old&0x1f)==0x11)
				cpp="零漂";
			else
			if((clz_old&0x1f)==0x10)
				cpp="刻度";
			else
			if((clz_old&0x1f)==0x12)
				cpp="阻抗";
			cstrcpy(disp_buffer+9,cpp);
			disp_buffer[13]='第';
			disp_wait(1*16+8);

⌨️ 快捷键说明

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