用数组实现12864点阵屏的菜单
按键:up down enter back(上翻页 下翻页 确认 返回)
menu.h
typedef struct
{
uint8_t page; //当前页码
uint8_t up; //上翻页码
uint8_t down; //下翻页码
uint8_t ok; //确认页码
uint8_t back; //返回页码
void (*page_fun)(); //函数指针
}key_table;
extern key_table table1[];//定于数组
//构造界面显示函数menu_a1 menu_b1 menu_c1
void menu_homepage(void)
{
clear_screen();
display_graphic_64x64(1,1,gImage_aaa);
display_graphic_16x16_2(1,7,(16*6+1),cai1);
display_graphic_16x16_2(1,7,(16*7+1),dan1);
}
void menu_a1(void)
{
clear_screen();
display_graphic_16x16_2(0,1,(1+16*0),kai1);
display_graphic_16x16_2(1,3,(1+16*0),ji1);
display_graphic_16x16_2(1,5,(1+16*0),ce1);
display_graphic_16x16_2(1,7,(1+16*0),shi1);
}
void menu_b1(void)
{
clear_screen();
display_graphic_16x16_2(1,1,(1+16*0),kai1);
display_graphic_16x16_2(0,3,(1+16*0),ji1);
display_graphic_16x16_2(1,5,(1+16*0),ce1);
display_graphic_16x16_2(1,7,(1+16*0),shi1);
}
void menu_c1(void)
{
clear_screen();
display_graphic_16x16_2(1,1,(1+16*0),kai1);
display_graphic_16x16_2(1,3,(1+16*0),ji1);
display_graphic_16x16_2(0,5,(1+16*0),ce1);
display_graphic_16x16_2(1,7,(1+16*0),shi1);
}
key_table table1[] =
{
//主界面
{0,0,0,1,0,(*menu_homepage)}, //0
//第一界面
{1,3,2,1,0,(*menu_a1)},//1
{2,1,3,2,0,(*menu_b1)},//2
{3,2,1,3,0,(*menu_c1)},//3
//第二界面
};
main.c
void (*page_index)();//定义函数指针 指向结构体里面的显示函数
uint8_t key = 0;
uint8_t index = 0;//结构体中的页 key_table table1 的index
uint8_t index_temp = 34;//!= index 初始化刷新显示
//在按键轮询中分配值
key = Key_Scan(0);
if(key == Key_Up_Press)
{
index = table1[index].up;
}
else if (key == Key_Down_Press)
{
index = table1[index].down;
}
else if (key == Key_Ok_Press)
{
index = table1[index].ok;
}
else if (key == Key_Back_Press)
{
index = table1[index].back;
}
//当按键按下时,索引发生与临时变量不一致时执行 对应的指针函数
if(index != index_temp)
{
page_index = table1[index].page_fun;
(*page_index)();//指向相应的菜单显示
index_temp = index;
}