#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 *******************************************************************************/ volatile uint8_t currentMenuIndex = 0 ; //记录“当前所处的菜单页”的索引号 static volatile uint8_t laseKey = KEYBACK ; //记录“最后一次按的按键值” KbdTab_s sKeyTab[34] = { /*menuIndex, keyMenuToIndex, keyBackToIndex, keyUpToIndex, keyDnToIndex, keyLeftToIndex, keyRightToIndex, keyOkToIndex, (*CurrentOperate)(void)*/ { 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , HomeMenu } , { 1 , 1 , 0 , 5 , 2 , 1 , 1 , 6 , Sub1Select1 } , { 2 , 1 , 0 , 1 , 3 , 2 , 2 , 10 , Sub1Select2 } , { 3 , 1 , 0 , 2 , 4 , 3 , 3 , 12 , Sub1Select3 } , { 4 , 1 , 0 , 3 , 5 , 4 , 4 , 14 , Sub1Select4 } , { 5 , 1 , 0 , 4 , 1 , 5 , 5 , 17 , Sub1Select5 } , { 6 , 1 , 1 , 9 , 7 , 6 , 6 , 20 , Sub1Click1Select1 }, { 7 , 1 , 1 , 6 , 8 , 6 , 6 , 21 , Sub1Click1Select2 }, { 8 , 1 , 1 , 7 , 9 , 6 , 6 , 22 , Sub1Click1Select3 } , { 9 , 1 , 1 , 8 , 6 , 9 , 9 , 23 , Sub1Click1Select4 } , { 10 , 1 , 2 , 11 , 11 , 10 , 10 , 24 , Sub1Click2Select1 } , { 11 , 1 , 2 , 10 , 10 , 11 , 11 , 25 , Sub1Click2Select2 } , { 12 , 1 , 3 , 13 , 13 , 11, 12 , 26 , Sub1Click3Select1 } , { 13 , 1 , 3 , 12 , 12 , 13 , 12 , 27 , Sub1Click3Select2 } , { 14 , 1 , 4 , 16 , 15 , 14 , 14 , 28 , Sub1Click4Select1 } , { 15 , 1 , 4 , 14 , 16 , 15, 15 , 29 , Sub1Click4Select2 } , { 16 , 1 , 4 , 15 , 14 , 16 , 16 , 30 , Sub1Click4Select3 } , { 17 , 1 , 5 , 19 , 18, 17 , 17 , 31 , Sub1Click5Select1 } , { 18 , 1 , 5 , 17 , 19 , 18, 18 , 32 , Sub1Click5Select2 } , { 19 , 1 , 5 , 18 , 17 , 19 , 19 , 33 , Sub1Click5Select3 } , /*menuIndex, keyMenuToIndex, keyBackToIndex, keyUpToIndex, keyDnToIndex, keyLeftToIndex, keyRightToIndex, keyOkToIndex, (*CurrentOperate)(void)*/ { 20 , 1 , 6 , 20 , 20 , 20 , 20 , 20 , Sub1Click1Click1 } , { 21 , 1 , 7 , 21 , 21 , 21 , 21 , 21 , Sub1Click1Click2 } , { 22 , 1 , 8 , 22 , 22 , 18, 22 , 22 , Sub1Click1Click3 } , { 23 , 1 , 9 , 23 , 23 , 23 , 23 , 23 , Sub1Click1Click4 } , { 24 , 1 , 10 , 24 , 24 , 24, 24 , 24 , Sub1Click2Click1 } , { 25 , 1 , 11 , 25 , 25 , 25 , 25 , 25 , Sub1Click2Click2 } , { 26 , 1 , 12 , 26 , 26 , 26, 26 , 26 , Sub1Click3Click1 } , { 27 , 1 , 13 , 27 , 27 , 27 , 27 , 27 , Sub1Click3Click2 } , { 28 , 1 , 14 , 28 , 28 , 28 , 28 , 28 , Sub1Click4Click1 } , { 29 , 1 , 15 , 29 , 29 , 29, 29 , 29 , Sub1Click4Click2 } , { 30 , 1 , 16 , 30 , 30 , 30 , 30 , 30 , Sub1Click4Click2 } , { 31 , 1 , 17 , 31 , 31 , 31 , 31 , 31 , Sub1Click5Click1 } , { 32 , 1 , 18 , 32 , 32 , 32, 32 , 32 , Sub1Click5Click2 } , { 33 , 1 , 19 , 33 , 33 , 33 , 33 , 33 , Sub1Click5Click3 } } ; //不同菜单界面参数 /************************************************************************************************** * 名 称: 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 ; }