# menu仿真 **Repository Path**: hudada2001/menu-simulation ## Basic Information - **Project Name**: menu仿真 - **Description**: 智能车队对menu仿真实验 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: temp - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-09-24 - **Last Updated**: 2021-10-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README @[TOC](菜单仿真结构原理) # 显示helloworld 显示hello world大家应该很熟悉了,把这段代码复制到menu.cpp中替换掉原来的代码,点击调试就可以看到效果了 ```c #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,这在注释中也有提及 ```c 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); } ``` ## 在程序中选择一行 此时我们虽然能够选择一行,但是那一行是定死的,并不是最后的效果 ```c #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。 ```c #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(); } ``` ## 加入清屏函数 此时显示的效果已经达到了我们要求的的 ```c void chose_show(void) { if (page_count == my_choice) { lcd_clear(BGCOLOR);/*清除屏幕*/ lcd_showint8(0, page_count++, page_count); } else page_count++; } ``` # 作业 然而我们的最终的目标并没有这么简单,我们的目标需要实现一个完整的菜单,要求请看这里:[菜单功能要求及其实现祖传资料]( https://docs.qq.com/doc/DZk1oS2llS1Z5QUlP) 如果还没有理解原理和对如何做不解的话,还可以看关于代码的讲解视频: [菜单原理以及示例代码](https://www.bilibili.com/video/BV13U4y1A77y?spm_id_from=333.999.0.0),里面的示例代码在[这里](https://gitee.com/hudada2001/menu-simulation). ## 作业参考代码无bug版 [调试效果在这里,还有不能刷新最后两个字母的问题,代码已经解决](https://www.bilibili.com/video/BV13U4y1A77y?p=4) ```c #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(); } ``` --- 上一篇:[入门](https://blog.csdn.net/huqilin2001/article/details/120474633)