#include "key.h" #include "app.h" unsigned char key_i = 0; unsigned int key_cnt[3] = {0}; //延时用计数 unsigned char key_msg[3] = {0}; //按键事件 unsigned char key_val[3] = {0}; //按键值 #define KEY_CNT 5 uint8_t com_flag = 0; //组合键状态,用于描述功能是否已经完成过一次 void Key_Scan(void) // 扫描K1-K3的状态 { key_val[0] = HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin); key_val[1] = HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin); key_val[2] = HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin); //检测按键 if(key_i >= 3) key_i = 0; if(key_val[key_i] == 0 && key_msg[key_i] == 0) //按键按下 { key_cnt[key_i]++; if(key_cnt[key_i] > KEY_CNT) { key_cnt[key_i] = 0; key_msg[key_i] = 1; //按键按下,触发事件1 } } if( key_msg[key_i] == 2 && key_val[key_i] == 1 ) { key_msg[key_i] = 0; //完成对应功能后,再清空事件 } if( (key_val[1] == 1) && (key_val[2] == 1) ) { com_flag = 0; } //按键按顺序增加 key_i++; if(key_i >= 3) key_i = 0; } void msg_clr() { key_msg[0] = 0; key_msg[1] = 0; key_msg[2] = 0; } //按键功能 uint8_t old2new_flag = 0; int tick_current = -1; //当前时刻 int tick_previous = -1; //计时开始的时刻 void key_act(void) { if(key_val[1] == 1 || key_val[2] == 1) //组合键是否按下 { //未按下组合键时,执行旧版程序 if(key_msg[0] == 1) //K1完成按下后 { oled_en = 1; //确认标志 key_msg[0] = 2; } if(key_msg[1] == 1) //K2完成按下后 { switch(oled_p) { case 2: //菜单选择 { if( oled_s[0] < 3 ) //0-1-2-3循环 { oled_s[0]++; }else { oled_s[0] = 0; } } break; case 4: //运行模式切换 0-1-2循环 { run_mode_temp[0] = (run_mode_temp[0] - 1) * (run_mode_temp[0] > 0 ) + 2 * (run_mode_temp[0] == 0); } break; case 5: //运行步长调节,仅限点动模式 { if(run_mode_temp[0] == 0) //0-15之间循环 { if(step_temp[0] > 1) { step_temp[0]--; }else { step_temp[0] = 15; } } } break; case 6: { direc_temp[0] = 2*(direc_temp[0] == 1) + 1*(direc_temp[0] == 2);//1-2之间循环 } break; case 7: //Cancel & OK 切换 { oled_s_motorok[0] = !oled_s_motorok[0]; //0-1 } break; case 9: { if(smp_intr_temp[0] > 5) //5-10 { smp_intr_temp[0]--; }else { smp_intr_temp[0] = 10; } } break; case 10: { if(smp_dpth_temp[0] > 10) //10-20 { smp_dpth_temp[0]--; }else { smp_dpth_temp[0] = 20; } } break; case 11: { oled_s_magnetok[0] = !oled_s_magnetok[0]; } break; case 12: { magnet_select[0] = (magnet_select[0] - 1)*(magnet_select[0] > 0) + 2*(magnet_select[0] == 0);//0-1-2 } break; case 13: { if(magnet_motor_sw != 0) //无论时1正转还是2反转,按下后都停 { magnet_motor_sw = 0; } else { magnet_motor_sw = 2; //停止状态下切换至反转 } } break; case 14: { magnet_s_ok[0] = !magnet_s_ok[0]; } break; } key_msg[1] = 2; } if(key_msg[2] == 1)//K3完成按下后 { switch(oled_p) { case 2: //菜单选择 { if( oled_s[0] > 0 ) { oled_s[0]--; }else { oled_s[0] = 3; } } break; case 4: //运行模式切换 { run_mode_temp[0] = (run_mode_temp[0] + 1) * (run_mode_temp[0] < 2); } break; case 5: //运行步长调节,仅限点动模式 { if(run_mode_temp[0] == 0) { if(step_temp[0] < 15) { step_temp[0]++; }else { step_temp[0] = 1; } } } break; case 6: { direc_temp[0] = 2*(direc_temp[0] == 1) + 1*(direc_temp[0] == 2); } break; case 7: //Cancel & OK 切换 { oled_s_motorok[0] = !oled_s_motorok[0]; } break; case 9: { if(smp_intr_temp[0] <10 ) { smp_intr_temp[0]++; }else { smp_intr_temp[0] = 5; } } break; case 10: { if(smp_dpth_temp[0] < 20) { smp_dpth_temp[0]++; }else { smp_dpth_temp[0] = 10; } } break; case 11: { oled_s_magnetok[0] = !oled_s_magnetok[0]; } break; case 12: { magnet_select[0] = (magnet_select[0] + 1)*(magnet_select[0] < 2); } break; case 13: { if(magnet_motor_sw != 0) { magnet_motor_sw = 0; } else { magnet_motor_sw = 1; } } break; case 14: { magnet_s_ok[0] = !magnet_s_ok[0]; } break; } key_msg[2] = 2; } }else if ( (old2new_flag == 0)&&(com_flag == 0) ) //按下组合键后,执行新版程序 { if(tick_previous == -1) //开始计时 { tick_previous = tick_500ms; } tick_current = tick_500ms; if( (tick_current - tick_previous) >= 2*3 ) //计时达到 N*500ms后执行功能 { //计时结束,开始执行功能 if( (key_val[1] == 0) && (key_val[2] == 0) ) { old2new_flag = 1; //0->1 切换至新版 disp_new = 0; com_flag = 1; }else //计时中途松开 { } //功能执行结束 tick_previous = -1; tick_current = -1; }else if( (tick_current - tick_previous) < 0 ) //溢出判断,溢出后重新开始下次计时 { tick_previous = -1; tick_current = -1; } } } void key_act_new(void) { if(key_val[1] == 1 || key_val[2] == 1) //组合键是否按下 { //未按下组合键时,执行新版程序 if(key_msg[0] == 1) //确认,用于切换运动和停止 { speed_ensure = 1; key_msg[0] = 2; } if(key_msg[1] == 1) //移动方向切换 { direc_select = !direc_select; key_msg[1] = 2; } if(key_msg[2] == 1) //速度档位切换 { speed_select = (speed_select >= 4)?(0):(speed_select + 1); key_msg[2] = 2; } }else if ( (old2new_flag == 1)&&(com_flag == 0) ) //按下组合键后,执行旧版程序 { if(tick_previous == -1) //开始计时 { tick_previous = tick_500ms; } tick_current = tick_500ms; if( (tick_current - tick_previous) >= 2*3 ) //计时达到 N*500ms后执行功能 { //计时结束,开始执行功能 if( (key_val[1] == 0) && (key_val[2] == 0) ) { old2new_flag = 0; //0->1 切换至旧版 oled_p = 1; com_flag = 1; }else //计时中途松开 { } //功能执行结束 tick_previous = -1; tick_current = -1; }else if( (tick_current - tick_previous) < 0 ) //溢出判断,溢出后重新开始下次计时 { tick_previous = -1; tick_current = -1; } } }