久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4953|回復: 3
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

制作出來的LCD12864菜單實物圖如下:


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

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


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

  18. 編譯環境:

  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. 版權聲明:
  34. 義務:
  35. 1.如果您在使用中發現任何BUG,請通知gongxd@126.com,我會及時改正,并給您一份最新的代碼
  36. 2.請保留本聲明

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

  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. //所有菜單板的個數
  50. #define MenuAllCount sizeof(MenuPanel)/sizeof(MenuPanelStruct)
  51. Menu_Statestruct  Menu_State;//菜單狀態定義


  52. //=================================================================================棧函數

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

  55. //聲明堆棧元素類型
  56. typedef Menu_Statestruct StackElementType;
  57. //棧元素數組聲明
  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. //=================================================================================菜單函數
  97. //已經到最頂了
  98. void  StackEmptyErr()
  99. {
  100. unsigned  char code MenuTopErrMsg[]=
  101. {"已經到最頂了"};
  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; //顯示第一項對應的菜單條目索引
  109.     Menu_State.FocusLine=1;  //焦點在屏上是第幾項
  110. }

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

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

  125. //光標所在行菜單項顯示
  126. void UpdatedisplayMenu_Focus(unsigned char *MenuTxttmp)
  127. {
  128. #if   FocusReverse==1
  129.     //圖像反色顯示 0 否 1是,執行此命令后的所有操作均是按照設置顯示
  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是,執行此命令后的所有操作均是按照設置顯示
  143.     LCD_disp_SetReverse(0);
  144. #endif


  145. }

  146. //菜單顯示更新函數
  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.         //光標所在行菜單項顯示,可以自定義反白顯示等
  163.             UpdatedisplayMenu_Focus(p->MenuTxt);
  164.         }
  165.         else
  166.         {
  167.             LCD_disp_printR(p->MenuTxt,MenuItemDisplayStartX,i+MenuItemDisplayStartY);
  168.         }
  169.         p++;
  170.     }




  171. }

  172. //按鍵處理函數
  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++; //顯示第一項對應的菜單條目索引
  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; //顯示第一項對應的菜單條目索引
  241.             Menu_State.FocusLine=0;  //焦點在屏上是第幾項
  242.             
  243.              }
  244.              else
  245.              {
  246.                 //菜單達到最大深度,棧滿提示函數
  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; //顯示第一項對應的菜單條目索引
  260.                 Menu_State.FocusLine=tmpParent.FocusLine;  //焦點在屏上是第幾項
  261.             
  262.             }
  263.             else
  264.             {
  265.               //菜單已經到最頂了,棧空提示函數
  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. //弄這兩個函數并列目的是減小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; //顯示第一項對應的菜單條目索引
  295.     Menu_State.FocusLine=1;  //焦點在屏上是第幾項
  296.     UpdatedisplayMenuPanel();//更新菜單
  297. }
復制代碼

所有資料51hei提供下載:
ST7565 串行液晶驅動 多層液晶菜單 Proteus仿真 ST7565 串行液晶驅動.rar (136.09 KB, 下載次數: 211)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:461260 發表于 2020-12-22 18:01 | 只看該作者
下載來學習一下,現在即使不知道怎么做菜單問題
回復

使用道具 舉報

板凳
ID:96744 發表于 2022-4-3 01:16 | 只看該作者
整了些PFC的ST7565串口屏,焊好升壓電容和接線,找到樓主的程序下載測試液晶屏,能顯示,但字模偏了幾列,應該是128和132的區別造成的,明天再修改程序試試。樓主辛苦了。
回復

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线看片 | 国产精品一区二区久久久久 | av大片在线观看 | 国产色爽 | 国产精品一区二 | 成人一区二区三区在线观看 | 国产精品a久久久久 | 久草99| 91精品国产91久久久久久 | 日韩免费一区 | 四虎最新 | 欧美日韩国产精品一区 | 国产精品区二区三区日本 | 日韩不卡一区二区 | 久久精品久久久久久 | www.国产精 | 国产欧美一区二区三区国产幕精品 | 涩涩99 | 天天综合网天天综合色 | 99热99| 欧美日韩一卡二卡 | 国产精品99久久久久久动医院 | 久久不卡| 国产免费一区二区 | 98成人网 | 精品国产一区二区国模嫣然 | 国产伦精品一区二区三区视频金莲 | 日韩欧美专区 | 蜜桃av一区二区三区 | 欧美成人精品一区二区三区 | 91不卡在线 | 日本一区二区三区四区 | 日本亚洲一区 | 日韩国产精品一区二区三区 | 99成人 | 一区二区三区四区免费在线观看 | 亚洲视频中文字幕 | 日韩福利电影 | 久久噜噜噜精品国产亚洲综合 | 欧美综合一区二区三区 | 黑人精品欧美一区二区蜜桃 |