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

📄 main_ctl_test1.c

📁 MEGA32L 单片机的按键,LED,LCD等测试例程,ICCAVR编译器
💻 C
📖 第 1 页 / 共 5 页
字号:
		st_adc_op.inner_curr_adc_value[CONST_ADC_CHANNEL_X] =do_adc_one_channel_change(CONST_ADC_CHANNEL_X);
		st_adc_op.inner_curr_adc_value[CONST_ADC_CHANNEL_Y] =do_adc_one_channel_change(CONST_ADC_CHANNEL_Y);
		st_adc_op.inner_curr_adc_value[CONST_ADC_CHANNEL_Z] =do_adc_one_channel_change(CONST_ADC_CHANNEL_Z);

		CODE_GUANG_DIAN_CHI_POWER_OFF;			//关闭光电池电源;

		//进行电池电源的采样;
		st_adc_op.inner_curr_adc_value[CONST_ADC_CHANNEL_POWER] =do_adc_one_channel_change(CONST_ADC_CHANNEL_POWER);

		//每隔一定时间,不要时间操作函数,节省代码,进行一次串口调试数据串的输出!
		//AD[x][y][z][power], [水银开关], 限位开关[4], PWM[],[按键];
		delay_1ms();
		if(++control_serial_send_count >800)		
		{	//一次循环的延时大致 1ms,这里控制大约2s一次上送数据!
			control_serial_send_count =0;
//在这里设置断点,使用仿真器观察ADC转换和限位开关的结果!
			st_serial_buff.send[0]	=(st_adc_op.inner_curr_adc_value[CONST_ADC_CHANNEL_X] >>8) &0xff;
			st_serial_buff.send[1]	=st_adc_op.inner_curr_adc_value[CONST_ADC_CHANNEL_X] &0xff;
			st_serial_buff.send[2]	=(st_adc_op.inner_curr_adc_value[CONST_ADC_CHANNEL_Y] >>8) &0xff;
			st_serial_buff.send[3]	=st_adc_op.inner_curr_adc_value[CONST_ADC_CHANNEL_Y] &0xff;
			st_serial_buff.send[4]	=(st_adc_op.inner_curr_adc_value[CONST_ADC_CHANNEL_Z]) &0xff;
			st_serial_buff.send[5]	=(st_adc_op.inner_curr_adc_value[CONST_ADC_CHANNEL_Z] >>8) &0xff;
			st_serial_buff.send[6]	=(st_adc_op.inner_curr_adc_value[CONST_ADC_CHANNEL_POWER] >>8) &0xff;
			st_serial_buff.send[7]	=st_adc_op.inner_curr_adc_value[CONST_ADC_CHANNEL_POWER] &0xff;
			st_serial_buff.send[8]	=0xff;
			st_serial_buff.send[9]	=st_work_mode.flag_is_horizontal;
			st_serial_buff.send[10]	=un_165_in.st_165_in.switch_x_limit_left;
			st_serial_buff.send[11]	=un_165_in.st_165_in.switch_x_limit_right;
			st_serial_buff.send[12]	=un_165_in.st_165_in.switch_y_limit_up;
			st_serial_buff.send[13]	=un_165_in.st_165_in.switch_y_limit_down;
			st_serial_buff.send[14]	=0xff;
			st_serial_buff.send[15]	=(bak_pwm_ctl_data >>8) &0xff;
			st_serial_buff.send[16]	=bak_pwm_ctl_data &0xff;
			st_serial_buff.send[17]	=0xff;
			st_serial_buff.send[18]	=st_curr_key.flag_now_is_local_key;
			st_serial_buff.send[19]	=st_curr_key.flag_key_is_long_type;
			st_serial_buff.send[20]	=st_curr_key.local_key_label;
			st_serial_buff.send[21]	=st_curr_key.ir_key_label;
			st_serial_buff.send[22]	=0xff;
			
			st_serial_buff.tx_pos_start =1;
			st_serial_buff.slen_needed =23;
			UDR =st_serial_buff.send[0];	//启动中断方式的发送
			UCSRB |=BIT(UDRIE);		//因为UDRIE中断回自我关断,以减少CPU负荷!		
		}
	}
}


//----------------------------------------------------------------------------
//到此中断已经全部打开!	[I +Timer0/INT0/INT1/INT2/RXC/TXC/UDRE]
//进行出厂光电池中心位置的设置参数的删除,仅仅相应本机按键!
//Left + Power到此
//最后自动关机,结束
//----------------------------------------------------------------------------
void	Dowith_Init_Para_Delete(void)
{
uchar tmp;
	tmp =CONST_KEY_LAB_IDEL;	
_prog_label_wait_key_up:
	//先清除原来的按键,再进行按键读入
	st_judge_key.curr_get_key_value =CONST_KEY_LAB_IDEL;	

	//使用查询方式进行按键端口的输入!
	if(key_local_judge_press() !=0)
	{	//存在按键输入
		//st_judge_key.curr_key_is_long;
		//按键状态是低9bit有效!
		tmp =change_and_get_key_label(st_judge_key.curr_get_key_value);		

		if(tmp ==CONST_KEY_LAB_LEFT_WITH_POWER)
		{	//还是原来的按键 Left + Power
			goto	_prog_label_wait_key_up;	
		}
		else if(tmp ==CONST_KEY_LAB_LEFT)
		{	//电源按键已经弹起,仅仅是 LEFT
			goto	_prog_label_power_key_has_up;	
		}
		else
		{	//没有按键 或者 其他非法按键
			goto	_prog_label_error;		
		}
	}

//标识已经松开电源按键!
_prog_label_power_key_has_up:	
	//电源灯闪烁3次;
	led_and_beep_operation(CONST_XU_HAO_OF_POWER_LED, CONST_FLAG_FLASH_IS_LED_BEEP_FLASH, 3);
	while(st_led_beep_op.all_times_power_led_flashing !=0);	//等待闪烁完毕
	
	//x灯长亮;	
	led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED, CONST_FLAG_FLASH_IS_LED_BEEP_ON_EVER, 0);

_prog_label_wait_left_key_up:
	tmp =CONST_KEY_LAB_IDEL;

	//先清除原来的按键,再进行按键读入
	st_judge_key.curr_get_key_value =CONST_KEY_LAB_IDEL;	

	//使用查询方式进行按键端口的输入!
	if(key_local_judge_press() !=0)
	{	//存在按键输入
		//st_judge_key.curr_key_is_long;
		//按键状态是低9bit有效!
		tmp =change_and_get_key_label(st_judge_key.curr_get_key_value);		

		if(tmp ==CONST_KEY_LAB_LEFT)
		{	//LEFT按键保持
			goto	_prog_label_wait_left_key_up;	
		}
		else if(tmp ==CONST_KEY_LAB_IDEL)
		{	//按键正确弹起
			goto	_prog_label_start_delete_paras;	
		}
		else
		{	//其他非法按键	
			goto	_prog_label_error;			
		}
	}

	
_prog_label_start_delete_paras:		
	//前面x灯是亮的
	led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED, CONST_FLAG_FLASH_IS_LED_BEEP_OFF, 1);

	//	清除EEPROM中的curr_ad_x,curr_ad_y,curr_ad_z设置
	EEPROMwrite(CONST_EEPROM_ADDR_OF_LAB_X_Y, ~CONST_EEPROM_PARA_HAS_SET);
	EEPROMwrite(CONST_EEPROM_ADDR_OF_LAB_Z, ~CONST_EEPROM_PARA_HAS_SET);

	//tilt灯,scan灯,speed灯闪烁1次;
	led_and_beep_operation(CONST_XU_HAO_OF_Y_AND_TILT_LED, CONST_FLAG_FLASH_IS_LED_BEEP_FLASH, 1);
	led_and_beep_operation(CONST_XU_HAO_OF_Z_AND_Z_SPEED_LED, CONST_FLAG_FLASH_IS_LED_BEEP_FLASH, 1);	
	led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED, CONST_FLAG_FLASH_IS_LED_BEEP_FLASH, 1);
	while(st_led_beep_op.all_times_x_and_pan_led_flashing !=0);		//等待闪烁完毕
		
_prog_label_power_down:
	excute_power_off();			//自动关电处理	

//测试
#if	(DEBUG_ENABLE_NEGLET_TEST_PROG ==0)
	tmp =0;
	do{
		delay_x250ms(4);
		EEPROMReadBytes(CONST_EEPROM_ADDR_OF_LAB_X_Y, (uchar *)&st_eeprom_para_gdc, CONST_EEPROM_LENTH_OF_PARA_GDC_SETS);	

		st_serial_buff.send[0]	=st_eeprom_para_gdc.eep_sets_lable_x_and_y;

		st_serial_buff.send[1]	=(st_eeprom_para_gdc.eep_sets_x_middle_pos_adc_value >>8) &0xff;
		st_serial_buff.send[2]	=st_eeprom_para_gdc.eep_sets_x_middle_pos_adc_value &0xff;

		st_serial_buff.send[3]	=(st_eeprom_para_gdc.eep_sets_y_middle_pos_adc_value >>8) &0xff;
		st_serial_buff.send[4]	=st_eeprom_para_gdc.eep_sets_y_middle_pos_adc_value &0xff;

		st_serial_buff.send[5]	=st_eeprom_para_gdc.eep_sets_lable_z;

		st_serial_buff.send[6]	=(st_eeprom_para_gdc.eep_sets_y_middle_pos_adc_value >>8) &0xff;
		st_serial_buff.send[7]	=st_eeprom_para_gdc.eep_sets_y_middle_pos_adc_value &0xff;

		st_serial_buff.send[8]	=0x00;

		st_serial_buff.tx_pos_start =1;
		st_serial_buff.slen_needed =9;
		UDR =st_serial_buff.send[0];	//启动中断方式的发送
		UCSRB |=BIT(UDRIE);		//因为UDRIE中断回自我关断,以减少CPU负荷!		
	}while(++tmp <10);

#endif

//按键顺序出错	
_prog_label_error:
	//scan,tilt,speed灯长亮
	led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED, CONST_FLAG_FLASH_IS_LED_BEEP_ON_EVER, 0);
	led_and_beep_operation(CONST_XU_HAO_OF_Y_AND_TILT_LED, CONST_FLAG_FLASH_IS_LED_BEEP_ON_EVER, 0);	
	led_and_beep_operation(CONST_XU_HAO_OF_Z_AND_Z_SPEED_LED, CONST_FLAG_FLASH_IS_LED_BEEP_ON_EVER, 0);
	
	delay_x250ms(3);
	//等待Power按键关机
	do
	{	
		tmp =CONST_KEY_LAB_IDEL;

		//先清除原来的按键,再进行按键读入
		st_judge_key.curr_get_key_value =CONST_KEY_LAB_IDEL;	

		//使用查询方式进行按键端口的输入!
		if(key_local_judge_press() !=0)
		{	//存在按键输入
			//st_judge_key.curr_key_is_long;
			//按键状态是低9bit有效!
			tmp =change_and_get_key_label(st_judge_key.curr_get_key_value);		

			if(tmp ==CONST_KEY_LAB_POWER) break;
		}
	}while(1);
	goto	_prog_label_power_down;
	
}
/*
//	left + Power -> left ->x,y,z闪烁3次, ->松开left按键 ->x,y,z闪烁1次后自动关机;
//	按键出错时 ->x,y,z长亮,等待按POWER键关机
*/


//---------------------------------------------------------
//厂家设置光电池的中心参数
//软件校准流程下的按键操作
//手动/自动按键 +电源按键
//需要分x/y和z方向两次来设置参数!
//手动调节的范围是2分,对应的电压的AD值需要测试后得到!
//输入:
//	key_in		外部按键标识输入
//	st_work_mode.steps_in_init_paras_set =CONST_FLAG_ADJUST_X/Y/Z_DIRECT
//	当前adc中心值
//	adc数值上2分的差值定义
//X:key_left=0x0317, key_right=0x0017	
//Y:key_up=0x0020, key_down=0x038A
//Z(x): key_Z(x)_left=0x0017, key_Z(x)_right=0x0360;	
//---------------------------------------------------------
void	dowith_keys_in_init_gdc_paras_set(uchar key_in)
{	
#if	(DEBUG_ENABLE_NEGLET_TEST_PROG ==0)
uchar tmp;
#endif
//20070831(1-2) 需要随时响应按键
/*
//没有自动找平过则不会响应Power以外的按键!
	if(st_work_mode.bak_flag_is_horizontal ==CONST_FLAG_IS_VERTICAL_MODE)
	{	//垂直方向
		if((st_work_mode.flag_finding_level_mode & CONST_FLAG_IS_Z_HAS_SEARCH_END_LEVEL) !=CONST_FLAG_IS_Z_HAS_SEARCH_END_LEVEL)
		{	
			return;
		}
	}
	else	//if(h_or_v ==CONST_FLAG_IS_HORIZONTAL_MODE)
	{	//水平方向(缺省)
		if( ( (st_work_mode.flag_finding_level_mode & CONST_FLAG_IS_X_HAS_SEARCH_END_LEVEL) !=CONST_FLAG_IS_X_HAS_SEARCH_END_LEVEL ) ||
		    ( (st_work_mode.flag_finding_level_mode & CONST_FLAG_IS_Y_HAS_SEARCH_END_LEVEL) !=CONST_FLAG_IS_Y_HAS_SEARCH_END_LEVEL ) )
		{
			return;
		}
	}		
*/

	switch(key_in)
	{	
//注意:这里上/下/左/右动作,1次更改的ADC数据是 1,
//是否移动决定于是否超出自动找平过程的static的范围!
//调整范围2分决定于ADC数据的MIN...MAX的预定值,参数设置模式下没有绝对的中心了!
	case CONST_KEY_LAB_UP:
		if(st_work_mode.steps_in_init_paras_set ==CONST_FLAG_ADJUST_X_DIRECT)
		{	//x: left(up), adc数据 变大
			//只要更改 mid_pos 的值,位置会由自动找平过程进行动作!
			if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].mid_pos <CONST_VALUE_OF_X_DELTA_2_FEN_MAX)
			{
				 st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].mid_pos +=(CONST_STATIC_DELTA >>1);
			}
		}
		else if(st_work_mode.steps_in_init_paras_set ==CONST_FLAG_ADJUST_Y_DIRECT)
		{	//y: up, adc数据 变小
			//只要更改 mid_pos 的值,位置会由自动找平过程进行动作!
			if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].mid_pos >CONST_VALUE_OF_Y_DELTA_2_FEN_MIN)
			{
				 st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].mid_pos -=(CONST_STATIC_DELTA >>1);
			}
		}
		else if(st_work_mode.steps_in_init_paras_set ==CONST_FLAG_ADJUST_Z_DIRECT)
		{	//z(x): left(up), ADC数据变小
			//只要更改 mid_pos 的值,位置会由自动找平过程进行动½œ!
			if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].mid_pos >CONST_VALUE_OF_Z_DELTA_2_FEN_MIN)
			{
				 st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].mid_pos -=(CONST_STATIC_DELTA >>1);
			}
		}		
		else
		{
		}
		break;
				
	case CONST_KEY_LAB_DOWN:
		if(st_work_mode.steps_in_init_paras_set ==CONST_FLAG_ADJUST_X_DIRECT)
		{	//x: right(down), adc数据 变小
			//只要›´改 mid_pos 的值,位置会由自动找平过程进行动作!
			if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].mid_pos >CONST_VALUE_OF_X_DELTA_2_FEN_MIN)
			{
				 st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].mid_pos -=(CONST_STATIC_DELTA >>1);
			}
		}
		else if(st_work_mode.steps_in_init_paras_set ==CONST_FLAG_ADJUST_Y_DIRECT)
		{	//y: down, adc数据 变大
			//只要更改 mid_pos 的值,位置会由自动找平过程进行动作!
			if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].mid_pos <CONST_VALUE_OF_Y_DELTA_2_FEN_MAX)
			{
				 st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].mid_pos +=(CONST_STATIC_DELTA >>1);
			}
		}
		else if(st_work_mode.steps_in_init_paras_set ==CONST_FLAG_ADJUST_Z_DIRECT)
		{	//z(x): right(down), ADC数据变大
			if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].mid_pos <CONST_VALUE_OF_Z_DELTA_2_FEN_MAX)
			{
				 st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].mid_pos +=(CONST_STATIC_DELTA >>1);
			}
		}		
		else
		{
		}
		break;
	
	case CONST_KEY_LAB_IR_X_Y_TILT:		//20070905(2-1)		
	case CONST_KEY_LAB_Y_AND_TILT:
		if(st_work_mode.bak_flag_is_horizontal ==CONST_FLAG_IS_VERTICAL_MODE)
		{	//垂直位置
			//当前调节数据 =3[z];›¸关指示灯闪烁输出在函数外部
			st_work_mode.steps_in_init_paras_set =CONST_FLAG_ADJUST_Z_DIRECT;
			//关闭 X PAN灯的闪烁
			led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED,CONST_FLAG_FLASH_IS_LED_BEEP_OFF,0);
			//关闭 Y TILT灯的闪烁
			led_and_beep_operation(CONST_XU_HAO_OF_Y_AND_TILT_LED,CONST_FLAG_FLASH_IS_LED_BEEP_OFF,0);			

			//打开 Z SPEED灯的闪烁
			led_and_beep_operation(CONST_XU_HAO_OF_Z_AND_Z_SPEED_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER,0);
		}
		else	//if(h_or_v ==CONST_FLAG_IS_HORIZONTAL_MODE)
		{	//水平方向(缺省)
			//当前调节数据 =1[x] ->2[y] ->1[x];相关指示灯闪烁输出在外部

			//关闭 Z SPEED灯的闪烁
			led_and_beep_operation(CONST_XU_HAO_OF_Z_AND_Z_SPEED_LED,CONST_FLAG_FLASH_IS_LED_BEEP_OFF,0);

			//同时设置SCAN灯或者TILT灯—ª烁输‡º;
			if(st_work_mode.steps_in_init_paras_set ==CONST_FLAG_ADJUST_X_DIRECT)
			{
				st_work_mode.steps_in_init_paras_set =CONST_FLAG_ADJUST_Y_DIRECT;
				//关闭 X PAN灯的闪烁
				led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED,CONST_FLAG_FLASH_IS_LED_BEEP_OFF,0);				

				//打开 Y TILT灯的闪烁
				led_and_beep_operation(CONST_XU_HAO_OF_Y_AND_TILT_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER,0);			
			}
			else
			{	//缺省是X方向的设置
				st_work_mode.steps_in_init_paras_set =CONST_FLAG_ADJUST_X_DIRECT;
				//关闭 Y TILT灯的闪ƒ
				led_and_beep_operation(CONST_XU_HAO_OF_Y_AND_TILT_LED,CONST_FL

⌨️ 快捷键说明

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