stm32_ota/USER/USER_KEY/user_key.c

172 lines
7.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "user_key.h"
#include "user_oled.h"
/********************************************************************************
* @file user_key.c
* @author 晏诚科技 Mr.Wang
* @version V1.0.0
* @date 11-Dec-2018
* @brief 提供用户按键多级菜单操作
******************************************************************************
* @attention
*******************************************************************************/
//typedef struct
//{
// uint8_t menuIndex ; // 菜单索引号
// uint8_t keyMenuToIndex ; // 按下“菜单”键时转向的状态索引号
// uint8_t keyBackToIndex ; // 按下“退回”键时转向的状态索引号
// uint8_t keyUpToIndex ; // 按下“向上”键时转向的状态索引号
// uint8_t keyDnToIndex ; // 按下“向下”键时转向的状态索引号
// uint8_t keyLeftToIndex ; // 按下“向左”键时转向的状态索引号
// uint8_t keyRightToIndex ; // 按下“向右”键时转向的状态索引号
// uint8_t keyOkToIndex ; // 按下“OK”键时转向的状态索引号
// void (*CurrentOperate)(uint8_t x) ;// 当前状态应该执行的功能操作
//} KbdTab_s ;
volatile uint8_t currentMenuIndex = 0 ; //记录“当前所处的菜单页”的索引号
static volatile uint8_t laseKey = KEYBACK ; //记录“最后一次按的按键值”
KbdTab_s sKeyTab[15] =
{
/*menuIndex, keyMenuToIndex, keyBackToIndex, keyUpToIndex, keyDnToIndex, keyLeftToIndex, keyRightToIndex, keyOkToIndex, (*CurrentOperate)(void)*/
{ 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , HomeMenu } ,
{ 1 , 1 , 0 , 3 , 2 , 1 , 1 , 4 , Sub1MenuSelect1 } ,
{ 2 , 1 , 0 , 1 , 3 , 2 , 2 , 5 , Sub1MenuSelect2 } ,
{ 3 , 1 , 0 , 2 , 1 , 3 , 3 , 8 , Sub1MenuSelect3 } ,
{ 4 , 1 , 1 , 4 , 4 , 4 , 4 , 4 , Sub1_1Menu },
{ 5 , 1 , 1 , 7 , 6 , 5 , 5 , 10 , Sub1_2MenuSelect1 },
{ 6 , 1 , 1 , 5 , 7 , 5 , 5 , 11 , Sub1_2MenuSelect2 },
{ 7 , 1 , 1 , 6 , 5 , 5 , 5 , 12 , Sub1_2MenuSelect3 } ,
{ 8 , 1 , 3 , 9 , 9 , 8 , 8 , 13 , Sub1_3MenuSelect1 } ,
{ 9 , 1 , 3 , 8 , 8 , 9, 9 , 14 , Sub1_3MenuSelect2 } ,
{ 10 , 1 , 5 , 10 , 10 , 10 , 10 , 10 , Sub1_2_1Menu } ,
{ 11 , 1 , 5 , 11 , 11 , 11, 11 , 11 , Sub1_2_2Menu } ,
{ 12 , 1 , 5 , 12 , 12 , 12 , 12 , 12 , Sub1_2_3Menu } ,
{ 13 , 1 , 8 , 13 , 13 , 13 , 13 , 13 , Sub1_3_1Menu } ,
{ 14 , 1 , 9 , 14 , 14 , 14, 14 , 14 , Sub1_3_2Menu }
} ; //不同菜单界面参数
/**************************************************************************************************
* 名 称: void UserKeyInit(void)
* 功能说明:
* 按键开关UP、DOWN、LEFT、RIGHT、Menu、BACK IO引脚设置为内部上拉输入中断模式 上升沿触发中断中断优先级INT_RANK_6
* KEY0 KEY1 KEY2 KEY3 KEY7 KEY9设置为GPIO 上拉输入模式,不开启中断
* 注册UP、DOWN、LEFT、RIGHT、Menu、BACK IO外部中断的回调处理函数
*************************************************************************************************/
void UserKeyInit(void)
{
KeyInit() ;
Io_RegHookCallback(MENU_KEY_PIN, Menu_Callback) ;
Io_RegHookCallback(BACK_KEY_PIN, Back_Callback) ;
Io_RegHookCallback(KEYUP_PIN, KeyUp_Callback) ;
Io_RegHookCallback(KEYDOWN_PIN, KeyDown_Callback) ;
Io_RegHookCallback(KEYLEFT_PIN, KeyLeft_Callback) ;
Io_RegHookCallback(KEYRIGHT_PIN, KeyRight_Callback) ;
Io_RegHookCallback(KEYOK_PIN, KeyOk_Callback) ;
}
/**************************************************************************************************
* 名 称: void GetKeylnput(void)
* 功能说明: 选择最近一次按键动作做处理当前所处的不同菜单页对应的处理动作不同具体需要在sKeyTab内设置
*************************************************************************************************/
void GetKeylnput(void )
{
switch ( laseKey )
{
case KEYMENU :// “菜单”键,找出新的菜单状态编号
currentMenuIndex = sKeyTab [ currentMenuIndex ].keyMenuToIndex ;
break ;
case KEYBACK :// “回退键”,找出新的菜单状态编号
currentMenuIndex = sKeyTab [ currentMenuIndex ].keyBackToIndex ;
break ;
case KEYUP : // “向上”键,找出新的菜单状态编号
currentMenuIndex = sKeyTab[ currentMenuIndex ].keyUpToIndex ;
break ;
case KEYDOWN :// “向下”键,找出新的菜单状态编号
currentMenuIndex = sKeyTab [ currentMenuIndex ].keyDnToIndex ;
break ;
case KEYLEFT :// “向左”键,找出新的菜单状态编号
currentMenuIndex = sKeyTab [ currentMenuIndex ].keyLeftToIndex ;
break ;
case KEYRIGHT:// “向右”键,找出新的菜单状态编号
currentMenuIndex = sKeyTab [ currentMenuIndex ].keyRightToIndex ;
break ;
case KEYOK: // “OK”键,找出新的菜单状态编号
currentMenuIndex = sKeyTab [ currentMenuIndex ].keyOkToIndex ;
break ;
case 0 : // 没有按键动作
return ;
default : // 未设定效果的按键键值
return ;
}
laseKey = 0 ;
sKeyTab[ currentMenuIndex ].CurrentOperate() ; // 当前菜单页 按键动作应该执行的操作函数
}
/**************************************************************************************************
* 名 称: void Menu_Callback(void)
* 功能说明: Menu按键中断回调处理函数
*************************************************************************************************/
void Menu_Callback(void)
{
laseKey = KEYMENU ;
}
/**************************************************************************************************
* 名 称: void Back_Callback(void)
* 功能说明: BACK按键中断回调处理函数
*************************************************************************************************/
void Back_Callback(void)
{
laseKey = KEYBACK ;
}
/**************************************************************************************************
* 名 称: void KeyUp_Callback(void)
* 功能说明: UP按键中断回调处理函数
*************************************************************************************************/
void KeyUp_Callback(void)
{
laseKey = KEYUP ;
}
/**************************************************************************************************
* 名 称: void KeyDown_Callback(void)
* 功能说明: DOWN按键中断回调处理函数
*************************************************************************************************/
void KeyDown_Callback(void)
{
laseKey = KEYDOWN ;
}
/**************************************************************************************************
* 名 称: void KeyLeft_Callback(void)
* 功能说明: LEFT按键中断回调处理函数
*************************************************************************************************/
void KeyLeft_Callback(void)
{
laseKey = KEYLEFT ;
}
/**************************************************************************************************
* 名 称: void KeyRight_Callback(void)
* 功能说明: RIGHT按键中断回调处理函数
*************************************************************************************************/
void KeyRight_Callback(void)
{
laseKey = KEYRIGHT ;
}
/**************************************************************************************************
* 名 称: void KeyOk_Callback(void)
* 功能说明: OK按键中断回调处理函数
*************************************************************************************************/
void KeyOk_Callback(void)
{
laseKey = KEYOK ;
}