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

📄 menu.c

📁 这是一种温度变送器的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <c8051f350.h>
#include "menu.h"
#include "variable.h"
#include "I2C.h"
#include "adc.h"
#include "math.h"

bit bdata set_flag;
bit bdata dis_flag;
bit bdata zero_flag;
bit bdata dem_flag;
bit bdata pin_flag;
bit bdata menu_flag;
bit bdata t_flag;

unsigned int code default_ref_table[16]=//为了节省代码空间,ref_table_temp[40]为40个参数,省掉的24个
										//参数是标定用的,不用初始化
{
				(Itm_k-Itm_s)			//分度号default_ref_sn  默认开始是k。 加9则是pt100
	    ,			1					//参数设置位default_ref_bits  判断是否同步显示
		,			0					//标称/变送的低端default_ref_sc0
		,			1000				//标称/变送的高端default_ref_scf
		,			416					//变送的下限default_ref_da0
		,			2945				//变送的上限default_ref_daf
		,			0					//断线或溢出时的输出设定default_ref_dab
		,			0xf1				//当前温度对应的AD值default_ref_trv
		,			0					//输出修正0default_ref_d0
		,			0					//输出修正fdefault_ref_df
		,			0					//显示修正0default_ref_du0
		,			0					//显示修正fdefault_ref_duf
	    ,			0					//过滤类型default_ref_filt
	    ,			8					//过滤参数1default_ref_filr
		,			29					//当前温度default_ref_tr
		,			0
};


unsigned char code num_code[16]=  //十进制和十六进制的数字表示表
	{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,chr_a,chr_b,chr_c,chr_d,chr_e,chr_f};

unsigned char code Tab_Menu_Item[54][4]	=		
			{		 chr_sp,chr_sp, chr_sp,chr_sp	             		//0	null	
					,chr_p,	chr_n,	chr_b,	chr_o	                	//1	pnbo	
					,chr_sp,chr_sp,	chr_s,	chr_n	                	//2	sn	
					,chr_sp,chr_sp,	chr_p,	chr_d	                	//3	pd
					,chr_sp,chr_s,	(chr_c&chr_dot),	num_0        	//4	sc.0
					,chr_sp,chr_s,	(chr_c&chr_dot),	chr_f 		    //5	sc.f	
					,chr_sp,chr_sp,	chr_t,	chr_r						//6	tr
					,chr_sp,chr_d,	(chr_a&chr_dot),	num_0        	//7	da.0
					
					,chr_sp,chr_sp,	(chr_d&chr_dot),	num_0    		//8 d0
					,chr_sp,chr_sp,	(chr_d&chr_dot),	chr_f    		//9 df					
					,chr_sp,chr_d,	(chr_u&chr_dot),	num_0   		//10 du0
					,chr_sp,chr_d,	(chr_u&chr_dot),	chr_f    		//11 duf	
									

					,chr_f,	chr_i, 	(chr_l&chr_dot),	chr_t        	//12 fil.t
					,chr_f,	chr_i,	(chr_l&chr_dot),	chr_r        	//13 fil.r

					,chr_sp,chr_t,	chr_r,	chr_s						//14 trs
					,chr_sp,chr_r,	(chr_t&chr_dot),	num_1        	//15 r.1
					,chr_sp,chr_r,	(chr_t&chr_dot),	num_2        	//16 r.2
					,chr_sp,chr_r,	(chr_t&chr_dot),	num_3    		//17 r.3
					,chr_sp,chr_r,	(chr_t&chr_dot),	num_4    		//18 r.4
					,chr_sp,chr_r,	(chr_t&chr_dot),	num_5   		//19 r.5
					,chr_sp,chr_t,	(chr_c&chr_dot),	num_0        	//20 tc.0
					,chr_sp,chr_t,	(chr_c&chr_dot),	chr_f        	//21 tc.f
					
			    	,chr_sp,chr_d,	(chr_a&chr_dot),	chr_f        	//22 da.F
					,chr_sp,chr_d,	(chr_a&chr_dot),	chr_b        	//23 da.b

					,chr_sp,chr_sp,	chr_o,	chr_t            	    	//24 ot
					,chr_g,	chr_b,	chr_a,	chr_k           	    	//25 rev
					,chr_sp,chr_b,	chr_a,	chr_k           	 		//26 bak
					
 		        	,num_1,		chr_dot,chr_sp,	chr_sp		//overflow
					,chr_b,		chr_r,	chr_o,	chr_k		//brok
					,chr_sp,	chr_o,	chr_f,	chr_f		//off
					,chr_sp,	chr_sp,	chr_o,	chr_n		//on
					,chr_sp,	chr_sp,	chr_n,	chr_o		//no
					,chr_sp,	chr_y,	chr_e,	chr_s		//yes
					,chr_sp,	chr_sp,	chr_sp,	chr_s		//sn:s		tc
					,chr_sp,	chr_sp,	chr_sp,	chr_r		//sn:r		tc
					,chr_sp,	chr_sp,	chr_sp,	chr_b		//sn:b		tc
					,chr_sp,	chr_sp,	chr_sp,	chr_k		//sn:k		tc
			    	,chr_sp,	chr_sp,	chr_sp,	chr_e		//sn:e		tc
					,chr_sp,	chr_sp,	chr_sp,	chr_j		//sn:j		tc
					,chr_sp,	chr_sp,	chr_sp,	chr_n		//sn:n		tc
					,chr_sp,	chr_sp,	chr_sp,	chr_t		//sn:t		tc
					,chr_sp,	chr_t,	chr_u,	num_3 		//sn:tu3	tc
					,chr_sp,	chr_t,	chr_u,	num_5		//sn:tu5	tc
					,chr_t,		chr_u,	num_2,	num_0		//sn:tu20	tc
					,chr_t,		chr_u,	num_2,	num_6		//sn:tu26	tc
					,chr_p,		num_1,	num_0,	num_0		//sn:pt100	rt
					,chr_c,		chr_u,	num_1,	num_0		//sn:cu100	rt
					,chr_c,		chr_u,	num_5,	num_0 		//sn:cu50	rt
					,chr_sp,	chr_t,	chr_p&chr_dot,	num_1	//tp1
					,chr_sp,	chr_t,	chr_p&chr_dot,	num_2	//tp2
					,chr_sp,	chr_t,	chr_p&chr_dot,	num_3	//tp3
					,chr_a,		chr_r,	chr_e,	chr_a
					,chr_d,		chr_a,	chr_t,	chr_e
					,chr_n,		chr_u,	chr_b,	chr_r												
			};
unsigned int code Tab_mnu_ent_value[8]= //菜单入口值
	{	 
		 mnu_value_sn
		,mnu_value_sc0
		,mnu_value_d0
		,mnu_value_ot
		,mnu_value_pd
		,mnu_value_da0
		,mnu_value_rt1			
	};
unsigned char code Tab_mnu_ent_menu[8]= //菜单索引号
	{
		 mnu_sn
		,mnu_sc0
		,mnu_d0
		,mnu_ot
		,mnu_pd
		,mnu_da0
		,mnu_rt1
	};
/********************************************
函数名: menu_hdl
功能: 菜单处理
形式参数:无
返回值:无
********************************************/
void menu_hdl(void)
{	
	if(keyval)
	{		
		switch(page_point)
		{
			case    0:  mnu_hdl_null( );break;			//0 
			case    1:  mnu_hdl_main( );break;			//1 
			case	2:	mnu_hdl_sn	( );break;			//2
			//case	3:	mnu_hdl_dsp	( );break;			//3 
			case	4:	mnu_hdl_sc0	( );break;			//4 
			case	5:	mnu_hdl_scf	( );break;			//5 
			case	6:	mnu_hdl_tr	( );break;			//6
			//case	7:	mnu_hdl_da0	( );break;			//7
			case	8:	mnu_hdl_d0	( );break;			//8
			case	9:	mnu_hdl_df	( );break;			//9
			case	10:	mnu_hdl_du0	( );break;			//10
			case	11:	mnu_hdl_duf	( );break;			//11		
			//case	12:	mnu_hdl_filt( );break;  		//12
			//case	13:	mnu_hdl_filr( );break;			//13		
			//case	14:	mnu_hdl_trs	( );break;			//14
			case	15:	mnu_hdl_rtx	( );break;			//15
			case	16:	mnu_hdl_rtx	( );break;			//16
			case	17:	mnu_hdl_rtx	( );break;			//17
			case	18:	mnu_hdl_rtx	( );break;			//18
			case	19:	mnu_hdl_rtx	( );break;			//19
			case	20:	mnu_hdl_tc0	( );break;			//20
			case	21:	mnu_hdl_tc0	( );break;			//21
			/*case	22:	mnu_hdl_da0	( );break;			//22
			//case	23:	mnu_hdl_dab	( );break;			//23*/
			case	24:	mnu_hdl_ot	( );break;			//24
		}
	}
}
/********************************************
函数名: mnu_hdl_null
功能: 空菜单操作
形式参数:无
返回值:无
********************************************/
void mnu_hdl_null(void)
{
	switch(keyval)
	{
		case key_up|key_ent:
			menu_flag=1;
			page_point=1;
			set_flag=1;
			renew_page_high(mnu_main);
			renew_page_low(mnu_null);
	}
}
/********************************************
函数名: mnu_hdl_main 
功能: 主菜单操作
形式参数:无
返回值:无
********************************************/
void mnu_hdl_main(void)
{
	switch(keyval)
	{
		case key_up:
			if(!set_flag)
			{
				mod_value=mod_value+key_mov;
				if(mod_value>9999)mod_value=9999;
				point_pos=0;//小数点位置
				dis_flag=1;	//高低4位标置 1-高4位 0-低4位
				display_num(mod_value);//数字显示
			}
			break;
		case key_down:
			if(!set_flag)
			{
				mod_value=mod_value-key_mov;
				if(mod_value<-1999)mod_value=-1999;
				point_pos=0;//小数点位置
				dis_flag=1;//高低4位标置
				display_num(mod_value);//数字显示
			}
			break;
		case key_ent:
			if(set_flag)
			{
				set_flag=0;
				mod_value=mnu_value_null; //mnu_value_null=2004
				mod_bak=mnu_value_null;	//备份菜单号(即2004)
				point_pos=0;
				dis_flag=1;//高低4位标置				
				display_num(mod_value);//数字显示
			}
			else
			{
				select_page(mod_value);//选择界面
			}
			break;			
		case key_set:
			menu_flag=0;
			page_point=0;
			renew_page_high(mnu_null);
			renew_page_low(mnu_null);
			break;
	}
}
//选择界面
void select_page(int cod)
{
	switch(cod)
	{
		//case mnu_value_null:
		//	menu_flag=0;
		//	page_point=0;
		//	renew_page_high(mnu_null);
		//	renew_page_low(mnu_null);
		//	break;
		case mnu_value_sn:
			page_point=2;
			mod_bak=mnu_value_sn;//备份菜单入口数据
			renew_page_high(Tab_mnu_ent_menu[0]);
			mod_value=ref_table[ref_sn];//应读取分度号值
			renew_page_low(mod_value+Itm_s);
			break;
		case mnu_value_sc0:
			page_point=4;
			mod_bak=mnu_value_sc0;
			renew_page_high(Tab_mnu_ent_menu[1]);
			mod_value=ref_table[ref_sc0];
			//set_flag=0;
			dis_flag=0;
			get_pos();
			display_num(ref_table[ref_sc0]);	
			break;
		case mnu_value_da0:
			//page_point=7;
			break;
		case mnu_value_d0:
			page_point=8;
			mod_bak=mnu_value_d0;
			renew_page_high(Tab_mnu_ent_menu[2]);
			mod_value=ref_table[ref_d0];
			dis_flag=0;
			get_pos();
			display_num(ref_table[ref_d0]);	
			break;
		case mnu_value_filt:
			//page_point=12;
			break;
		case mnu_value_rt1:
			page_point=15;
			dem_flag=1;
			set_flag=1;
			point_pos_1=1;
			volt_range1=1;		//为mnu_hdl_rtx 初始化
			sub_function2();
			ref_buffer=ref_rt1;	//为mnu_hdl_rtx 初始化
			counter=1;			//为mnu_hdl_rtx 初始化	
			renew_page_high(mnu_rt1);
			mod_bak=mnu_value_rt1;
			mod_value=ref_table[ref_rt1];
			pin_flag=1;
			break;
		case mnu_value_tc0:
			page_point=20;
			dem_flag=1;
			set_flag=1;
			point_pos_1=1;
			volt_range1=1;
			sub_function2();
			ref_buffer=ref_tc0;
			counter=1;	
			renew_page_high(mnu_tc0);
			mod_bak=mnu_value_tc0;
			mod_value=ref_table[ref_tc0];
			pin_flag=0;	
			break;
		case mnu_value_pd:		
			break;
		case mnu_value_ot:
			page_point=24;
			mod_bak=mnu_value_ot;
			renew_page_high(Tab_mnu_ent_menu[3]);
			mod_value=0;
			dis_flag=0;
			point_pos=2;
			display_num(0);
			break;
	}		
}

/********************************************
函数名: mnu_hdl_sn 
功能: 分度表菜单操作
形式参数:无
返回值:无
********************************************/
void mnu_hdl_sn(void)
{
	switch(keyval)
	{
		case key_up:
			mod_value++;
			if(mod_value>14)
				mod_value=0;
			renew_page_low(mod_value+Itm_s);
			break;
		case key_down:
			mod_value--;
			if(mod_value<0)
				mod_value=14;
			renew_page_low(mod_value+Itm_s);
			break;
		case key_set:
			ref_table[ref_sn]=mod_value;
			store_ref(ref_sn);//保存参数值
			mnu_return();//返回上级菜单
			break;
		//case key_ent:
			
			//;
	}
}
/********************************************
函数名: mnu_hdl_sc0
功能: 量程零点设置
形式参数:无
返回值:无
********************************************/
void mnu_hdl_sc0(void)
{

	switch(keyval)
	{
		case key_up:			
			mod_value=mod_value+key_mov;
			if(mod_value>9999)mod_value=9999;
			get_pos();//小数点位置
			dis_flag=0;	//高低4位标置 1-高4位 0-低4位
			display_num(mod_value);//数字显示			
			break;
		case key_down:
			mod_value=mod_value-key_mov;
			if(mod_value<-1999)mod_value=-1999;
			get_pos();//小数点位置
			dis_flag=0;//高低4位标置
			display_num(mod_value);//数字显示			
			break;
		case key_set:
			ref_table[ref_sc0]=mod_value;
			store_ref(ref_sc0);//保存参数值
			page_point=5;//进入满量程菜单
			renew_page_high(mnu_scf);
			mod_value=ref_table[ref_scf];
			//set_flag=0;
			dis_flag=0;
			display_num(ref_table[ref_scf]);	
			break;
		//case key_ent:		
	}
}
/********************************************
函数名: mnu_hdl_scf
功能: 量程满程设置
形式参数:无
返回值:无
********************************************/
void mnu_hdl_scf(void)
{
	switch(keyval)
	{
		case key_up:			
			mod_value=mod_value+key_mov;
			if(mod_value>9999)mod_value=9999;
			get_pos();//小数点位置
			dis_flag=0;	//高低4位标置 1-高4位 0-低4位
			display_num(mod_value);//数字显示			
			break;
		case key_down:
			mod_value=mod_value-key_mov;
			if(mod_value<-1999)mod_value=-1999;
			get_pos();//小数点位置
			dis_flag=0;//高低4位标置
			display_num(mod_value);//数字显示			
			break;
		case key_set:
			ref_table[ref_scf]=mod_value;
			store_ref(ref_scf);//保存参数值
			page_point=6;//进入当前温度菜单
			renew_page_high(mnu_tr);
			mod_value=ref_table[ref_tr];
			//set_flag=0;
			dis_flag=0;
			display_num(ref_table[ref_tr]);	
			break;
		//case key_ent:
	}
}
/********************************************
函数名: mnu_hdl_tr
功能: 当前温度设置
形式参数:无
返回值:无
********************************************/
void mnu_hdl_tr(void)
{
	switch(keyval)
	{
		case key_up:			
			mod_value=mod_value+key_mov;
			if(mod_value>50)mod_value=50;
			get_pos();//小数点位置
			dis_flag=0;	//高低4位标置 1-高4位 0-低4位
			display_num(mod_value);//数字显示			
			break;
		case key_down:
			mod_value=mod_value-key_mov;
			if(mod_value<0)mod_value=0;
			get_pos();//小数点位置
			dis_flag=0;//高低4位标置
			display_num(mod_value);//数字显示			
			break;
		case key_set:
			ref_table[ref_tr]=mod_value;
			store_ref(ref_tr);//保存参数值
			////////???	//当前温度AD值
			//store_ref(14);//保存参数值
			mnu_return();//返回主菜单
			break;
		//case key_ent:
	}
}
/********************************************
函数名: mnu_hdl_d0
功能: 修订输出零点
形式参数:无
返回值:无
********************************************/
void mnu_hdl_d0(void)
{
	switch(keyval)
	{
		case key_up:			
			mod_value=mod_value+key_mov;
			if(mod_value>9999)mod_value=9999;
			get_pos();//小数点位置
			dis_flag=0;	//高低4位标置 1-高4位 0-低4位
			display_num(mod_value);//数字显示			
			break;
		case key_down:
			mod_value=mod_value-key_mov;
			if(mod_value<-1999)mod_value=-1999;
			get_pos();//小数点位置
			dis_flag=0;//高低4位标置
			display_num(mod_value);//数字显示			
			break;
		case key_set:
			ref_table[ref_d0]=mod_value;
			store_ref(ref_d0);//保存参数值
			page_point=9;
			renew_page_high(mnu_df);
			mod_value=ref_table[ref_df];
			//set_flag=0;
			dis_flag=0;
			display_num(ref_table[ref_df]);	
			break;
		//case key_ent:
	}
}
/********************************************
函数名: mnu_hdl_df
功能: 修订输出满点
形式参数:无
返回值:无
********************************************/
void mnu_hdl_df(void)

⌨️ 快捷键说明

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