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

📄 key_pro.c

📁 在8052下实现电平电压测试功能,自己开发的单片系统
💻 C
字号:
/*
----------------------------------------------------------
;		(c) Copyright xami All Rights Reserved              
----------------------------------------------------------
;	SOURCE_FILE:    KEY_PRO.C
;	APPLICATION:	80c51\80c52
;	DESCRIPTION:    用户交互,按键处理<程序核心>
;	AUTHOR:         xami
;	DATE:           28 Apr. 2007
----------------------------------------------------------
*/
#include<put_digit.c>		//输入频率数据
#include<get_digit.c>		//取得频率数据
#include<format.c>			//格式化频率值,送显示


void key_process(uchar key)
{

uchar legit_f_num= 0;		//作为输入的频率是否正确的判断位

switch(key){
	/*菜单键*/
	case 0x18:{								//无条件响应
		mode= in_menu;
		for(i= 0;i<= 9;i++){
		dis_num[i]= menu[mode_list][i];}
		}break;/*end case 0x18*/
	
	/*向上、向下键处理*/
	//up:
	case 0x28:{								//菜单、设置幅度模式下响应
	if(mode== in_menu){																			//+菜单模式下
		if(mode_list< 5){
		mode_list++;
		for(j= 0;j<= 9;j++){
		dis_num[j]= menu[mode_list][j];}
		}else{					//直接显示err_
		show_err();}
	}else if((mode== in_submenu) && (mode_list== SE_U)){		//+设置幅度模式下
		if(mode_set_u_list< 5){
		mode_set_u_list++;
		for(j= 0;j<= 9;j++){
		dis_num[j]= u_step[mode_set_u_list][j];}
		}else{
		show_err();}
	}else if((mode== in_submenu) && (mode_list== STEP)){		//+步进显示模式
		if(have_step== 0){
			show_err();
		}else{
		if(step_i< 10){
		step_i++;
		for(j= 0;j<= 3;j++){							//voltage
		dis_num[j]= step_u[step_i][j];}
		temp_f= step_i*step_long + setf_f;	
		panduan();	
		for(j= 4;j<= 9;j++){							//frequency(为简化计算,直接对缓存的频率显存改变)
		dis_num[j]= digit_temp[j-4];}
		}else{		
		show_err();}
		}			
	}else{show_err();}				//其他模式下,直接显示err_	
	}break;/*end case 0x28*/

	//down:
	case 0x48:{								//菜单、设置幅度模式下响应
	if(mode== in_menu){																			//+菜单模式下
		if(mode_list> 0){
		mode_list--;
		for(j= 0;j<= 9;j++){
		dis_num[j]= menu[mode_list][j];}
		}else{						//直接显示err_
		show_err();}
	}else if((mode== in_submenu) && (mode_list== SE_U)){		//+设置幅度模式下
		if(mode_set_u_list> 0){
		mode_set_u_list--;
		for(j= 0;j<= 9;j++){
		dis_num[j]= u_step[mode_set_u_list][j];}
		}else{
		show_err();}
	}else if((mode== in_submenu) && (mode_list== STEP)){		//+步进显示模式
		if(have_step== 0){
			show_err();
		}else{
		if(step_i> 0){
		step_i--;
		for(j= 0;j<= 3;j++){						//voltage
		dis_num[j]= step_u[step_i][j];}
		temp_f= step_i*step_long + setf_f;		
		panduan();	
		for(j= 4;j<= 9;j++){						//frequency(为简化计算,直接对缓存的频率显存改变)
		dis_num[j]= digit_temp[j-4];}
		}else{		
		show_err();}
		}			
	}else{show_err();}				//其他模式下,直接显示err_	
	}break;/*end case 0x48*/

	//确认键处理
	case 0x88:{							//无条件响应,判断在哪个菜单下,相应处理
	if(mode == in_menu){							//+在主菜单模式下//
		mode= in_submenu;	//转到子菜单
		switch(mode_list){
			case SH_O:{						//+显示零偏
			if(u_zero!= 0){
			/*
			dis_num[9]=	0x6D;
			dis_num[8]=	0x76;
			dis_num[7]=	0x08;
			dis_num[6]=	0x3F;
			*/
			dis_num[5]= digit[0][((int)(u_zero/100))%10];
			dis_num[4]= digit[0][((int)(u_zero/10))%10];
			dis_num[3]= digit[1][((int)u_zero)%10];
			dis_num[2]= digit[0][((int)(u_zero*10))%10];
			dis_num[1]= digit[0][((int)(u_zero*100))%10];
			dis_num[0]= digit[0][((int)(u_zero*1000))%10];		
			}else{							//显示"null"
			show_null();
			}
			return;
			}break;

			case SH_F:{						//+显示频率
			if(setf_f== 0){						//未设定过频率,显示null			
			show_null();
			}else{								//设定过频率,则把值放入显存
			//结果放进显存
			/*
			dis_num[0]=	0x6D;
			dis_num[1]=	0x76;
			dis_num[2]=	0x08;
			dis_num[3]=	0x71;
			*/
			//把频率放真值放到临时频率,以便运行下面的panduan(),生成想要的频率显存
			temp_f= setf_f;	
			panduan();	
			dis_num[4]= digit_temp[0];
			dis_num[5]= digit_temp[1];
			dis_num[6]= digit_temp[2];			
			dis_num[7]= digit_temp[3];			
			dis_num[8]= digit_temp[4];			
			dis_num[9]= digit_temp[5];
			return;
			}
			}break;	
			
			case SH_U:{						//+显示电压
			res_u= get_u();
			res_u+= u_zero;			//加上零偏值
			/*
			dis_num[0]=	0x6D;
			dis_num[1]=	0x76;
			dis_num[2]=	0x08;
			dis_num[3]=	0x3E;
			*/
			dis_num[4]= digit[0][((int)(res_u/100))%10];
			dis_num[5]= digit[0][((int)(res_u/10))%10];
			dis_num[6]= digit[1][((int)res_u)%10];
			dis_num[7]= digit[0][((int)(res_u*10))%10];
			dis_num[8]= digit[0][((int)(res_u*100))%10];
			dis_num[9]= digit[0][((int)(res_u*1000))%10];
			return;
			}break;		
			
			case SE_F:{
			//初始化数字缓存
			digit_temp[0]= 0x00;
			digit_temp[1]= 0x00;
			digit_temp[2]= 0x00;
			digit_temp[3]= 0x00;
			digit_temp[4]= 0x00;
			digit_temp[5]= 0x00;	
			for(i= 0;i< 6;i++){
			have_p[i]= 0;}
			w= 6;						
			}break;
	
			case SE_U:{
			for(i= 0;i<= 9;i++){
			dis_num[i]= u_step[mode_set_u_list][i];}
							
			}break;	

			case STEP:{
			//初始化数字缓存
			digit_temp[0]= 0x00;
			digit_temp[1]= 0x00;
			digit_temp[2]= 0x00;
			digit_temp[3]= 0x00;
			digit_temp[4]= 0x00;
			digit_temp[5]= 0x00;	
			for(i= 0;i< 6;i++){
			have_p[i]= 0;}
			w= 6;							
			}break;
			
			default: break;
		}		
	}else if(mode == in_submenu){			//+在子菜单模式下//
		//mode = in_menu;
		switch(mode_list){
			case SH_O:{				
				mode= in_menu;
				for(i= 0;i<= 9;i++){
				dis_num[i]= menu[mode_list][i];}					
			}break;
		
			case SH_F:{				
				mode= in_menu;
				for(i= 0;i<= 9;i++){
				dis_num[i]= menu[mode_list][i];}					
			}break;

			case SH_U:{				
				mode= in_menu;
				for(i= 0;i<= 9;i++){
				dis_num[i]= menu[mode_list][i];}					
			}break;

			case SE_F:{				
		while(legit_f_num == 0){			//是合法的频率退出						
			key= get_digit();
			setf_f= temp_f;
			if(key == 0x18){
				mode= in_menu;	
				for(i= 0;i<= 9;i++){
				dis_num[i]= menu[mode_list][i];}	
				return;			
			}

			/*判断是不是合法的频率,合法则使循环结束*/
			if((setf_f> 0) && (setf_f< 20971520)){				//0~20 MHz
				show_good();
				legit_f_num = 1;		//跳出while(legit_f_num == 0)
			}else{
				show_err();
			}
		}//end for "while(legit_f_num == 0)"
				mode= in_menu;
				for(i= 0;i<= 9;i++){
				dis_num[i]= menu[mode_list][i];}			
			//送ad9851,产生相应的频率		
			input9851(setf_f);				
			}

			case SE_U:{				
			switch(mode_set_u_list){			//硬件开关转换
				case 0:{
					P2_2=1;
					P2_3=0;
					P2_4=1;	
				}break;
				case 1:{
					P2_2=0;
					P2_3=0;
					P2_4=1;	
				}break;
				case 2:{
					P2_2=1;
					P2_3=1;
					P2_4=0;	
				}break;
				case 3:{
					P2_2=0;
					P2_3=1;
					P2_4=0;	
				}break;
				case 4:{
					P2_2=1;
					P2_3=0;
					P2_4=0;	
				}break;
				case 5:{
					P2_2=0;
					P2_3=0;
					P2_4=0;			
				}break;
				default: break;
			}
				mode= in_menu;
				for(i= 0;i<= 9;i++){
				dis_num[i]= menu[mode_list][i];}				
			}break;

			case STEP:{				
		while(legit_f_num == 0){			//是合法的频率退出						
			key= get_digit();
			if(key == 0x18){
				mode= in_menu;
				for(i= 0;i<= 9;i++){
				dis_num[i]= menu[mode_list][i];}
				return;
			}
			step_f= temp_f;						
			/*判断是不是合法的频率,合法则使循环结束*/
			if((step_f> 0) && (step_f< 10971520)){		//0MHz~(20MHz-10000000)    (*和设置频率不同点,以便10次步进后为20MHz)
				show_good();
				legit_f_num = 1;		//跳出while(legit_f_num == 0)
			}else{
				show_err();
			}
		}//end for "while(legit_f_num == 0)"
				mode= in_menu;
				for(i= 0;i<= 9;i++){
				dis_num[i]= menu[mode_list][i];}	
			//计算步进值,并送ad9851,产生相应的频率,
			if(step_f< 100)step_long= 10;
			else if(step_f< 1000)step_long= 100;
			else if(step_f< 10000)step_long= 1000;				
			else if(step_f< 100000)step_long= 10000;				
			else if(step_f< 1000000)step_long= 100000;				
			else step_long= 1000000;				
				
			for(i= 0;i<= 10;i++){					//实际进行11次步进
				temp_f= i*step_f;
				input9851(temp_f);
				delay(7);										//等待频率稳定
				res_u= get_u();
				res_u+= u_zero;			//加上零偏值
			/*
			dis_num[0]=	0x6D;
			dis_num[1]=	0x76;
			dis_num[2]=	0x08;
			dis_num[3]=	0x3E;
			*/
				//不高两位
				//dis_num[4]= digit[0][((int)(res_u/100))%10];
				//dis_num[5]= digit[0][((int)(res_u/10))%10];
				step_u[i][0]= digit[1][((int)res_u)%10];
				step_u[i][1]= digit[0][((int)(res_u*10))%10];
				step_u[i][2]= digit[0][((int)(res_u*100))%10];
				step_u[i][3]= digit[0][((int)(res_u*1000))%10];			
				show_good();//步进完一次显示一下成功(因为此过程可能比较长,使用户知道还在正常运行)			
			}
			have_step= 1;															//设置过步进(用于向上、向下键控制时的判断)
			if((step_f> 0) && (step_f< 20971520)){		//再控制ad9851设置为设定的频率
				input9851(setf_f);
			}		
		
			}break;
			
			default:break;
		
		}		
	}else{														//+别的情况//
		show_err();
	}	
	}break;/*end case 0x88*/
	
default:break;
}/*end switch(key)*/
}/*end key_process*/

⌨️ 快捷键说明

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