找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5012|回復(fù): 3
收起左側(cè)

單片機ST7565串行12864液晶驅(qū)動程序+多層液晶菜單+Proteus仿真

  [復(fù)制鏈接]
ID:64696 發(fā)表于 2020-12-14 09:12 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei截圖20201214090252343.jpg
制作出來的LCD12864菜單實物圖如下:
通天塔.jpg

單片機源程序如下:
  1. /*
  2. 名稱:GXD LCD多層菜單 v1.2
  3. 作者:TranSmart  

  4. 特點:
  5. 可以在液晶LCM上顯示最大254層深度的菜單,可以非常方便的使用和移植。
  6. 字符型顯示適用于St7920控制芯片。
  7. 圖像顯示適用于st7656控制芯片,不帶字庫要自己實現(xiàn)漢字字符顯示
  8. 在圖像模式下支持焦點菜單反白,
  9. 焦點菜單反白流程是:
  10. 1.調(diào)用 LCD_disp_SetReverse(1),打開液晶反白顯示,以后的輸出都是反白顯示
  11. 2.輸出焦點菜單內(nèi)容
  12. 3.調(diào)用 LCD_disp_SetReverse(0),關(guān)閉液晶反白顯示,以后的輸出都是正常顯示
  13. 可以根據(jù)此流程,在各種控制芯片上實現(xiàn)反白顯示。


  14. 歷史:
  15. 2009-9-22 添加在圖形模式下焦點行反白的功能
  16. 2009-8-2  添加N層菜單功能,修改屏幕參數(shù)定義
  17. 2009-3-4  初始版本

  18. 編譯環(huán)境:

  19. IDE-Version:
  20. uVision3 V3.33
  21. Copyright (c) Keil Elektronik GmbH / Keil Software, Inc 2006

  22. Tool Version Numbers:
  23. 工具鏈路徑:C:\Keil\C51\BIN\
  24. C Compiler: C51.Exe V8.05a
  25. Assembler: A51.Exe
  26. Linker/Locator: BL51.Exe V6.00
  27. Librarian: LIB51.Exe V4.24
  28. Hex Converter: OH51.Exe V2.6
  29. CPU DLL: S8051.DLL V3.06
  30. Dialog DLL: DP51.DLL V2.48b
  31. Target DLL: C:\KEIL\VW_C.DLL
  32. Dialog DLL: TP51.DLL V2.48b

  33. 版權(quán)聲明:
  34. 義務(wù):
  35. 1.如果您在使用中發(fā)現(xiàn)任何BUG,請通知gongxd@126.com,我會及時改正,并給您一份最新的代碼
  36. 2.請保留本聲明

  37. 權(quán)利:
  38. 如果您同意履行上面的義務(wù),您就可以完全免費將代碼應(yīng)用于任何商業(yè)非商業(yè)用途
  39. 但本代碼版權(quán)歸中國傳惠gongxd@126.com 所有,否則嚴(yán)禁使用本代碼

  40. 建議:
  41. 如果您作了什么改進希望能通知gongxd@126.com,最好能共享一下,
  42. 我也會給您一份 最新 的代碼,共同進步嘛

  43. 后話:大家都不容易,如果您覺得這東西有點用,就盡情傳播吧
  44. */

  45. #include "menu.h"
  46. #include "menu_res.h"

  47. //菜單是否更新 1是 0否
  48. unsigned char  MenuDisPlayUpdate;


  49. //所有菜單板的個數(shù)
  50. #define MenuAllCount sizeof(MenuPanel)/sizeof(MenuPanelStruct)
  51. Menu_Statestruct  Menu_State;//菜單狀態(tài)定義


  52. //=================================================================================棧函數(shù)

  53. //棧大小,菜單深度
  54. #define  StackSize  MenuDeep

  55. //聲明堆棧元素類型
  56. typedef Menu_Statestruct StackElementType;
  57. //棧元素數(shù)組聲明
  58. StackElementType  MenuParentStack[StackSize];

  59. //棧頂
  60. unsigned char StackTOP;

  61. //棧初始化
  62. void StackINI()
  63. {
  64. StackTOP=0;
  65. }
  66. //測試棧是否空 1 是 0 否
  67. unsigned char  StackEmpty()
  68. {
  69. return  StackTOP==0;
  70. }
  71. //測試棧是否滿 1 是 0 否
  72. unsigned char  StackFull()
  73. {
  74. return  StackTOP==StackSize;
  75. }

  76. //出棧
  77. StackElementType  StackPOP()
  78. {
  79. if (StackTOP==0)
  80. {
  81. return MenuParentStack[0];
  82. }
  83. StackTOP--;
  84. return MenuParentStack[StackTOP];
  85. }

  86. //入棧
  87. void  StackPush(StackElementType INElement)
  88. {
  89. if (StackTOP==StackSize)
  90. {
  91. return;
  92. }
  93. MenuParentStack[StackTOP]=INElement;
  94. StackTOP++;
  95. }

  96. //=================================================================================菜單函數(shù)
  97. //已經(jīng)到最頂了
  98. void  StackEmptyErr()
  99. {
  100. unsigned  char code MenuTopErrMsg[]=
  101. {"已經(jīng)到最頂了"};
  102. LCD_disp_CLS();
  103. LCD_disp_printR(MenuTopErrMsg,1,1);
  104. delayms(300);
  105. LCD_disp_CLS();
  106. //顯示主菜單
  107.     Menu_State.CurrentPanel=0;//本級菜單的菜單索引號
  108.     Menu_State.ItemStartDisplay=0; //顯示第一項對應(yīng)的菜單條目索引
  109.     Menu_State.FocusLine=1;  //焦點在屏上是第幾項
  110. }

  111. //菜單達到最大深度,棧滿提示函數(shù)
  112. void  StackFullErr()
  113. {
  114. unsigned  char code MenuTopErrMsg[]=
  115. {"菜單棧滿無法繼續(xù)"};
  116. LCD_disp_CLS();
  117. LCD_disp_printR(MenuTopErrMsg,0,1);
  118. delayms(300);
  119. LCD_disp_CLS();
  120. }

  121. //默認(rèn)菜單處理函數(shù)
  122. void voidNull()
  123. {
  124. }

  125. //光標(biāo)所在行菜單項顯示
  126. void UpdatedisplayMenu_Focus(unsigned char *MenuTxttmp)
  127. {
  128. #if   FocusReverse==1
  129.     //圖像反色顯示 0 否 1是,執(zhí)行此命令后的所有操作均是按照設(shè)置顯示
  130.     LCD_disp_SetReverse(1);
  131. #endif   
  132.     //顯示菜單項
  133.     LCD_disp_printR(MenuTxttmp,MenuItemDisplayStartX,Menu_State.FocusLine+MenuItemDisplayStartY);

  134. //是否顯示每行菜單前的指示  0 否 1是 ,推薦字符液晶使用,圖形液晶用反白
  135. #if  FocusPointDisply==1
  136.     //顯示前面的指針
  137.     LCD_setpos(MenuPointX,Menu_State.FocusLine+MenuItemDisplayStartY);
  138.     LCD_disp_Putchar(MenuPointASCII);
  139. #endif   
  140.   
  141. #if   FocusReverse==1
  142.     //圖像反色顯示 0 否 1是,執(zhí)行此命令后的所有操作均是按照設(shè)置顯示
  143.     LCD_disp_SetReverse(0);
  144. #endif


  145. }

  146. //菜單顯示更新函數(shù)
  147. void UpdatedisplayMenuPanel()
  148. {
  149.     unsigned char i,DisplayLenCount;

  150.     MenuItemStruct *p;
  151.     p=MenuPanel[Menu_State.CurrentPanel].MenuPanelItem+Menu_State.ItemStartDisplay;
  152.     DisplayLenCount=MenuPanel[Menu_State.CurrentPanel].MenuItemCount-Menu_State.ItemStartDisplay ;
  153.     if (DisplayLenCount>ScreenHLine)
  154.     {
  155.         DisplayLenCount=ScreenHLine;
  156.     }
  157.     LCD_disp_CLS();

  158.     for (i=0;i<DisplayLenCount;i++)
  159.     {
  160.         if (i==Menu_State.FocusLine)
  161.         {
  162.         //光標(biāo)所在行菜單項顯示,可以自定義反白顯示等
  163.             UpdatedisplayMenu_Focus(p->MenuTxt);
  164.         }
  165.         else
  166.         {
  167.             LCD_disp_printR(p->MenuTxt,MenuItemDisplayStartX,i+MenuItemDisplayStartY);
  168.         }
  169.         p++;
  170.     }




  171. }

  172. //按鍵處理函數(shù)
  173. void UpdateMenuPanelkeyInner(unsigned char MenuKeyCode)
  174. {
  175.     unsigned char i;
  176.     //父菜單堆棧臨時元素
  177.     Menu_Statestruct  tmpParent;

  178.     //菜單是否更新 1是 0否
  179.         MenuDisPlayUpdate=1;

  180.     switch (MenuKeyCode)
  181.     {

  182.     //一直按著向上鍵
  183.     case   MenuKey_UpCon:

  184.     case  MenuKey_Up:


  185.         if (Menu_State.FocusLine>0)
  186.         {
  187.             Menu_State.FocusLine--;  //焦點在屏上是第幾項
  188.         }
  189.         else
  190.         {
  191.             if (Menu_State.ItemStartDisplay>0)
  192.             {
  193.                 Menu_State.ItemStartDisplay--;
  194.             }
  195.             else
  196.             {
  197.                 Menu_State.ItemStartDisplay=MenuPanel[Menu_State.CurrentPanel].MenuItemCount-1;
  198.             }

  199.         }

  200.         break;

  201.      //一直按著向下鍵
  202.    case   MenuKey_DownCon:
  203.     case  MenuKey_Down:
  204.         if ((Menu_State.ItemStartDisplay+Menu_State.FocusLine)<MenuPanel[Menu_State.CurrentPanel].MenuItemCount-1)
  205.         {
  206.             if (Menu_State.FocusLine<ScreenHLine-1 )
  207.             {
  208.                 Menu_State.FocusLine++;  //焦點在屏上是第幾項
  209.             }
  210.             else
  211.             {
  212.                 Menu_State.ItemStartDisplay++; //顯示第一項對應(yīng)的菜單條目索引
  213.             }
  214.         }
  215.         else
  216.         {
  217.             Menu_State.FocusLine=0;
  218.             Menu_State.ItemStartDisplay=0;
  219.         }

  220.         break;
  221.     case  MenuKey_Ok:

  222.         i=Menu_State.FocusLine+Menu_State.ItemStartDisplay;
  223.         if ((MenuPanel[Menu_State.CurrentPanel].MenuPanelItem+i)->MenuChildID==MenuNoChild)
  224.         {
  225.             (*((MenuPanel[Menu_State.CurrentPanel].MenuPanelItem+i)->CurrentOperate))();
  226.         }
  227.         else
  228.         {
  229.              if (StackFull()==0)
  230.              {
  231.             //父菜單顯示在屏幕上的第一條條目
  232.             tmpParent.ItemStartDisplay=Menu_State.ItemStartDisplay;
  233.              //焦點在屏上是第幾項
  234.             tmpParent.FocusLine=Menu_State.FocusLine;
  235.             //父菜單號
  236.             tmpParent.CurrentPanel=Menu_State.CurrentPanel;//本級菜單的菜單索引號
  237.             //入棧
  238.             StackPush(tmpParent);


  239.             Menu_State.CurrentPanel=(MenuPanel[Menu_State.CurrentPanel].MenuPanelItem+i)->MenuChildID;//父菜單的菜單索引號
  240.             Menu_State.ItemStartDisplay=0; //顯示第一項對應(yīng)的菜單條目索引
  241.             Menu_State.FocusLine=0;  //焦點在屏上是第幾項
  242.             
  243.              }
  244.              else
  245.              {
  246.                 //菜單達到最大深度,棧滿提示函數(shù)
  247.                     StackFullErr();

  248.              }

  249.         };
  250.         break;
  251.     //一直按著返回鍵
  252.    case MenuKey_CancelCon:
  253.     case  MenuKey_Cancel:
  254.             //測試棧是否空 1 是 0 否
  255.             if( StackEmpty()==0)
  256.             {            
  257.                 tmpParent=StackPOP();
  258.                 Menu_State.CurrentPanel=tmpParent.CurrentPanel;
  259.                 Menu_State.ItemStartDisplay=tmpParent.ItemStartDisplay; //顯示第一項對應(yīng)的菜單條目索引
  260.                 Menu_State.FocusLine=tmpParent.FocusLine;  //焦點在屏上是第幾項
  261.             
  262.             }
  263.             else
  264.             {
  265.               //菜單已經(jīng)到最頂了,?仗崾竞瘮(shù)
  266.                     StackEmptyErr();

  267.             }

  268.         break;

  269.         default:
  270.          //菜單是否更新 1是 0否
  271.               MenuDisPlayUpdate=0;
  272.          break;

  273.     }
  274. }

  275. void UpdateMenuPanelkey(unsigned char MenuKeyCode)
  276. {
  277. if (MenuKeyCode==MenuKey_Null)
  278. {
  279.         return;
  280. }
  281. //弄這兩個函數(shù)并列目的是減小RAM使用
  282. UpdateMenuPanelkeyInner(MenuKeyCode);//更新按鍵
  283. //菜單是否更新 1是 0否
  284. if (MenuDisPlayUpdate==1)
  285. {
  286. UpdatedisplayMenuPanel();//更新菜單顯示
  287. }

  288. }


  289. void init_Menu()
  290. {   
  291.     //菜單棧初始化
  292.     StackINI();

  293.     Menu_State.CurrentPanel=0;//本級菜單的菜單索引號
  294.     Menu_State.ItemStartDisplay=0; //顯示第一項對應(yīng)的菜單條目索引
  295.     Menu_State.FocusLine=1;  //焦點在屏上是第幾項
  296.     UpdatedisplayMenuPanel();//更新菜單
  297. }
復(fù)制代碼
51hei截圖20201214090803015.jpg
所有資料51hei提供下載:
ST7565 串行液晶驅(qū)動 多層液晶菜單 Proteus仿真 ST7565 串行液晶驅(qū)動.rar (136.09 KB, 下載次數(shù): 211)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:461260 發(fā)表于 2020-12-22 18:01 | 顯示全部樓層
下載來學(xué)習(xí)一下,現(xiàn)在即使不知道怎么做菜單問題
回復(fù)

使用道具 舉報

ID:96744 發(fā)表于 2022-4-3 01:16 | 顯示全部樓層
整了些PFC的ST7565串口屏,焊好升壓電容和接線,找到樓主的程序下載測試液晶屏,能顯示,但字模偏了幾列,應(yīng)該是128和132的區(qū)別造成的,明天再修改程序試試。樓主辛苦了。
回復(fù)

使用道具 舉報

ID:256792 發(fā)表于 2023-7-7 11:57 | 顯示全部樓層
alunli 發(fā)表于 2022-4-3 01:16
整了些PFC的ST7565串口屏,焊好升壓電容和接線,找到樓主的程序下載測試液晶屏,能顯示,但字模偏了幾列, ...

我用在了oled上,也是這樣,解決了嗎‘
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表