引言:在单片机显示多个数据时,我们有时候会遇到一个屏幕无法显示完全的情况,这个时候多级菜单就可以帮我们解决这个问题,于是我发现了一种基于数组查表法的简单多级菜单实现方法;
C语言知识点:
1. 结构体
//申明一个结构体
struct book
{
char title[MAXTITL];//一个字符串表示的titile 题目 ;
char author[MAXAUTL];//一个字符串表示的author作者 ;
float value;//一个浮点型表示的value价格;
};//注意分号不能少,这也相当于一条语句;
2.结构体数组
定义结构体数组的一般形式有两种,如下:
1、声明结构体类型的同时定义结构体数组
struct 结构体名称{
成员表列
}数组名[数组长度];
2、先声明结构体类型,然后定义结构体数组
struct 结构体名称{
成员表列
};
struct 结构体名称 数组名[数组长度];
3.函数指针
定义:对于函数指针首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址
常用于调用函数和做函数的参数
void (*fp)();
//把函数的地址赋值给函数指针,一般采用如下形式:
fp=Function;
//如果是函数调用,还必须包含一个圆括号括起来的参数表。可以采用如下方式来通过指针调用函数:
x=(*fp)();
好了,有了以上知识点下面来看看这个简单的多级菜单:
1.首先需要定义一个架构体:
//定义一个结构体包含你想操作内容
typedef struct
{
int current;//编号
int key;//按键键值
void (*current_operation)(void);
}Menu;
- current:当前页面的索引号
- key:按下按钮后获得的不同键值
- current_operation:当前页面的索引号要执行的显示函数,这是一个函数指针
2,定义一个结构体数组存放不同情况的跳转:
Menu table[100] =
{
{0,1,(*jm10)},/*当前界面编号0,按下按键1,跳转到jm10*/
{0,2,(*jm10)},/*当前界面编号0,按下按键2,跳转到jm10*/
{1,2,(*jm11)},/*当前界面编号1,按下按键2,跳转到jm11*/
{2,2,(*jm12)},
{3,2,(*jm13)},
{4,2,(*jm10)},
{4,1,(*jm0)},
{1,1,(*jm21)},
{5,1,(*jm10)},
{2,1,(*jm22)},
{6,1,(*jm11)},
{3,1,(*jm23)},
{7,1,(*jm12)},
{0xff,0x00,0},/*oxff作为一个标志位*/
};
3.具体的界面显示函数
u8 g_PageNum;//定义的界面编号
void jm0(void)
{
u8 tac[]={":2051100225"};
g_PageNum=0;//界面0
LCD_ShowChinese(50,40,"测试仪",RED,BLUE,16,0);
LCD_ShowChinese(15,16,"欢迎使用电能参数",RED,BLUE,16,0);
LCD_ShowChinese(0,94,"姓名",RED,BLUE,16,0);
LCD_ShowString(33,94,":",RED,BLUE,16,0);
LCD_ShowChinese(49,94,"龚其斌",RED,BLUE,16,0);
LCD_ShowChinese(0,110,"学号",RED,BLUE,16,0);
LCD_ShowString(32,110,tac,RED,BLUE,16,0);
}
void jm10(void)
{
g_PageNum=1;//界面1
LCD_ShowString(0,10,"1:",RED,BLUE,16,0);
LCD_ShowString(0,40,"2:",RED,BLUE,16,0);
LCD_ShowString(0,70,"3:",RED,BLUE,16,0);
LCD_ShowString(0,100,"4:",RED,BLUE,16,0);
LCD_ShowChinese(20,10,"直流参数显示",RED,BLACK,16,0);
LCD_ShowChinese(20,40,"交流参数显示",RED,BLUE,16,0);
LCD_ShowString(20,70,"WIFI-",RED,BLUE,16,0);
LCD_ShowChinese(60,70,"连接",RED,BLUE,16,0);
LCD_ShowChinese(20,100,"返回",RED,BLUE,16,0);
}
void jm11(void)
{
g_PageNum=2;//界面2
LCD_ShowString(0,10,"1:",RED,BLUE,16,0);
LCD_ShowString(0,40,"2:",RED,BLUE,16,0);
LCD_ShowString(0,70,"3:",RED,BLUE,16,0);
LCD_ShowString(0,100,"4:",RED,BLUE,16,0);
LCD_ShowChinese(20,10,"直流参数显示",RED,BLUE,16,0);
LCD_ShowChinese(20,40,"交流参数显示",RED,BLACK,16,0);
LCD_ShowString(20,70,"WIFI-",RED,BLUE,16,0);
LCD_ShowChinese(60,70,"连接",RED,BLUE,16,0);
LCD_ShowChinese(20,100,"返回",RED,BLUE,16,0);
}
void jm12(void)
{
g_PageNum=3;
LCD_ShowString(0,10,"1:",RED,BLUE,16,0);
LCD_ShowString(0,40,"2:",RED,BLUE,16,0);
LCD_ShowString(0,70,"3:",RED,BLUE,16,0);
LCD_ShowString(0,100,"4:",RED,BLUE,16,0);
LCD_ShowChinese(20,10,"直流参数显示",RED,BLUE,16,0);
LCD_ShowChinese(20,40,"交流参数显示",RED,BLUE,16,0);
LCD_ShowString(20,70,"WIFI-",RED,BLACK,16,0);
LCD_ShowChinese(60,70,"连接",RED,BLACK,16,0);
LCD_ShowChinese(20,100,"返回",RED,BLUE,16,0);
}
void jm13(void)
{
g_PageNum=4;
LCD_ShowString(0,10,"1:",RED,BLUE,16,0);
LCD_ShowString(0,40,"2:",RED,BLUE,16,0);
LCD_ShowString(0,70,"3:",RED,BLUE,16,0);
LCD_ShowString(0,100,"4:",RED,BLUE,16,0);
LCD_ShowChinese(20,10,"直流参数显示",RED,BLUE,16,0);
LCD_ShowChinese(20,40,"交流参数显示",RED,BLUE,16,0);
LCD_ShowString(20,70,"WIFI-",RED,BLUE,16,0);
LCD_ShowChinese(60,70,"连接",RED,BLUE,16,0);
LCD_ShowChinese(20,100,"返回",RED,BLACK,16,0);
}
void jm21(void)
{
u8 com3[]={"I: A"};
u8 com4[]={"U: V"};
u8 com5[]={"P: W"};
g_PageNum=5;
LCD_ShowChinese(30,0,"直流参数显示",RED,BLUE,16,0);
LCD_ShowString(0,20,com3,RED,WHITE,24,0);
LCD_ShowString(0,60,com4,RED,WHITE,24,0);
LCD_ShowString(0,100,com5,RED,WHITE,24,0);
}
void jm22(void)
{
u8 com1[]={"I: A"};
u8 com2[]={"U: V"};
u8 com3[]={"cosx: "};
u8 com4[]={"P1: W"};
u8 com5[]={"P2: W"};
u8 com6[]={"W: KW/H"};
g_PageNum=6;
LCD_ShowChinese(30,0,"交流参数显示",RED,BLUE,16,0);
LCD_ShowString(0,17,com1,RED,WHITE,16,0);
LCD_ShowString(0,34,com2,RED,WHITE,16,0);
LCD_ShowString(0,51,com3,RED,WHITE,16,0);
LCD_ShowString(0,68,com4,RED,WHITE,16,0);
LCD_ShowString(0,85,com5,RED,WHITE,16,0);
LCD_ShowString(0,102,com6,RED,WHITE,16,0);
}
void jm23(void)
{
u8 com1[]={"OFF/ON"};
g_PageNum=7;
LCD_ShowString(50,0,"WIFI-",RED,BLUE,16,0);
LCD_ShowChinese(90,0,"连接",RED,BLUE,16,0);
LCD_ShowString(35,37,com1,RED,WHITE,32,0);
}
4.具体的按键切换函数:
void BtnProcss(void)
{
u8 k1=0;
u8 i = 0;
k1=KEY_Scan();
for(i = 0;table[i].current != 0xff;i++)
{
if(table[i].current == g_PageNum && k1 == table[i].key)//按键键值,于界面编号相对应
{
LCD_Fill(0,0,LCD_H,LCD_W,BLUE);//清屏
table[i].current_operation();//执行当前函数
break;
}
}
}
如果有需要这里有工程连接:
链接:https://pan.baidu.com/s/1w5UutXhdiM8BxDWSBvdO9g?pwd=ceqb
提取码:ceqb
--来自百度网盘超级会员V4的分享