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

📄 main_ctl_test1.c

📁 MEGA32L 单片机的按键,LED,LCD等测试例程,ICCAVR编译器
💻 C
📖 第 1 页 / 共 5 页
字号:
				st_work_mode .power_alarm_state =CONST_LABEL_POWER_GREAT_THAN_43V;	
				//20070913(1-2)
				flag_is_power_lower_flash =0;
				//这里不能关闭Power灯,因为会影响找平中的闪烁显示,并且电压是不会使用中低->高电平的
				//led_and_beep_operation(CONST_XU_HAO_OF_POWER_LED, CONST_FLAG_FLASH_IS_LED_BEEP_OFF, 0);
			}
			else if(word_tmp <=CONST_POWER_ADC_VALUE_OF_40V)
			{	//<=4.0V
				st_work_mode.power_alarm_state	=CONST_LABEL_POWER_LESS_THAN_40V;
				//先清除原来的指示灯和激光
				led_and_beep_all_off();
				//停止转动 20070905(1-2)
				CODE_MOTOR_Z_MOVE_STOP;
				
				//20070831(3-1) 告警时间延长到30s!
				//点亮Power和Beep
				led_and_beep_operation(CONST_XU_HAO_OF_POWER_LED,CONST_FLAG_FLASH_IS_LED_BEEP_ON,30000/CONST_XU_HAO_OF_ALL_LED_AND_BEEP);
				led_and_beep_operation(CONST_XU_HAO_OF_BEEP,CONST_FLAG_FLASH_IS_LED_BEEP_ON,30000/CONST_XU_HAO_OF_ALL_LED_AND_BEEP);
				
				//提示结束后自动关电源,有Power按键也立即关闭电源 20070905(1-3)
				while( (st_led_beep_op.on_time_count_beep !=0) && (CODE_GET_POWER_IN ==0) );
				excute_power_off();					
			}
			else	
			{	//电池电压=4V...4.3V
				st_work_mode.power_alarm_state	=CONST_LABEL_POWER_4V_TO_43V;
				//Power灯闪烁
				led_and_beep_operation(CONST_XU_HAO_OF_POWER_LED, CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);			
				//20070913(1-3)
				flag_is_power_lower_flash =1;

			}
		}
#endif

		//-------------------------------------------------------------
		//4)位置开关的检测
		//水平放置时,开关位置恒为'1'(断开),垂直放置时,应该为'0'(导通),由于震动会变成'1'!
		if(detect_switch_is_horizontal_flag[1] <CONST_DETECT_POSITION_COUNT_ALL)
		{
			detect_switch_is_horizontal_flag[0] += st_work_mode.flag_is_horizontal; 
			detect_switch_is_horizontal_flag[1] ++;			
		}
		else
		{
			if(st_work_mode.bak_flag_is_horizontal ==1)
			{	
				if(detect_switch_is_horizontal_flag[0] <CONST_DETECT_POSITION_COUNT_ALL -10)
				{
					goto	_prog_label_do_soft_reset;
				}
			}
			else
			{	
				
				if(detect_switch_is_horizontal_flag[0] >=CONST_DETECT_POSITION_COUNT_ALL -1)
				{
_prog_label_do_soft_reset:
					CODE_EXTERN_MODUL_POWER_ON;
					_CLI();			
					soft_reset();
				}
			}
			detect_switch_is_horizontal_flag[0] =0;
			detect_switch_is_horizontal_flag[1] =0;
		}		


		//-------------------------------------------------------------
		//5)自动找平和自动控制过程(按照模式分别执行)
		//输入:
		//	st_work_mode.flag_finding_level_mode =0,1,2,4,8=init,x,y,z,manual
		//出厂参数设置模式 没有自动控制模式,一致进行自动找平过程!
		finding_levels_or_auto_control();		

		//-------------------------------------------------------------
		//6)进行各种工作模式下Z电机转动的启动
		//按照标志 need_start_z_moving 进行操作
		start_circus_of_all_work_mode();


		//-------------------------------------------------------------
		//7)按照模式分别执行按键操作 time=23us(没有按键时)
		//st_z_motor_control.work_mode_set
		dowith_keys_response_of_all_work_mode();		
	};
}

//============================================================================
//	子函数部分
//============================================================================
//----------------------------------------------------------------------------
//自动检测并设置旋转速度参数
//输入:
//	st_z_motor_control.work_mode_set
//输出:
//	st_eeprom_para_speed_pwm
//注意: 进入此函数前,INT0,INT1,TIMER2中断都没有开启!
//----------------------------------------------------------------------------
void	Auto_Detect_To_Set_Circus_Speed(void)
{
uchar	tmp;
uint	return_set_pwm_val[3];
uchar	ret;
uint	word_tmp;

	tmp =CONST_KEY_LAB_IDEL;	
_prog_label_ss_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_Z_AND_SPEED_WITH_POWER)
		{	//还是原来的按键 Power + Speed	
			goto	_prog_label_ss_wait_key_up;	
		}
		else if(tmp ==CONST_KEY_LAB_Z_AND_SPEED)
		{	//电源按键已经弹起,仅仅是 SPEED
			goto	_prog_label_ss_power_key_has_up;	
		}
		else
		{	//没有按键 或者 其他非法按键
			goto	_prog_label_ss_set_error;		
		}
	}

//标识已经松开电源按键!
_prog_label_ss_power_key_has_up:
_prog_label_ss_wait_speed_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_Z_AND_SPEED)
		{	//SPEED按键保持
			goto	_prog_label_ss_wait_speed_key_up;	
		}
		else if(tmp !=CONST_KEY_LAB_IDEL)
		{	//按键正确弹起
			goto	_prog_label_ss_start_set_speed;	
		}
		else
		{	//其他非法按键	
			goto	_prog_label_ss_set_error;			
		}
	}

_prog_label_ss_start_set_speed:
	//停止timer0,直接使用引脚控制LED指示
	//Timer2不变化
	CODE_STOP_TIME0;
	CODE_JI_GUANG_LED_ON;

	//INT0已经是上/下沿中断
	GIFR	|= BIT(INTF0);
	//关闭INT1中断
	GICR	&= ~BIT(INT1);	
	//关闭INT2中断
	GICR	&= ~BIT(INT2);	

//20070817 使用灯闪烁
//以下开始依次设置3种速度
	CODE_START_TIME0;
	led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);	
	ret =now_set_one_speed_sub(CONST_CIRCU_SPEED_60, &return_set_pwm_val[0]);
	if(ret ==0)
	{	//出错LED闪烁
		goto _prog_label_ss_set_error;
	}
	//60cps 成功继续	
	led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED,CONST_FLAG_FLASH_IS_LED_BEEP_OFF, 0);	
	led_and_beep_operation(CONST_XU_HAO_OF_Y_AND_TILT_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);	
	ret =now_set_one_speed_sub(CONST_CIRCU_SPEED_300, &return_set_pwm_val[1]);
	if(ret ==0)
	{	//出错LED闪烁
		goto _prog_label_ss_set_error;
	}
	//300cps 成功继续
	led_and_beep_operation(CONST_XU_HAO_OF_Y_AND_TILT_LED,CONST_FLAG_FLASH_IS_LED_BEEP_OFF, 0);	
	led_and_beep_operation(CONST_XU_HAO_OF_Z_AND_Z_SPEED_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);	
	ret =now_set_one_speed_sub(CONST_CIRCU_SPEED_600, &return_set_pwm_val[2]);
	if( (ret ==0) || (ret ==CONST_SET_SPEED_ADJUST_TIMES_MAX +1) )
	{	//出错LED闪烁
//设置失败,x,y,z灯闪烁,等待关电处理,但是不更改eeprom中的PWM设置参数
//相关步骤的指示灯闪烁,蜂鸣器长响一声!
_prog_label_ss_set_error:
		led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);	
		led_and_beep_operation(CONST_XU_HAO_OF_Y_AND_TILT_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);	
		led_and_beep_operation(CONST_XU_HAO_OF_Z_AND_Z_SPEED_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);	

		while(1)
		{
			if( (word_tmp =judge_read_local_and_ir_keys()) ==CONST_HAS_READ_KEY )
			{
				if(st_curr_key.local_key_label  ==CONST_KEY_LAB_POWER)
				{
					excute_power_off();	//自动关机
				}
			}
		};
	}
	else
	{
_prog_label_ss_save_pwm_val_set:
//最后600cps设置成功
//成功: 仅仅是X,Y,Z三个闪烁一次,自动关机
		//保存参数	
		st_eeprom_para_speed_pwm.eep_sets_lab_speed_pwm =CONST_EEPROM_PARA_HAS_SET;
		st_eeprom_para_speed_pwm.eep_sets_stop_pwm_val =CONST_PWM_OCR1B_DATA_STOP_DEF;
		st_eeprom_para_speed_pwm.eep_sets_60cps_pwm_val =return_set_pwm_val[0];
		st_eeprom_para_speed_pwm.eep_sets_300cps_pwm_val =return_set_pwm_val[1];
		st_eeprom_para_speed_pwm.eep_sets_600cps_pwm_val =return_set_pwm_val[2];				
		EEPROMWriteBytes(CONST_EEPROM_ADDR_OF_LAB_SPEED_PWM_VAL, (uchar *)&st_eeprom_para_speed_pwm, CONST_EEPROM_LENTH_OF_PARA_SPEED_PWM_SETS);

#if	(DEBUG_ENABLE_NEGLET_TEST_PROG ==0)
	tmp =0;
	do{
		delay_x250ms(4);
		EEPROMReadBytes(CONST_EEPROM_ADDR_OF_LAB_SPEED_PWM_VAL, (uchar *)&st_eeprom_para_speed_pwm, CONST_EEPROM_LENTH_OF_PARA_SPEED_PWM_SETS);	

		st_serial_buff.send[0]	=st_eeprom_para_speed_pwm.eep_sets_lab_speed_pwm;

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

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

		st_serial_buff.send[5]	=(st_eeprom_para_speed_pwm.eep_sets_300cps_pwm_val >>8) &0xff;
		st_serial_buff.send[6]	=st_eeprom_para_speed_pwm.eep_sets_300cps_pwm_val &0xff;

		st_serial_buff.send[7]	=(st_eeprom_para_speed_pwm.eep_sets_600cps_pwm_val >>8) &0xff;
		st_serial_buff.send[8]	=st_eeprom_para_speed_pwm.eep_sets_600cps_pwm_val &0xff;

		st_serial_buff.send[9]	=0x00;

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

#endif		
		led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH, 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_MANUAL_AND_AUTO_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH, 1);	
		led_and_beep_operation(CONST_XU_HAO_OF_POWER_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH, 1);	
		while(st_led_beep_op.all_times_power_led_flashing !=0);
		excute_power_off();				
	}	
}

//----------------------------------------------------------------------------
//水平位置下的normal模式时的x,y的控制, 界限是static以下认为平衡,nor以上重新找平!
//输入:
//	[x].curr_filter_dat
//	[y].curr_filter_dat
//输出:
//	control_motor_x_move
//	control_motor_y_move
//X:key_left=0x0317, key_right=0x0017	
//Y:key_up=0x0020, key_down=0x038A
//----------------------------------------------------------------------------
void	control_on_normal_mode_at_horizontal(void)
{
	if( (st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].curr_filter_dat >st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].mid_pos +st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].nor_up_delta) ||
	    (st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].curr_filter_dat <st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].mid_pos -st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].nor_down_delta) )
	{	//超出范围, <=中心 -nor || >=中心 +nor
		//标识 &=X,进入初始找平状态;
		st_work_mode.flag_finding_level_mode &= ~(uchar)CONST_FLAG_IS_X_HAS_SEARCH_END_LEVEL;

		//准备进入初始找平预处理,但是不能更改当前的操作模式
		prepare_for_goto_finding_level();
	}	
	else if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].curr_filter_dat >st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].mid_pos +st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].static_up_delta)
	{	//>中心 +static
		//x细步right down输出,数据要变小
		control_motor_x_move(CONST_MOTOR_X_Y_MOVING_RIGHT_DOWN, CONST_MOTOR_X_MOVE_ONE_SMALL_STEP);
	}
	else if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].curr_filter_dat <st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].mid_pos -st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].static_down_delta)
	{	//<中心 -static
		//x细步left up输出,数据要变大
		control_motor_x_move(CONST_MOTOR_X_Y_MOVING_LEFT_UP, CONST_MOTOR_X_MOVE_ONE_SMALL_STEP);
	}
	else
	{	//>=中心 -static && <=中心 +static
		//20070907(1-1)
		control_motor_x_move(CONST_MOTOR_X_Y_MOVING_STOP,0);
	}
	
	if( (st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].curr_filter_dat >st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].mid_pos +st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].nor_up_delta) ||
	    (st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].curr_filter_dat <st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].mid_pos -st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].nor_down_delta) )
	{	//超出范围, <=中心 -nor || >=中心 +nor
		//标识 &=Y,进入初始找平状态;
		st_work_mode.flag_finding_level_mode &= ~(uchar)CONST_FLAG_IS_Y_HAS_SEARCH_END_LEVEL;		

		//准备进入初始找平预处理,但是不能更改当前的操作模式
		prepare_for_goto_finding_level();
	}	
	else if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].curr_filter_dat >st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].mid_pos +st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].static_up_delta)
	{	//>中心 +static
		//y细步left up输出,数据要变小
		control_motor_y_move(CONST_MOTOR_X_Y_MOVING_LEFT_UP, CONST_MOTOR_Y_MOVE_ONE_SMALL_STEP);
	}
	else if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].curr_filter_dat <st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].mid_pos -st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].static_down_delta)
	{	//<中心 -static
		//y细步right down输出,数据要变大
		control_motor_y_move(CONST_MOTOR_X_Y_MOVING_RIGHT_DOWN, CONST_MOTOR_Y_MOVE_ONE_SMALL_STEP);
	}
	else
	{	//>=中心 -static && <=中心 +static
		//20070907(1-2)
		control_motor_y_move(CONST_MOTOR_X_Y_MOVING_STOP,0);
	}
}

//----------------------------------------------------------------------------
//垂直位置下的normal模式时的z(x)的控制
//输入:
//	[z].curr_filter_dat
//输出:
//	control_motor_x_move
//	flag_finding_level_mode
//Z(x): key_Z(x)_left=0x0017, key_Z(x)_right=0x0360;	
//----------------------------------------------------------------------------
void	control_on_normal_mode_at_vertical(void)
{
	if( (st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].curr_filter_dat >st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].mid_pos +st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].nor_up_delta) ||
	    (st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].curr_filter_dat <st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].mid_pos -st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].nor_down_delta) )
	{	//超出范围, <=中心 -nor || >=中心 +nor
		//标识 &=Z,进入初始找平状态;

⌨️ 快捷键说明

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