172 lines
7.7 KiB
C
172 lines
7.7 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
|
||
*******************************************************************************/
|
||
|
||
//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 ;
|
||
}
|