185 lines
9.2 KiB
C
185 lines
9.2 KiB
C
#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 ;
|
||
}
|