找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3211|回复: 1
收起左侧

STC15单片机LCD12864多级菜单可以自己添加的,亲测

[复制链接]
ID:848734 发表于 2021-5-24 19:34 | 显示全部楼层 |阅读模式
STC15  12864多级菜单可以自己添加的,亲测。

单片机源程序如下:
  1. #include "lcd12864.h"
  2. #include "key.h"
  3. #include "menu.h"
  4. #include "delay.h"       

  5. static const unsigned char FunctionMiMa[] = "123456";
  6. static const unsigned char SuperMiMa[] = "111111";

  7. static PT_Menu g_pt_MenuHead = NULL;
  8. static PT_Menu g_pt_CurrentMenu = NULL;

  9. static int StrCmp(char *Source, char *Dist)
  10. {
  11.         int i =0;
  12.         if(Source == NULL || Dist == NULL)
  13.                 return -1;
  14.         while(1){
  15.                 if (Source[i] != Dist[i]){
  16.                         break;
  17.                 }
  18.                 if(Source[i] == '\0')
  19.                         return 0;
  20.                 i++;
  21.         }

  22.         return 1;
  23. }
  24. static void RegisterPage(PT_Menu pt_Menu)
  25. {
  26.         PT_Menu pt_Temp;
  27.        
  28.         pt_Menu->pt_Next = NULL;
  29.         if(g_pt_MenuHead == NULL){
  30.                 g_pt_MenuHead = pt_Menu;
  31.         }
  32.         else{
  33.                 pt_Temp = g_pt_MenuHead;
  34.                
  35.                 while(pt_Temp->pt_Next != NULL){
  36.                         pt_Temp = pt_Temp->pt_Next;
  37.                 }
  38.                
  39.                 pt_Temp->pt_Next = pt_Menu;
  40.         }
  41. }

  42. static PT_Menu GetMenu(char *pc_name)
  43. {
  44.         PT_Menu pt_Temp;
  45.         pt_Temp = g_pt_MenuHead;
  46.         while(pt_Temp){
  47.                 if(StrCmp(pt_Temp->name,pc_name) == 0){
  48.                         return pt_Temp;
  49.                 }
  50.                 else{
  51.                         pt_Temp = pt_Temp->pt_Next;
  52.                 }
  53.         }
  54.         return NULL;
  55. }

  56. PT_Menu GetCurrentMenu(void)
  57. {
  58.         return g_pt_CurrentMenu;
  59. }

  60. void SetCurrentMenu(PT_Menu pt_Menu)
  61. {
  62.         g_pt_CurrentMenu = pt_Menu;
  63. }

  64. static unsigned char Verify(unsigned char *CheckMiMa){
  65.         char MiMa[7];
  66.         unsigned char Key = 20;
  67.         char i=0;LCD_Clear();
  68.         LCD_ShowString(1,1,12,"请输入密码: ");     //????????LCD12864?????

  69.         for(i=0; i<6; i++){
  70.                 delay_ms(1000);
  71.                 do{
  72.                         Key = Key_Service();
  73.                 }while(10 <= Key);
  74.                 LCD_ShowString(2,i,1,"X");
  75.                 MiMa[i] = Key + '0';
  76.         }
  77.         MiMa[i] = '\0';
  78.         if(StrCmp(MiMa, CheckMiMa) == 0)
  79.                 return 1;
  80.         return 0;
  81. }

  82. static void DrawMainMenu(void)
  83. {
  84.         LCD_Clear();
  85.         LCD_ShowString(1,0,16,"XXXXXXXXXXXXXXXX");     //????????LCD12864?????
  86.         LCD_ShowString(2,6,4,"正\xfd常\xfd");
  87.         LCD_ShowString(3,4,8," DC1:OUT");
  88.         LCD_ShowString(4,0,4,"0591");
  89.         LCD_ShowString(4,3,4,"自动");
  90.         LCD_ShowString(4,5,6,"DC2:IN");
  91. }

  92. static PT_Menu MainMenuRun(void)
  93. {
  94.         unsigned char Key = 20;
  95.         while(1){
  96.                 do{
  97.                         Key = Key_Service();
  98.                 }while(20 == Key);
  99.                 if(11 == Key){
  100.                         delay_ms(3000);
  101.                         Key = Key_Service();
  102.                         if(11 == Key){
  103.                                 if(Verify(FunctionMiMa))
  104.                                         return GetMenu("Function");
  105.                         }
  106.                 }
  107.         }
  108.         return NULL;
  109. }

  110. static T_Menu MainMenu = {"Main", MainMenuRun, DrawMainMenu};

  111. static void DrawFunctionMenu(void)
  112. {
  113.         LCD_Clear();
  114.         LCD_ShowString(1,0,2,"1 ");
  115.         LCD_ShowString(1,1,8,"?时间设置");
  116.         LCD_ShowString(2,0,2,"2 ");
  117.         LCD_ShowString(2,1,8,"背光设置");
  118.         LCD_ShowString(3,0,2,"3 ");
  119.         LCD_ShowString(3,1,8,"自动定时");
  120.         LCD_ShowString(4,0,2,"4 ");
  121.         LCD_ShowString(4,1,8,"查询功能");
  122. }

  123. static PT_Menu FunctionMenuRun(void)
  124. {
  125.         unsigned char Flag = 0;
  126.         unsigned char Key = 20;
  127.         while(1){
  128.                 do{
  129.                         Key = Key_Service();
  130.                 }while(20 == Key);
  131.                 switch(Key){
  132.                         case 1:
  133.                                 //SetTime
  134.                                 break;
  135.                         case 2:
  136.                                 //SetBlack
  137.                                 break;
  138.                         case 3:
  139.                                 //AutoTime
  140.                                 break;
  141.                         case 4:
  142.                                 return GetMenu("Query");
  143.                         case 9:
  144.                                 if(Flag){
  145.                                         if(Verify(SuperMiMa))
  146.                                                 return GetMenu("SuperFunction");
  147.                                         Flag = 0;
  148.                                         DrawFunctionMenu();
  149.                                 }else
  150.                                   Flag = 1;
  151.                                 break;
  152.                         case 13:
  153.                                 return GetMenu("Main");
  154.                         default:
  155.                                 Flag = 0;
  156.                                 break;
  157.                 }
  158.                
  159.         }
  160.         return NULL;
  161. }

  162. static T_Menu FunctionMenu = {"Function", FunctionMenuRun, DrawFunctionMenu};

  163. static void DrawQueryMenu(void)
  164. {
  165.         LCD_Clear();
  166.         LCD_ShowString(1,0,2,"1 ");
  167.         LCD_ShowString(1,1,8,"查询电池");
  168.         LCD_ShowString(1,5,2,"IN");
  169.         LCD_ShowString(1,6,4,"时长");
  170.         LCD_ShowString(2,0,2,"2 ");
  171.         LCD_ShowString(2,1,8,"查询电池");
  172.         LCD_ShowString(2,5,4,"OUT ");
  173.         LCD_ShowString(3,0,4,"时长");
  174.        
  175. }

  176. static PT_Menu QueryMenuRun(void)
  177. {
  178.         unsigned char Key = 20;
  179.         while(1){
  180.                 do{
  181.                         Key = Key_Service();
  182.                 }while(20 == Key);
  183.                 switch(Key){
  184.                         case 1:
  185.                                 //IN
  186.                                 break;
  187.                         case 2:
  188.                                 //OUT
  189.                                 break;
  190.                         case 13:
  191.                                 return GetMenu("Function");
  192.                         default:
  193.                                 break;
  194.                 }
  195.                
  196.         }
  197.         return NULL;
  198. }

  199. static T_Menu QueryMenu = {"Query", QueryMenuRun, DrawQueryMenu};

  200. static void DrawSuperFunctionMenu(void)
  201. {
  202.         LCD_Clear();
  203.         LCD_ShowString(1,0,2,"1 ");
  204.         LCD_ShowString(1,1,10,"区域码设置");
  205.        
  206.         LCD_ShowString(2,0,2,"2");
  207.         LCD_ShowString(2,2,8,"权限设置");
  208.        
  209.         LCD_ShowString(3,0,2,"3 ");
  210.         LCD_ShowString(3,1,4,"预置");
  211.         LCD_ShowString(3,3,4,"OUT ");
  212.         LCD_ShowString(3,5,6,"时长判断");
  213.         LCD_ShowString(4,0,2,"4 ");
  214.         LCD_ShowString(4,1,12,"查询高级功能");
  215. }

  216. static PT_Menu SuperFunctionMenuRun(void)
  217. {
  218.         unsigned char Key = 20;
  219.         while(1){
  220.                 do{
  221.                         Key = Key_Service();
  222.                 }while(20 == Key);
  223.                 switch(Key){
  224.                         case 1:
  225.                                 //区域码设置
  226.                                 break;
  227.                         case 2:
  228.                                 //权限设置
  229.                                 break;
  230.                         case 3:
  231.                                 ///预置OUT时长判定
  232.                                 break;
  233.                         case 4:
  234.                                 return GetMenu("SuperQuery");
  235.                         case 13:
  236.                                 return GetMenu("Function");
  237.                         default:
  238.                                 break;
  239.                 }
  240.                
  241.         }
  242.         return NULL;
  243. }

  244. static T_Menu SuperFunctionMenu = { "SuperFunction", SuperFunctionMenuRun, DrawSuperFunctionMenu};

  245. static void DrawSuperQueryMenu(void)
  246. {
  247.         LCD_Clear();
  248.         LCD_ShowString(1,0,2,"1 ");
  249.         LCD_ShowString(1,1,10,"查询电池");
  250.         LCD_ShowString(1,5,2,"IN");
  251.         LCD_ShowString(1,6,4,"时长");
  252.        
  253.         LCD_ShowString(2,0,2,"2 ");
  254.         LCD_ShowString(2,1,10,"查询电池");
  255.         LCD_ShowString(2,5,4,"OUT ");
  256.         LCD_ShowString(2,7,4,"时长");
  257.        
  258.         LCD_ShowString(3,0,2,"3 ");
  259.         LCD_ShowString(3,1,8,"查询电池");
  260.         LCD_ShowString(3,5,2,"IN");
  261.         LCD_ShowString(3,6,4,"次数\xfd");
  262. }

  263. static PT_Menu SuperQueryMenuRun(void)
  264. {
  265.         unsigned char Key = 20;
  266.         while(1){
  267.                 do{
  268.                         Key = Key_Service();
  269.                 }while(20 == Key);
  270.                 switch(Key){
  271.                         case 1:
  272.                                 //查询电池IN时长
  273.                                 break;
  274.                         case 2:
  275.                                 //查询电池OUT时长
  276.                                 break;
  277.                         case 3:
  278.                                 ///查询电池IN次数
  279.                                 break;
  280.                         case 13:
  281.                                 return GetMenu("SuperFunction");
  282.                         default:
  283.                                 break;
  284.                 }
  285.                
  286.         }
  287.         return NULL;
  288. }

  289. static T_Menu SuperQueryMenu = { "SuperQuery", SuperQueryMenuRun, DrawSuperQueryMenu};

  290. void MenuInit(void)
  291. {
  292.         RegisterPage(&MainMenu);
  293.         RegisterPage(&FunctionMenu);
  294.         RegisterPage(&QueryMenu);
  295.         RegisterPage(&SuperFunctionMenu);
  296.         RegisterPage(&SuperQueryMenu);
  297.   SetCurrentMenu(GetMenu("Main"));
  298. }
复制代码
51hei.png

所有资料51hei提供下载:
多级菜单.rar (2.25 KB, 下载次数: 96)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:299626 发表于 2021-5-26 00:06 | 显示全部楼层
可以共享完整工程吗,屏驱动和按键驱动没有
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表