简易1.8寸TFTLCD实现多级菜单实现

引言:在单片机显示多个数据时,我们有时候会遇到一个屏幕无法显示完全的情况,这个时候多级菜单就可以帮我们解决这个问题,于是我发现了一种基于数组查表法的简单多级菜单实现方法;

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的分享

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐诗宋詞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值