找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4279|回复: 6
打印 上一主题 下一主题
收起左侧

单片机+LCD12864多级菜单源程序与Proteus仿真图

  [复制链接]
跳转到指定楼层
楼主
ID:34298 发表于 2021-11-15 23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
LCD12864多级菜单仿真, 带实例源程序和hex文件, 转载分享给需要的人学习。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <asc.h>
  3. #include <12864.h>
  4. #include <imag.h>

  5. #define uchar unsigned char
  6. #define uint  unsigned int

  7. //菜单的实现
  8. /*-------------------------------------------------------------*/
  9. #define MENU_SIZE 18             //菜单长度

  10. unsigned char KeyFuncIndex=0;    //存放当前的菜单索引

  11. void (*KeyFuncPtr)();            //定义按键功能指针
  12. //定义类型
  13. typedef struct
  14. {
  15.    unsigned char KeyStateIndex;   //当前的状态索引号
  16.    unsigned char KeyDownState;    //按下向下键时的状态索引号
  17.    unsigned char KeyUpState;      //按下向上键时的状态索引号
  18.    unsigned char KeyEnterState;   //按下回车键时的状态索引号
  19.    void (*CurrentOperate)();      //当前状态应该执行的功能操作
  20. }  StateTab;
  21. //
  22. //
  23. unsigned char code s0[]="MenuTest        ";
  24. unsigned char code s1[]="Contact         ";
  25. unsigned char code s2[]="LineTest        ";
  26. unsigned char code s3[]="RectTest        ";
  27. unsigned char code s4[]="ImagTest        ";
  28. unsigned char code s5[]="Cancel          ";
  29. unsigned char code s6[]="Univercity      ";
  30. unsigned char code s7[]="E-Mail          ";
  31. unsigned char code s8[]="QQ Number       ";
  32. unsigned char code s9[]="Cancel          ";
  33. unsigned char code s10[]="                ";
  34. /*-------------------------------------------------------------*/
  35. void Stat0(void)
  36. {
  37.     en_disp(0,0,16,Asc,s0,0);
  38.         en_disp(2,0,16,Asc,s1,1);
  39.         en_disp(4,0,16,Asc,s10,1);
  40.         en_disp(6,0,16,Asc,s10,1);
  41. }
  42. /*-------------------------------------------------------------*/
  43. void Stat1(void)
  44. {        
  45.     en_disp(0,0,16,Asc,s0,1);
  46.         en_disp(2,0,16,Asc,s1,0);
  47.         en_disp(4,0,16,Asc,s10,1);
  48.         en_disp(6,0,16,Asc,s10,1);
  49. }
  50. /*-------------------------------------------------------------*/
  51. void Stat2(void)
  52. {
  53.     en_disp(0,0,16,Asc,s2,0);
  54.         en_disp(2,0,16,Asc,s3,1);
  55.         en_disp(4,0,16,Asc,s4,1);
  56.         en_disp(6,0,16,Asc,s5,1);
  57. }
  58. /*-------------------------------------------------------------*/
  59. void Stat3(void)
  60. {
  61.     en_disp(0,0,16,Asc,s2,1);
  62.         en_disp(2,0,16,Asc,s3,0);
  63.         en_disp(4,0,16,Asc,s4,1);
  64.         en_disp(6,0,16,Asc,s5,1);
  65. }
  66. /*-------------------------------------------------------------*/
  67. void Stat4(void)
  68. {
  69.     en_disp(0,0,16,Asc,s2,1);
  70.         en_disp(2,0,16,Asc,s3,1);
  71.         en_disp(4,0,16,Asc,s4,0);
  72.         en_disp(6,0,16,Asc,s5,1);
  73. }
  74. /*-------------------------------------------------------------*/
  75. void Stat5(void)
  76. {
  77.     en_disp(0,0,16,Asc,s2,1);
  78.         en_disp(2,0,16,Asc,s3,1);
  79.         en_disp(4,0,16,Asc,s4,1);
  80.         en_disp(6,0,16,Asc,s5,0);
  81. }
  82. /*-------------------------------------------------------------*/
  83. void Stat6(void)
  84. {
  85.         en_disp(0,0,16,Asc,s6,0);
  86.         en_disp(2,0,16,Asc,s7,1);
  87.         en_disp(4,0,16,Asc,s8,1);
  88.         en_disp(6,0,16,Asc,s9,1);
  89. }
  90. /*-------------------------------------------------------------*/
  91. void Stat7(void)
  92. {
  93.     en_disp(0,0,16,Asc,s6,1);
  94.         en_disp(2,0,16,Asc,s7,0);
  95.         en_disp(4,0,16,Asc,s8,1);
  96.         en_disp(6,0,16,Asc,s9,1);
  97. }
  98. /*-------------------------------------------------------------*/
  99. void Stat8(void)
  100. {
  101.     en_disp(0,0,16,Asc,s6,1);
  102.         en_disp(2,0,16,Asc,s7,1);
  103.         en_disp(4,0,16,Asc,s8,0);
  104.         en_disp(6,0,10,Asc,s9,1);
  105. }
  106. /*-------------------------------------------------------------*/
  107. void Stat9(void)
  108. {
  109.     en_disp(0,0,16,Asc,s6,1);
  110.         en_disp(2,0,16,Asc,s7,1);
  111.         en_disp(4,0,16,Asc,s8,1);
  112.         en_disp(6,0,16,Asc,s9,0);
  113. }         
  114. /*-------------------------------------------------------------*/
  115. void Stat10(void)
  116. {
  117.     ClearLCD();
  118.     Line(10,10,100,48,1);
  119. }
  120. /*-------------------------------------------------------------*/
  121. void Stat11(void)
  122. {
  123.     ClearLCD();
  124.     Rect(0,0,127,63,1);
  125.         Rect(10,10,67,43,1);
  126. }
  127. /*-------------------------------------------------------------*/
  128. void Stat12(void)
  129. {
  130. //    ClearLCD();
  131.     img_disp(1,10,70,56,img2);
  132. }
  133. /*-------------------------------------------------------------*/
  134. void Stat13(void)
  135. {
  136.     img12864_disp(img);
  137. }
  138. /*-------------------------------------------------------------*/
  139. void Stat14(void)
  140. {
  141.         en_disp(0,0,16,Asc,s10,1);
  142.     en_disp(2,0,16,Asc,"E-Mail:         ",1);
  143.         en_disp(4,0,16,Asc," 111111111 ",1);
  144.         en_disp(6,0,16,Asc,"     @   ",1);
  145. }
  146. /*-------------------------------------------------------------*/
  147. void Stat15(void)
  148. {
  149.     en_disp(0,0,16,Asc,s10,1);
  150.     en_disp(2,0,16,Asc,"QQ Number:      ",1);
  151.         en_disp(4,0,16,Asc,"   1111111     ",1);
  152.         en_disp(6,0,16,Asc,s10,1);

  153. }
  154. /*-------------------------------------------------------------*/
  155. //数据结构数组
  156. StateTab code KeyTab[MENU_SIZE]=
  157. {
  158.            {0,1,1,2,   (*Stat0)},    //顶层
  159.         {1,0,0,6,   (*Stat1)},           //顶层

  160.         {2,3,5,10,  (*Stat2)},     //二层
  161.         {3,4,2,11,  (*Stat3)},           //二层
  162.         {4,5,3,12,  (*Stat4)},           //二层
  163.         {5,2,4,0,   (*Stat5)},           //二层

  164.         {6,7,9,13,  (*Stat6)},     //二层
  165.         {7,8,6,14,  (*Stat7)},     //
  166.         {8,9,7,15,  (*Stat8)},   
  167.         {9,6,8,1 ,  (*Stat9)},     //二层

  168.         {10,2,2,2,(*Stat10)},    //三                   LineTest
  169.         {11,3,3,3,(*Stat11)},           //                   RectTest
  170.         {12,4,4,4,(*Stat12)},           //          ImgTest

  171.         {13,6,6,6,(*Stat13)},            //三                Univercity
  172.         {14,7,7,7,(*Stat14)},                //          E-Mail
  173.          {15,8,8,8,(*Stat15)}                //          QQ Numeber
  174. };
  175. /*-------------------------------------------------------------*/
  176. void MenuOperate(unsigned char key)
  177. {
  178.     switch(key)
  179.         {
  180.             case  0x30:                       //向上的键
  181.                 {
  182.                     KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
  183.                         break;
  184.                 }
  185.                 case  0x28:                          //回车键
  186.                 {
  187.                         KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEnterState;
  188.                         break;
  189.                 }
  190.                 case  0x18:                          //向下的键
  191.                 {
  192.                         KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDownState;
  193.                         break;
  194.                 }
  195.                 //此处添加按键错误代码
  196.         }
  197.         //下面是执行按键的操作
  198.         KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;

  199.         (*KeyFuncPtr)();     //执行当前的按键操作
  200. }         //*/
  201. /*-------------------------------------------------------------*/
  202. unsigned char keyscan()
  203. {
  204.     unsigned char key;
  205.         P2=0xFF;
  206.         key=P2&0x38;
  207.         delayms(8);
  208.         //在这里加去抖动
  209.         return key;
  210. }                 
  211. /*--------------------------------------------------------------*/
  212. void int_0(void) interrupt 0   using 0
  213. {
  214.             unsigned char key;
  215.          key=keyscan();
  216.          MenuOperate(key);
  217. }
  218. /*-------------------------------------------------------------*/
  219. void main (void)
  220. {
  221.     LCD12864_init();
  222.         ClearLCD();
  223.         //开中断
  224.         EX0=1;
  225.         //设置电平触发方式
  226.         IT0=1;
  227.         //开所有中断
  228.         EA=1;
  229.         //
  230.         MenuOperate(0);
  231.     while(1)
  232.         {
  233.         }
  234. }
复制代码

注意dsn文件是仿真工程,是用Proteus7.5版本画的,所以只能用7.5才能正常运行,其他版本都不行
LCD12864多级菜单仿真.7z (49.3 KB, 下载次数: 212)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏14 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:582255 发表于 2021-11-16 10:24 | 只看该作者
一堆的错误啊。。。。没有子文件的.c文件?
回复

使用道具 举报

板凳
ID:819198 发表于 2021-11-18 11:24 | 只看该作者
下载了,Proteus 8.6 运行屏幕无显示
回复

使用道具 举报

地板
ID:819198 发表于 2021-11-19 12:07 | 只看该作者
问题找到了,注释这个就行
/*  do
   {
      flag=LCD12864_DATA_PORT;
          LCD12864_DATA_PORT=0xFF;
   }while(!((flag&0x80)==0x80));
   */
回复

使用道具 举报

5#
ID:440028 发表于 2022-1-5 15:44 | 只看该作者
你应该整理好,或者不要黑B,大家才好干。
回复

使用道具 举报

6#
ID:606226 发表于 2022-10-29 22:42 | 只看该作者
用高版本Proteus出现黑屏,这个是修改后的完整版,供大家学习

LCD12864多级菜单仿真.rar

102.89 KB, 下载次数: 52, 下载积分: 黑币 -5

回复

使用道具 举报

7#
ID:92810 发表于 2022-12-1 12:18 | 只看该作者
c00156155 发表于 2022-10-29 22:42
用高版本Proteus出现黑屏,这个是修改后的完整版,供大家学习

谢谢分享啦
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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