1 Star 0 Fork 0

hudada / menu仿真

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

@TOC

显示helloworld

显示hello world大家应该很熟悉了,把这段代码复制到menu.cpp中替换掉原来的代码,点击调试就可以看到效果了

#include "stdafx.h"
#include "Menu.h"
#include "SEEKFREE_18TFT.h"
#include "SEEKFREE_FONT.h"
#include "My_Key.h"
#include "TFT_BOTTOM.h"
void key_function(void)
{
	switch (Key)
	{
	default:
		break;
	}
	Key = -1;
}

void Menu()
{
	uint8 firstword[] = "hello world";
	lcd_showstr(0, 0, firstword);
}

菜单原理开始

现在正是开始菜单原理的讲解,我们最终是要实现可以选择显示哪一行的一个代码

全屏显示

可以看出lcd_showint8(0, page_count++, page_count);的y参数是0-7或者0~8,这在注释中也有提及

uint8 page_count = 0;
void Menu()
{
	page_count = 0;
	lcd_showint8(0, page_count++, page_count);
	lcd_showint8(0, page_count++, page_count);
	lcd_showint8(0, page_count++, page_count);
	lcd_showint8(0, page_count++, page_count);
	lcd_showint8(0, page_count++, page_count);
	lcd_showint8(0, page_count++, page_count);
	lcd_showint8(0, page_count++, page_count);
	lcd_showint8(0, page_count++, page_count);
}

在程序中选择一行

此时我们虽然能够选择一行,但是那一行是定死的,并不是最后的效果

#include "stdafx.h"
#include "Menu.h"
#include "SEEKFREE_18TFT.h"
#include "SEEKFREE_FONT.h"
#include "My_Key.h"
#include "TFT_BOTTOM.h"
void key_function(void)
{

}
uint8 page_count = 0;
uint8 my_choice = 3;
void chose_show(void)
{
	if(page_count==my_choice)
		lcd_showint8(0, page_count++, page_count);
	else
		page_count++;
}

void Menu()
{
	page_count = 0;
	chose_show();
	chose_show();
	chose_show();
	chose_show();
	chose_show();
	chose_show();
	chose_show();
	chose_show();
}

加入键盘

加入键盘之后,实现了!注意键盘的写法,一定要复位和预防其他bug。

#include "stdafx.h"
#include "Menu.h"
#include "SEEKFREE_18TFT.h"
#include "SEEKFREE_FONT.h"
#include "My_Key.h"
#include "TFT_BOTTOM.h"
uint8 page_count = 0;
uint8 my_choice = 0;
void key_function(void)
{
	switch (Key)
	{
	case 6: 
		my_choice++;
		if (my_choice >= 8)
			my_choice = 1;
		break;
	default:
		break;
	}
	Key = -1;
}

void chose_show(void)
{
	if(page_count==my_choice)
		lcd_showint8(0, page_count++, page_count);
	else
		page_count++;
}

void Menu()
{
	page_count = 0;
	chose_show();
	chose_show();
	chose_show();
	chose_show();
	chose_show();
	chose_show();
	chose_show();
	chose_show();
}

加入清屏函数

此时显示的效果已经达到了我们要求的的

void chose_show(void)
{

	if (page_count == my_choice) {
		lcd_clear(BGCOLOR);/*清除屏幕*/
		lcd_showint8(0, page_count++, page_count);
	}
	else
		page_count++;
}

作业

然而我们的最终的目标并没有这么简单,我们的目标需要实现一个完整的菜单,要求请看这里:菜单功能要求及其实现祖传资料

如果还没有理解原理和对如何做不解的话,还可以看关于代码的讲解视频: 菜单原理以及示例代码,里面的示例代码在这里.

作业参考代码无bug版

调试效果在这里,还有不能刷新最后两个字母的问题,代码已经解决

#include "stdafx.h"
#include "Menu.h"
#include "SEEKFREE_18TFT.h"
#include "SEEKFREE_FONT.h"
#include "My_Key.h"
#include "TFT_BOTTOM.h"
#define LINE_MAX 8
uint8 g_pageCount = 0;/*当前遍历到的页数*/
uint8 g_lineCount = 0;/*当前遍历到的行数 page 中 0 insert_line 1-+∞*/
uint8 g_pageNum = 1;/*当前页*/
uint8 g_pageMax = 0;/*总页数*/
uint8 g_lineNum = 1;/*当前行 范围 1-+∞*/
uint8 g_lineMax = 0;/*当前页总行数*/
uint8 g_lineLock = 0;/*修改数值功能标志位*/
uint8 g_plusFlg = 0;/*数值增加标志位*/
uint8 g_minisFlg = 0;/*数值减小标志位*/
int8 g_Rate = 0;/*数值改变的倍率*/
float g_addValue = 1;/*数值改变的大小*/
void key_function(void)
{
	if (g_lineLock)
	{
		switch (Key)
		{
		case 2: //行数上移
			g_lineNum--;
			if (g_lineNum < 1)
				g_lineNum = g_lineMax;
			break;
		case 8://行数下移
			g_lineNum++;
			if (g_lineNum > g_lineMax)
				g_lineNum = 1;
			break;
		case 3://数值加	
			g_plusFlg = 1;
			break;
		case 9: //数值减
			g_minisFlg = 1;
			break;
		case 4:  //减少倍率
			g_Rate--;
			break;
		case 6:  //增加倍率
			g_Rate++;
			break;
		case 5:  //退出数值修改
			g_lineLock = 0;
			break;
		default:
			;
			break;
		}

	}
	else {
		switch (Key) {
		case 4:
			lcd_clear(BGCOLOR);
			g_pageNum--;
			if (g_pageNum < 1)
				g_pageNum = g_pageMax;
			g_lineNum = 1;
			break;
		case 6:
			lcd_clear(BGCOLOR);
			g_pageNum++;
			if (g_pageNum > g_pageMax)
				g_pageNum = 1;
			g_lineNum = 1;
			break;
		case 2:
			g_lineNum--;
			if (g_lineNum < 1)
				g_lineNum = g_lineMax;
			break;
		case 8:
			g_lineNum++;
			if (g_lineNum > g_lineMax)
				g_lineNum = 1;
			break;
		case 5:
			g_lineLock = 1;
			break;
		default:
			break;
		}
	}
	Key = -1;
}

/*
* 只有这个函数有权力修改变量 g_pageCount
*/
void Insert_Page(signed char String[])
{
	g_pageCount++;

	if (g_pageMax < g_pageCount) 		g_pageMax = g_pageCount;
	if (g_pageNum == g_pageCount)
	{
		g_lineMax = 0;
	}
	g_lineCount = 0;
}
void Insert_uint8(uint8 String[], unsigned char* Number)
{
	int8 tmp_line;
	if (g_pageNum == g_pageCount)
	{
		g_lineCount++;
		uint8 cursor = ' ';
		if (g_lineNum == g_lineCount)
		{
			/*修改部分*/
			if (g_lineLock)
			{
				cursor = ':';
				switch (g_Rate)
				{
					case -4: g_Rate = 3;                         break;
					case -3: g_addValue = 0.001;                 break;
					case -2: g_addValue = 0.01;                  break;
					case -1: g_addValue = 0.1;                   break;
					case 0: g_addValue = 1;                      break;
					case 1: g_addValue = 10;                     break;
					case 2: g_addValue = 100;                    break;
					case 3: g_addValue = 1000;                  break;
					case 4: g_Rate = -3;                         break;
					default: g_Rate = 0;                       break;
				}
				if (g_plusFlg)
				{
					*Number += (int)g_addValue;
					g_plusFlg = 0;
				}
				else if (g_minisFlg)
				{
					*Number -= (int)g_addValue;
					g_minisFlg = 0;
				}
			}
			else
				cursor = '>';
		}
		/*显示部分*/
		if (g_lineMax < g_lineCount) g_lineMax = g_lineCount;
		if (g_lineNum <= LINE_MAX)
		{
			if (g_lineCount <= LINE_MAX) 
			{
				tmp_line = g_lineCount ;
				lcd_showchar(0, (tmp_line - 1) * 16, cursor);
				lcd_showstr(9, tmp_line - 1, String);
				lcd_showuint8(TFT_X_MAX - 3 * 8 - 1, tmp_line - 1, *Number);
			}
		}
		else
		{
			tmp_line = LINE_MAX + g_lineCount - g_lineNum;
			if (tmp_line >= 1 && tmp_line <= 8)
			{
				lcd_showchar(0, (tmp_line - 1) * 16, cursor);
				lcd_showstr(9, tmp_line - 1, String);
				lcd_showuint8(TFT_X_MAX - 3 * 8 - 1, tmp_line - 1, *Number);
			}
		}
	}

}
/*const char 与变量不兼容,单片机上没有这种问题*/
void glue(const char string[], unsigned char* Number)
{
	uint8 name[7] = { 0 };
	for (uint8 i = 0; i<7; i++)
	{
		if (string[i] != '\0')
			name[i] = string[i];
		else
			name[i] = ' ';
	}
	name[6] = 0;
	Insert_uint8(name, Number);
}
uint8 a = 90;
uint8 b2 = 47;
signed char nameP[] = "bala";
uint8 nameP2[] = "p2";
uint8 naline[] = "shuala";

void Menu()
{
	g_pageCount = 0;
	Insert_Page(nameP);
	glue("bala", &a);
	glue("shuala", &a);
	glue("test", &a);
	glue("bhus", &a);
	glue("asjd", &a);
	glue("bala", &a);
	glue("shuala", &a);
	glue("test", &a);
	glue("bhus", &a);
	glue("asjd", &a);
	glue("bala", &a);
	glue("bala", &a);
	glue("bala", &a);
	Insert_Page(nameP);
	glue("bala", &b2);
	glue("shuala", &a);
	//lcd_showcursor();
}

上一篇:入门

空文件

简介

智能车队对menu仿真实验 展开 收起
C++ 等 2 种语言
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/hudada2001/menu-simulation.git
git@gitee.com:hudada2001/menu-simulation.git
hudada2001
menu-simulation
menu仿真
temp

搜索帮助

344bd9b3 5694891 D2dac590 5694891