This repository has been archived on 2024-12-31. You can view files and clone it, but cannot push or open issues or pull requests.
mfps/App/Src/key.c

348 lines
6.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}
}
}