显示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();
}
上一篇:入门