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

📄 hzmmimain18.c

📁 ATMEL的ATMEGA128驱动160×80液晶调试程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			poll_clr();
			dlyms(100);
			com_snd((byte*)&clz_old,2);//向cpu板发命令取对应的零漂,刻度
			poll_timer_t=poll_timer;
			poll_timer_f=FALSE;
			poll_seq=((clz_old&0x00e0)>>5)-1;
			clz_order=TRUE;//废除第一次的报文因为此次报文可能是上一回的
			return;
		}
		if((STATUS_WORD==0)&&(CYCLE_FLAG==FALSE))
		{//桌面循环显示暂停10秒
			if(key==KEY_UP)
				desk_pause=10;
			else
				desk_pause=0;
			return;
		}
		if((STATUS_WORD==0)&&(CYCLE_FLAG!=FALSE))
		{//报告显示翻屏,并暂停10秒
			if(key==KEY_UP)
			{
				if(cycle_ptr==0)
					cycle_ptr=ram_ptr-1;
				else
					cycle_ptr--;//第一次减一回到当前位置
				if(cycle_ptr==0)
					cycle_ptr=ram_ptr-1;
				else
					cycle_ptr--;//第二次减一到向前翻一屏的位置
				if(cycle_ptr!=0)
				{
					cycle_ptr--;//第三次减一到向前翻二屏的位置
					cycle_timer_routine();
				}//得到前二屏占用前一屏的字节数,并回到向前翻一屏的位置
			}
			cycle_timer_routine();
			cycle_timer_t=10;
			cycle_timer_f=FALSE;
			return;
		}
	}
	else
	if((key==KEY_LEFT)||(key==KEY_RIGHT))
	{//处理左右键
		if(S_EEP==0)
			return;
		eep_ptr=head_line;

		if(key==KEY_LEFT)		//在eeprom中从后往前寻找所存的上一个报告
			i=pointer3(1);
		else
		if(key==KEY_RIGHT)		//在eeprom中从前往后寻找所存的下一个报告
			i=pointer3(0);
		if(i==FALSE)
		{
			cstrcpy(disp_buffer,"无其他报告!");
			cls();
			mediacy_hz(2*16,disp_buffer);
			if(get_key());
			return;
		}
		head_line=eep_ptr;
		if(key==KEY_LEFT)
		{//顺序编号前移
			S_EEP--;
			if(S_EEP==0)
				S_EEP=-1;
		}
		else
		if(key==KEY_RIGHT)
		{//顺序编号后移
			S_EEP++;
			if(S_EEP==0)
				S_EEP=1;
		}
		if(frist_line==head_line)
			S_EEP=1;//最新报告处顺序编号是1
		eep_ram();
		return;
	}
	else
	if(key==KEY_SET)
	{		//对set键处理
		if(STATUS_WORD==3)
			STATUS_WORD=0;
		if((STATUS_WORD!=0)||(CYCLE_FLAG!=FALSE)||(PC_QUIT==0xa5))
			return;
		desk_pause=0;
		menu_in=TRUE;
		select_menu(MENU[1].str);//进入主菜单
		if((STATUS_WORD==0)&&(PC_QUIT!=0xa5))
			init_disp();
		menu_in=FALSE;
	}
}

//显示菜单
byte display_menu(const byte *menu_str)
{
	char DzStrBuf[16];
	byte k,maxmenus,beginline;

	if(cstrlen(menu_str)==0)
		return 0;
	cstrcpy(disp_buffer,menu_str);

	cls();
	maxmenus=(strlen(disp_buffer)-11+7)/9;		//菜单数
	if(maxmenus>6)
		beginline=14;
	else
	if(maxmenus>4)
		beginline=22;
	else
		beginline=30;

	memcpy(DzStrBuf,&disp_buffer[1],10);
	DzStrBuf[10]=0;
	if(maxmenus>6)
		k=0;
	else
	if(maxmenus>4)
		k=4;
	else
		k=8;
	str_hz(k,5,DzStrBuf);

	for(k=0;k<maxmenus;k++)
	{//列出各菜单选项
		memcpy(DzStrBuf,&disp_buffer[10+2+k*9],8);
		DzStrBuf[8]=0;
		str_hz(((k/2)*16)+beginline,(k%2)*10+2,DzStrBuf);
	}
	return maxmenus;
}
//选择菜单子程序	
byte select_menu(const byte *menu_str)
{
	byte menu_idx,key;
	byte beginline;
	byte total_menu;

re_select:	
	total_menu=display_menu(menu_str);
	if(total_menu==0)
		return 0;
	total_menu--;
	menu_idx=0;
	for(;;)
	{
		if(total_menu>=6)
			beginline=14;
		else
		if(total_menu>=4)
			beginline=22;
		else
			beginline=30;
		set_cursor_position((menu_idx/2)*16+beginline,(menu_idx&1)*10,menucursor);
		key=get_key();
		if(key==KEY_SET)
		{
			key=menu_str[10+1+menu_idx*9];
			if(key<=32)
			{//指向子菜单
				if(select_menu(MENU[key].str)==0)
					return 0;
			}
			else
			{//选项处理
				if(fun_key_idx(key)==0)
					return 0;
			}
			goto re_select;
		}
		else
		if(key==KEY_NULL)
			return 0;
		else
		if(key==KEY_QUIT)
			return 0xff;
		else
		if(key==KEY_UP)		//向上移动光标
		{
			if(menu_idx>1)
				menu_idx-=2;
			else
			if(total_menu&1)
				menu_idx=total_menu+menu_idx-1;
			else
				menu_idx=total_menu-menu_idx;
		}
		else
		if(key==KEY_DOWN)	//向下移动光标
		{
			if((menu_idx+2)<=total_menu)
				menu_idx+=2;
			else
				menu_idx&=1;
		}
		else
		if(key==KEY_RIGHT)	//向右移动光标
			value_inc(menu_idx,0,total_menu)
		else
		if(key==KEY_LEFT)	//向左移动光标
			value_dec(menu_idx,0,total_menu)
		else
			continue;
	}
}
//选择cpu板号子程序
byte cpu_nmb(void)
{
	byte i;
	cstrcpy(disp_buffer,"请选择CPU板号:1");
	cls();
	mediacy_hz(16*1+8,disp_buffer);
	i=(strlen(disp_buffer)+1)/2+9;
	set_quit_key();
	poll_seq=sel_idx2(16*1+8,i,TOTAL_CPU_NUMBER,1);
	if(poll_seq==0)
		return 0;
	if(EEPROMread(eep_CPU_NUB+poll_seq)==0)
		return 0;

	cpu_name=poll_seq;
	CPU_ID=cpu_name<<5;
	return 1;
}
//对选择的菜单项做处理
byte fun_key_idx(byte key_type)
{
	byte i,j,key,temp;
//	byte code;
	byte *p;
	byte *com_bak;
	word rcv_cntt;
	const byte *cpp;
	byte CPU_ON[10];
//	byte str[8];

	temp=0x0b;
	switch(key_type)
	{
		case 'Z':			//调阻抗,0x0d
			temp++;
		case 'C':			//调零漂,0x0c
			temp++;
		case 'L':			//调刻度,0x0b
		{
			if(EEPROMread(eep_CPU_NUB+0)==0)
			if(cpu_nmb()==0)
				return 0xff;
				
			poll_clr();
			for(j=6;j!=0;j--)
			{//尝试6次调取选项
				rcv_cnt=com_rcv(temp | CPU_ID);
				if(rcv_cnt>1)
				if(chk_sum(rcv_cnt)==0)
					break;
			}
			if(j==0)
				return 0xff;

			com_bak=rpt_ram_buf+MAX_REPORT_RAM-256;
			memcpy(com_bak,commu_buf,rcv_cnt);
			com_bak[rcv_cnt]=0;
			if((i=anx_menu(com_bak,rcv_cnt,key_type))==0)
				return 0xff;

			poll_seq=cpu_name;
			CPU_ID=poll_seq<<5;
			STATUS_WORD=1;
			Q_KEY[cpu_name]=0;
			clz_order=TRUE;

			CPU_ON[0]=(temp+5) | CPU_ID;
			CPU_ON[1]=(byte) (i-1) | CPU_ID;
			clz_old=CPU_ON[0]+CPU_ON[1]*256;//对发出的命令留底
			clz_total=(clz_old&0xe0ff)+clz_total_num*256;//最后一个选项的位置
			clz_bzd=(clz_old&0xe0ff)+0x1f00;//半自动对点的位置
			clz_prt=(clz_old&0xe0ff)+0x1f00;//打印命令的位置
			clz_di =(clz_old&0xe0ff)+0x1f00;//开入命令的位置
			poll_clr();
			com_snd(CPU_ON,2);

			cstrcpy(CPU_ON,"all");//查找打印命令的位置
			p=strstr(com_bak+1,CPU_ON);
			if(p==0)
			{
				cstrcpy(CPU_ON,"ALL");//查找打印命令的位置
				p=strstr(com_bak+1,CPU_ON);
				if(p==0)
				{
					cstrcpy(CPU_ON,"IV9");//查找打印命令的位置
					p=strstr(com_bak+1,CPU_ON);
				}
			}
			if(p!=0)
			{//找到打印命令的位置,留存
				p=(byte*)((word)p-(word)(com_bak+1));
				j=(byte)((word)p/4);
				clz_prt=(clz_old&0xe0ff)+j*256;
				if(j==(i-1))
				{
					clz_order=FALSE;
					cstrcpy(disp_buffer,"正在打印..");
					disp_prt(1*16+8);
					/*
					keep_timer=0;
					for(i=1;i<=TOTAL_CPU_NUMBER;i++)
					{
						if(EEPROMread(eep_CPU_NUB+i))
							keep_timer++;
					}
					keep_timer*=6;
					sampleCPU=0;
					*/
					poll_seq--;
					poll_timer_t=poll_timer;
					poll_timer_f=FALSE;
					STATUS_WORD=1;
					return 0;
				}
			}
			cstrcpy(CPU_ON,"BZD");//查找半自动对点命令的位置
			p=strstr(com_bak+1,CPU_ON);
			if(p!=0)
			{//找到半自动对点命令的位置,留存
				p=(byte*)((word)p-(word)(com_bak+1));
				j=(byte)((word)p/4);
				clz_bzd=(clz_old&0xe0ff)+j*256;
				if(j==(i-1))
				{
					STATUS_WORD=2;
					clz_order=FALSE;
				}
			}
			cstrcpy(CPU_ON,"di");//查找开入命令的位置
			p=strstr(com_bak+1,CPU_ON);
			if(p==0)
			{
				cstrcpy(CPU_ON,"DI");//查找开入命令的位置
				p=strstr(com_bak+1,CPU_ON);
			}
			if(p!=0)
			{//找到开入命令的位置,留存
				p=(byte*)((word)p-(word)(com_bak+1));
				j=(byte)((word)p/4);
				clz_di=(clz_old&0xe0ff)+j*256;
			}
			csprintf(disp_buffer," 正在调取零漂第%d项, ",i);
			if(key_type=='C')
				cpp="零漂";
			else
			if(key_type=='L')
				cpp="刻度";
			else
			if(key_type=='Z')
				cpp="阻抗";
			cstrcpy(disp_buffer+9,cpp);
			disp_buffer[13]='第';
			disp_wait(1*16+8);
			dlyms(300);
			break;
		}
		case 'M':				//设置分对时
			temp++;
		case 'V':				//设置秒对时
			temp++;
		case 'J':				//置网络对时
			{
				const byte *p;
				if((GPS_en&0x0f)==0)
					p="当前状态:网络对时";
				else
				if((GPS_en&0x0f)==1)
					p="当前状态:秒脉对时";
				else
				if((GPS_en&0x0f)==2)
					p="当前状态:分脉对时";
				else
					p="当前状态: 未知";
				cstrcpy(disp_buffer,p);
				LCD_display(8,0);

				temp-=0x0b;
				if(temp==0)
					p="设置为网络对时:";
				else
				if(temp==1)
					p="设置为秒对时:";
				else
				if(temp==2)
					p="设置为分对时:";
				else
					return 0xff;

				cstrcpy(disp_buffer,p);
				str_hz(16*1+12,0,disp_buffer);
				set_quit_key();

				for(;;)
				{
					key=get_key();
					if(key==KEY_SET)
					{
						if(hidden_code()==FALSE)
							break;
						EEPROMwrite(eep_GPS,temp);
						GPS_en=temp;
						
						cstrcpy(disp_buffer,"设置成功!");
						cls();
						mediacy_hz(2*16,disp_buffer);
						if(get_key());
						if((temp==0)&&(time_str[5]==0)&&
						(time_str[4]==0x12)&&(time_str[3]<10))
						{//当时间是2000年12月1-9日时,设定网络脉对时,可输入密码进入测试程序
							if(ts_hidden_code()!=FALSE)
								test_face();
						}
						return 0xff;
					}
					else
					if(key==KEY_QUIT)
						break;
					else
					if(key==KEY_NULL)
						return 0;
				}
			}
			return 0xff;

		case 'f':
			disp_face();
			return 0xff;
			break;

		case 't':
			if(ts_hidden_code()!=FALSE)
				test_face();
			return 0xff;
			break;

		case 'A':			//打印采样值
			if(EEPROMread(eep_CPU_NUB+0)!=1)
			{
				if(cpu_nmb()==0)
					return 0xff;
			}
			poll_clr();
			com_byte(CPU_ID | 0x07);
			cstrcpy(disp_buffer,"正在打印采样值");
			disp_prt(1*16+8);
			keep_timer=0;
			for(i=1;i<=TOTAL_CPU_NUMBER;i++)
			{
				if(EEPROMread(eep_CPU_NUB+i))
					keep_timer++;
			}
			keep_timer*=6;
			sampleCPU=0;
			poll_seq--;
			poll_timer_t=poll_timer;
			poll_timer_f=FALSE;
			STATUS_WORD=5;
			break;

		case 'K':				//设置时间
			set_time();
			return 0xff;

		case 'W':				//切至与pc机通讯状态
			ctl_data&=~COM_SEL;
			cstrcpy(disp_buffer,"计算机<---->装置");
			cls();
			mediacy_hz(16*2,disp_buffer);
			cstrcpy(disp_buffer,"按QUIT键退出");
			mediacy_hz(16*3+8,disp_buffer);
			PC_QUIT=0xa5;
			detect_timer=PC_DETECT;
			break;

		case '.':
			cstrcpy(disp_buffer,"  暂无此功能!\r\r按任意键退出...");
			goto disp_help;
		case ',':
			cstrcpy(disp_buffer,"  菜单配置有错!\r\r按任意键退出...");
			goto disp_help;
		case 'T':
			cstrcpy(disp_buffer,ABOUT_STR);
			goto disp_help;
		case 'Q':
			cstrcpy(disp_buffer,MENU_STR);
			goto disp_help;
		case 'Y':
			cstrcpy(disp_buffer,SETTING_STR);
			goto disp_help;
		case 'a':
			cstrcpy(disp_buffer,LOOP_STR);
			goto disp_help;
		case 'b':
			cstrcpy(disp_buffer,REPORT_STR);
			goto disp_help;
		case 'c':
			cstrcpy(disp_buffer,LBMENU_STR);
disp_help:
			LCD_display(0,0);
			if(get_key());
			return 0xff;

		case 'I':				//调MMI版本
			cls();
			cstrcpy(disp_buffer,"MMI的版本号为:");
			str_hz(0*16,0,disp_buffer);
			key=net_send(1,strlen(disp_buffer),0x01,0x32,2|0x80,0,disp_buffer);
			csprintf(disp_buffer,VERSION2,TYPE_CODE);
			str_hz(1*16,0,disp_buffer);
			strcpy(disp_buffer1,disp_buffer);
			csprintf(CPU_ON,"000%X",chk_prg_sum());
			i=strlen(CPU_ON)-4;
			csprintf(disp_buffer,VERSION3,&CPU_ON[i]);//显示校验版本号
			mediacy_hz(2*16,disp_buffer+8);
			strcat(disp_buffer1,disp_buffer+7);
			if(key==0x02)
				key=net_send(1,strlen(disp_buffer1),0x01,0x32,2|0x80,0,disp_buffer1);
			cstrcpy(disp_buffer,"当前选型:");
			cstrcpy(disp_buffer+strlen(disp_buffer),sbxh[EEPROMread(eep_sbxh)].AscCod

⌨️ 快捷键说明

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