使用结构体指针、函数指针和中断实现。
这是想法是因为扫描按键速度慢,KEA-128芯片已经没有可以用于定时中断的定时器而萌发出的。
因为KEA芯片主频低,我认为消抖在调车后期没有意义。
结构体:
struct ShowMenu{
void (*FunNow)(void);//函数指针
struct ShowMenu *Left;//结构体指针 struct ShowMenu *Up;
struct ShowMenu *Right;
struct ShowMenu *Down;
};
类似链表的实现方式将变量链接在一起,再用一个结构体指针指向调用函数,用按键改变结构体指针的指向,用来调用不同的函数,实现显示的目的。
变量声明:
extern struct ShowMenu MainMenu_1,MainMenu_2,MainMenu_3,MainMenu_4,*FunShowMenu;
extern struct ShowMenu SecondaryMenu_1_1,SecondaryMenu_1_2,SecondaryMenu_1_3,SecondaryMenu_1_4;
extern struct ShowMenu SecondaryMenu_2_1,SecondaryMenu_2_2,SecondaryMenu_2_3,SecondaryMenu_2_4;
extern struct ShowMenu SecondaryMenu_3_1,SecondaryMenu_3_2,SecondaryMenu_3_3,SecondaryMenu_3_4;
extern struct ShowMenu SecondaryMenu_4_1,SecondaryMenu_4_2,SecondaryMenu_4_3,SecondaryMenu_4_4;
只写了主菜单(4项)和次级菜单(各4项)。接下来是初始化这一堆结构体。
为了方便链接结构体成环我写了一个函数。
#define LEN 4
void AddUp_Down ( struct ShowMenu *pointer,... ) { //结构体链接成环函数
uint8 Num;
va_list FormalParameter; ///*类似pintf函数实现方式*/// //int printf ( const char * format, ... );
struct ShowMenu *ExchangePointer=pointer;
struct ShowMenu *ExchangePointer_a=pointer;
struct ShowMenu *ExchangePointer_b=pointer;
va_start ( FormalParameter,pointer );
for ( Num=0; Num<LEN-1; Num++ ) {
ExchangePointer_b=va_arg ( FormalParameter,struct ShowMenu * );
ExchangePointer_a->Down=ExchangePointer_b;
ExchangePointer_b->Up=ExchangePointer_a;
ExchangePointer_a=ExchangePointer_b;
}
ExchangePointer->Up=ExchangePointer_b;
ExchangePointer_b->Down=ExchangePointer;
va_end ( FormalParameter );
}
中断里的部分代码,我使用的4个按键KBI中断。
uint32 FLAG=0;
void KBI0_IRQHandler ( void )
{
FLAG = READ_KBI0_FLAG;
if ( FLAG )
{
if ( FLAG&2048 ) { // Key_Up
if ( FunShowMenu->Up ) {
FunShowMenu=FunShowMenu->Up;
( *FunShowMenu->FunNow ) ();
}
代码:https://github.com/DuXiangwen/KEA-128_-.git