352 lines
6.8 KiB
C
352 lines
6.8 KiB
C
#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)
|
||
{
|
||
GREEN_ON;
|
||
speed_ensure = 1;
|
||
key_msg[0] = 2;
|
||
}
|
||
if(key_msg[1] == 1)
|
||
{
|
||
BLUE_ON;
|
||
speed_select = (speed_select <= 0)?(2):(speed_select - 1);
|
||
key_msg[1] = 2;
|
||
}
|
||
if(key_msg[2] == 1)
|
||
{
|
||
GREEN_OFF;
|
||
BLUE_OFF;
|
||
speed_select = (speed_select >= 2)?(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;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|