菜单教案代码

显示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();
}

上一篇:入门

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值