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