找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机12864三级菜单图形菜单程序,很6的一个程序哦!

  [复制链接]
跳转到指定楼层
楼主

完整源码下载:
caidan12864 .zip (207.75 KB, 下载次数: 321)



单片机主程序预览:
  1. /**************************************************************
  2. *        +---------------------------------------------------+          *
  3. *                              12864三级菜单显示                                                  *
  4. *        +---------------------------------------------------+            *
  5. *                                                                                                                          *
  6. *  此源码版权属 小牛 全权享有,如欲引用,敬请署名并告知                  *
  7. *        严禁随意用于商业目的,违者必究,后果自负                          *
  8. *                                                                                                                         *
  9. *  运行环境:STC12C5A60S2单片机 12M晶振                                                  *
  10. *  程序说明:在12864上面实现三级菜单显示                                          *
  11. **************************************************************/
  12. #include<reg52.h>
  13. #include<intrins.h>
  14. #include"def.h"
  15. #include"mode.h"
  16. #include"fuction.h"

  17. void main()
  18. {       

  19.         init();
  20.         while(1)
  21.         {
  22.                 menucut(0,mun,table10,table0sub[0]);
  23.                 menucut(1,table0,table9,table1sub[0]);
  24.                 menucut(2,table1,table8,table2sub[0]);
  25.                 menucut(3,table2,table7,table3sub[0]);
  26.                 menucut(4,table3,table6,table4sub[0]);
  27.                 menucut(5,table4,table11,table5sub[0]);
  28.                 menucut(6,table5,table12,table6sub[0]);               
  29.         }
  30. }
复制代码
  1. void init()
  2. {
  3.         w_com(0x01);        //清屏
  4.         w_com(0x02);        //地址-》00H
  5.         w_com(0x0c);        //显示状态设置
  6.         w_com(0x30);        //功能设定
  7.         w_com(0x80);
  8.         w_com(0x01);        //清屏

  9. }
  10. //——————————读忙!—————————————//
  11. void r_busy()
  12. {
  13.         IO=0xff;
  14.         R_S=0;
  15.         W_R=1;
  16.         E=1;
  17.         while(IO&0x80);
  18.         E=0;
  19.       
  20. }
  21. //——————————写指令—————————————//
  22. void w_com(uchar com)
  23. {
  24.         r_busy();
  25.         R_S=0;
  26.         W_R=0;
  27.         E=0;
  28.         E=1;
  29.         IO=com;
  30.         E=0;
  31. }
  32. //——————————扩充指令——————————————//
  33. void w_ecom(uchar ecom)
  34. {
  35.         w_com(0x34); //选择8位数据发送,选择为扩充指令
  36.         r_busy();
  37.         R_S=0;
  38.         W_R=0;
  39.         E=0;
  40.         E=1;
  41.         IO=ecom;
  42.         E=0;
  43. }
  44. //——————————写数据—————————————//
  45. void w_dat(uchar dat)
  46. {
  47.       
  48.         r_busy();

  49.         R_S=1;
  50.         W_R=0;
  51.         E=0;
  52.         E=1;
  53.         IO=dat;
  54.         E=0;
  55. }

  56. void delay(uchar x)
  57. {
  58.         uchar i,j;
  59.         for(i=0;i<x;i++)
  60.                 for(j=0;j<124;j++);
  61. }

  62. void draw_pic(uchar *pic)
  63. {
  64.         uchar i,j;
  65.         w_com(0x01);        //清屏

  66.         for(i=0;i<32;i++)
  67.         {      
  68.                 w_ecom(0x80+i);                   //扩充指令,设定绘图RAM垂直地址
  69.                 w_ecom(0x80);                   //扩充指令,设定绘图RAM水平地址
  70.                 for(j=0;j<16;j++)
  71.                 {
  72.                         w_dat(*(pic++));
  73.                 }
  74.         }

  75.         for(i=0;i<32;i++)
  76.         {      
  77.                 w_ecom(0x80+i);                        //扩充指令,设定绘图RAM垂直地址
  78.                 w_ecom(0x88);                        //扩充指令,设定绘图RAM水平地址
  79.                 for(j=0;j<16;j++)
  80.                 {
  81.                
  82.                         w_dat(*(pic++));
  83.                 }
  84.         }
  85.                
  86.         w_com(0x36);
  87.         flag=1;
  88. }

  89. void draw_submune(uchar *pic,uchar row)                   //定义两个变量*pic-->图片字模的首地址;row-->子菜单要选择的行
  90. {
  91.         uchar i,j;
  92.         flag=0;
  93.         w_com(0x01);        //清屏

  94.         for(i=0;i<32;i++)
  95.         {      
  96.                 w_ecom(0x80+i);                   //扩充指令,设定绘图RAM垂直地址
  97.                 w_ecom(0x80);                   //扩充指令,设定绘图RAM水平地址
  98.                 for(j=0;j<16;j++)
  99.                 {
  100.                         if((i>(16*(row-1))) && (i<(row*16)) && row<3)         //用于判断LCD前32行的行反白
  101.                         w_dat(~(*(pic++)));                                                                 //如果是选择的反白行就反显其数据
  102.                         else                                                                                         //否则就正常显示其数据
  103.                         w_dat(*(pic++));
  104.                 }
  105.         }

  106.         for(i=0;i<32;i++)
  107.         {      
  108.                 w_ecom(0x80+i);                        //扩充指令,设定绘图RAM垂直地址
  109.                 w_ecom(0x88);                        //扩充指令,设定绘图RAM水平地址
  110.                 for(j=0;j<16;j++)
  111.                 {
  112.                
  113.                         if((i>(16*(row-3))) && (i<((row-2)*16)) && row>2)                //用于判断LCD后32行的行反白
  114.                         w_dat(~(*(pic++)));                                                                                //如果是选择的反白行就反显其数据                                                                                                
  115.                         else                                                                                                        //否则就正常显示其数据
  116.                         w_dat(*(pic++));

  117.                 }
  118.         }
  119.                
  120.         w_com(0x36);                                                                                 
  121.         flag=1;                                                                                                                           //子菜单显示标志位      
  122. }


  123. void key()
  124. {

  125.         if((s3==0) || (s2==0) )
  126.         {
  127.                 delay(10);
  128.                 if(s3==0)
  129.                 {
  130.                         temp++;
  131.                         if(temp>6)
  132.                         temp=0;
  133.                         while(!s3);      
  134.                 }

  135.                 else if(s2==0)
  136.                 {
  137.                         temp--;
  138.                         if(temp>6)
  139.                         temp=6;
  140.                         while(!s2);      
  141.                 }
  142.         }
  143. }

  144. void keycut()
  145. {
  146.         if((s1==0) || (s0==0) )
  147.         {
  148.                 delay(10);
  149.                 if(s1==0)
  150.                 {
  151.                         submune=1;
  152.                         if(sub && subflag)
  153.                         subflag1=1;

  154.                         while(!s1);      
  155.                 }
  156.                
  157.                 if(submune==0)
  158.                 return;

  159.                 else if(s0==0)
  160.                 {

  161.                         sub=0;
  162.                         submune=0;
  163.                         subflag1=0;
  164.                         submune1=1;

  165.                         if(sub1)
  166.                         {
  167.                                 submune=1;
  168.                                 sub1=0;
  169.                                 sub=0;
  170.                                 flag=1;
  171.                                 subflag=0;
  172.                         }
  173.                        
  174.                         else
  175.                         {
  176.                                 flag=0;
  177.                                 submune=0;
  178.                                 subflag=0;
  179.                         }
  180.                         
  181.                        
  182.                        
  183.                         while(!s0);
  184.                        
  185.                 }
  186.                
  187.                
  188.         }


  189. }

  190. void key_submune()
  191. {

  192.         if((s3==0) || (s2==0))
  193.         {
  194.                 delay(10);
  195.                 if(s3==0)
  196.                 {
  197.                         submune1++;
  198.                         if(submune1>4)
  199.                         submune1=1;
  200.                         while(!s3);      
  201.                 }

  202.                 else if(s2==0)
  203.                 {
  204.                         submune1--;
  205.                         if(submune1==0)
  206.                         submune1=4;
  207.                         while(!s2);      
  208.                 }
  209.                 subflag=0;
  210.         }
  211. }

  212. void key_submune1()
  213. {

  214.         if((s3==0) || (s2==0))
  215.         {
  216.                 delay(10);
  217.                 if(s3==0)
  218.                 {
  219.                         submune2++;
  220.                         if(submune2>4)
  221.                         submune2=1;
  222.                         while(!s3);      
  223.                 }

  224.                 else if(s2==0)
  225.                 {
  226.                         submune2--;
  227.                         if(submune2==0)
  228.                         submune2=4;
  229.                         while(!s2);      
  230.                 }
  231.                 subflag=0;
  232.         }
  233. }

  234. /****************************************************************************
  235. *         num-->第一级菜单的标志位;*add-->第一级菜单的图片的地址入口                        *
  236. *        *sbuadd第二级菜单的图片的地址入口;*sbuadd1第三级菜单的图片的地址入口;        *
  237. *****************************************************************************/
  238. void menucut(uchar num,uchar *add,uchar *sbuadd,uchar *sbuadd1)         
  239. {
  240.         while(num==temp)                                          //第一级菜单的标志位判断条件
  241.         {
  242.                 draw_pic(add);                                          //画第一级菜单的图形界面

  243. /*第一级菜单界面等待时的要支持第一级菜单的切换和第二级界面的进入和返回 */
  244.                 while((num==temp) && flag)               
  245.                 {
  246.                         key();                                                //第一级菜单界面的切换
  247.                         keycut();                                        //第二级界面的进入
  248.                         while((num==temp) && (submune==1)) //第二级菜单的标志位判断条件
  249.                         {
  250.                                 draw_submune(sbuadd,submune1);        //画第二级菜单的图形界面
  251.                                 subflag=1;                                                //画完第二级菜单的图形界面要置位进入可以进行界面切换的循环
  252. /*第二级菜单界面等待时的要支持第二级菜单的切换和第三级界面的进入和返回 */
  253.                                 while((num==temp) && (submune==1) && subflag)
  254.                                 {
  255.                                         sub=1;                                 //第三级菜单的标志位用于区分其级数
  256.                                         keycut();                         //第二级菜单界面的进入第三级菜单切换和返回第一级菜单
  257.                                         key_submune();                 //第二级界面的进入
  258.                                         while(subflag1 && sub)
  259.                                         {
  260. /*第三级菜单是一个二维数组所以在第二级进入第三级的时候要根据第二级的标志位选择进入第三级的的地址入口*/
  261.                                                 draw_submune(sbuadd1+((submune1-1)*1024),submune2);          //画第三级菜单的图形界面
  262.                                                 subflag=1;
  263.                                                 sub1=1;                  //画完第三级菜单的图形界面要置位进入可以进行界面切换的循环
  264.                                                 while(subflag1 && sub && subflag)
  265.                                                 {
  266.                                                          key_submune1();   //第三级界面的切换
  267.                                                          keycut();                   //第三级界面的返回
  268.                                                 }               
  269.                                         }
  270.                                 }               
  271.                         }
  272.                 }
  273.         }
  274. }

  275. #endif
复制代码



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:236426 发表于 2017-9-28 20:42 | 只看该作者
下载了,参考一下
回复

使用道具 举报

板凳
ID:201936 发表于 2017-9-29 08:35 | 只看该作者
下载了学习学习
回复

使用道具 举报

地板
ID:230847 发表于 2017-9-30 09:03 来自手机 | 只看该作者
谢谢楼主,学习一下
回复

使用道具 举报

5#
ID:235691 发表于 2017-9-30 10:35 | 只看该作者

下载了,参考一下
回复

使用道具 举报

6#
ID:235868 发表于 2017-9-30 19:39 | 只看该作者
楼主,切换了几个界面,液晶屏突然就死机了,是怎么回事啊
回复

使用道具 举报

7#
ID:101808 发表于 2017-11-14 18:10 | 只看该作者
45k啊,这可是个大程序!
回复

使用道具 举报

8#
ID:344184 发表于 2018-6-3 20:29 | 只看该作者
谢谢楼主,学习一下
回复

使用道具 举报

9#
ID:63646 发表于 2018-7-17 10:35 | 只看该作者
非常好的资料
回复

使用道具 举报

10#
ID:378458 发表于 2018-7-24 14:25 | 只看该作者
正好在研究菜单,下载下来好好学习下
回复

使用道具 举报

11#
ID:374157 发表于 2018-8-10 14:36 | 只看该作者
下载试试
回复

使用道具 举报

12#
ID:334500 发表于 2018-8-19 10:15 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

13#
ID:408907 发表于 2018-10-13 10:28 | 只看该作者
哈哈 好好学习一下!!
回复

使用道具 举报

14#
ID:82419 发表于 2018-10-13 18:18 来自手机 | 只看该作者
留下脚印
回复

使用道具 举报

15#
ID:408907 发表于 2018-10-21 21:54 | 只看该作者
学习一下,看看如何搞定菜单。
回复

使用道具 举报

16#
ID:37147 发表于 2019-5-17 18:35 | 只看该作者
不知如何移植STM32
回复

使用道具 举报

17#
ID:202803 发表于 2019-6-18 22:40 | 只看该作者
楼主能贴图片出来看看吗
回复

使用道具 举报

18#
ID:547522 发表于 2019-7-7 10:08 来自手机 | 只看该作者
对于我来说超牛啊,51黑有你更精彩。
回复

使用道具 举报

19#
ID:589541 发表于 2019-7-24 14:16 | 只看该作者
看看,学习学习,
回复

使用道具 举报

20#
ID:206373 发表于 2019-7-29 16:58 | 只看该作者
下载了,参考一下
回复

使用道具 举报

21#
ID:617478 发表于 2020-2-26 07:40 | 只看该作者
下载了,参考一下
回复

使用道具 举报

22#
ID:108573 发表于 2020-2-26 10:15 | 只看该作者
不错,记录一下:12864多级菜单
回复

使用道具 举报

23#
ID:231648 发表于 2020-4-7 16:26 | 只看该作者
移植OLED 屏幕试试额 多谢博主
回复

使用道具 举报

24#
ID:71535 发表于 2020-4-7 17:18 | 只看该作者
12864多级菜单学了很久还没弄明白,希望这次好学。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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