找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

51單片機(jī)12864三級(jí)菜單圖形菜單程序,很6的一個(gè)程序哦!

  [復(fù)制鏈接]
ID:84765 發(fā)表于 2017-3-1 13:43 | 顯示全部樓層 |閱讀模式
0.png
完整源碼下載:
caidan12864 .zip (207.75 KB, 下載次數(shù): 354)



單片機(jī)主程序預(yù)覽:
  1. /**************************************************************
  2. *        +---------------------------------------------------+          *
  3. *                              12864三級(jí)菜單顯示                                                  *
  4. *        +---------------------------------------------------+            *
  5. *                                                                                                                          *
  6. *  此源碼版權(quán)屬 小牛 全權(quán)享有,如欲引用,敬請(qǐng)署名并告知                  *
  7. *        嚴(yán)禁隨意用于商業(yè)目的,違者必究,后果自負(fù)                          *
  8. *                                                                                                                         *
  9. *  運(yùn)行環(huán)境:STC12C5A60S2單片機(jī) 12M晶振                                                  *
  10. *  程序說明:在12864上面實(shí)現(xiàn)三級(jí)菜單顯示                                          *
  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. }
復(fù)制代碼
  1. void init()
  2. {
  3.         w_com(0x01);        //清屏
  4.         w_com(0x02);        //地址-》00H
  5.         w_com(0x0c);        //顯示狀態(tài)設(shè)置
  6.         w_com(0x30);        //功能設(shè)定
  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. //——————————擴(kuò)充指令——————————————//
  33. void w_ecom(uchar ecom)
  34. {
  35.         w_com(0x34); //選擇8位數(shù)據(jù)發(fā)送,選擇為擴(kuò)充指令
  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. //——————————寫數(shù)據(jù)—————————————//
  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);                   //擴(kuò)充指令,設(shè)定繪圖RAM垂直地址
  69.                 w_ecom(0x80);                   //擴(kuò)充指令,設(shè)定繪圖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);                        //擴(kuò)充指令,設(shè)定繪圖RAM垂直地址
  78.                 w_ecom(0x88);                        //擴(kuò)充指令,設(shè)定繪圖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)                   //定義兩個(gè)變量*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);                   //擴(kuò)充指令,設(shè)定繪圖RAM垂直地址
  97.                 w_ecom(0x80);                   //擴(kuò)充指令,設(shè)定繪圖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++)));                                                                 //如果是選擇的反白行就反顯其數(shù)據(jù)
  102.                         else                                                                                         //否則就正常顯示其數(shù)據(jù)
  103.                         w_dat(*(pic++));
  104.                 }
  105.         }

  106.         for(i=0;i<32;i++)
  107.         {      
  108.                 w_ecom(0x80+i);                        //擴(kuò)充指令,設(shè)定繪圖RAM垂直地址
  109.                 w_ecom(0x88);                        //擴(kuò)充指令,設(shè)定繪圖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++)));                                                                                //如果是選擇的反白行就反顯其數(shù)據(jù)                                                                                                
  115.                         else                                                                                                        //否則就正常顯示其數(shù)據(jù)
  116.                         w_dat(*(pic++));

  117.                 }
  118.         }
  119.                
  120.         w_com(0x36);                                                                                 
  121.         flag=1;                                                                                                                           //子菜單顯示標(biāo)志位      
  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-->第一級(jí)菜單的標(biāo)志位;*add-->第一級(jí)菜單的圖片的地址入口                        *
  236. *        *sbuadd第二級(jí)菜單的圖片的地址入口;*sbuadd1第三級(jí)菜單的圖片的地址入口;        *
  237. *****************************************************************************/
  238. void menucut(uchar num,uchar *add,uchar *sbuadd,uchar *sbuadd1)         
  239. {
  240.         while(num==temp)                                          //第一級(jí)菜單的標(biāo)志位判斷條件
  241.         {
  242.                 draw_pic(add);                                          //畫第一級(jí)菜單的圖形界面

  243. /*第一級(jí)菜單界面等待時(shí)的要支持第一級(jí)菜單的切換和第二級(jí)界面的進(jìn)入和返回 */
  244.                 while((num==temp) && flag)               
  245.                 {
  246.                         key();                                                //第一級(jí)菜單界面的切換
  247.                         keycut();                                        //第二級(jí)界面的進(jìn)入
  248.                         while((num==temp) && (submune==1)) //第二級(jí)菜單的標(biāo)志位判斷條件
  249.                         {
  250.                                 draw_submune(sbuadd,submune1);        //畫第二級(jí)菜單的圖形界面
  251.                                 subflag=1;                                                //畫完第二級(jí)菜單的圖形界面要置位進(jìn)入可以進(jìn)行界面切換的循環(huán)
  252. /*第二級(jí)菜單界面等待時(shí)的要支持第二級(jí)菜單的切換和第三級(jí)界面的進(jìn)入和返回 */
  253.                                 while((num==temp) && (submune==1) && subflag)
  254.                                 {
  255.                                         sub=1;                                 //第三級(jí)菜單的標(biāo)志位用于區(qū)分其級(jí)數(shù)
  256.                                         keycut();                         //第二級(jí)菜單界面的進(jìn)入第三級(jí)菜單切換和返回第一級(jí)菜單
  257.                                         key_submune();                 //第二級(jí)界面的進(jìn)入
  258.                                         while(subflag1 && sub)
  259.                                         {
  260. /*第三級(jí)菜單是一個(gè)二維數(shù)組所以在第二級(jí)進(jìn)入第三級(jí)的時(shí)候要根據(jù)第二級(jí)的標(biāo)志位選擇進(jìn)入第三級(jí)的的地址入口*/
  261.                                                 draw_submune(sbuadd1+((submune1-1)*1024),submune2);          //畫第三級(jí)菜單的圖形界面
  262.                                                 subflag=1;
  263.                                                 sub1=1;                  //畫完第三級(jí)菜單的圖形界面要置位進(jìn)入可以進(jìn)行界面切換的循環(huán)
  264.                                                 while(subflag1 && sub && subflag)
  265.                                                 {
  266.                                                          key_submune1();   //第三級(jí)界面的切換
  267.                                                          keycut();                   //第三級(jí)界面的返回
  268.                                                 }               
  269.                                         }
  270.                                 }               
  271.                         }
  272.                 }
  273.         }
  274. }

  275. #endif
復(fù)制代碼



評(píng)分

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

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:236426 發(fā)表于 2017-9-28 20:42 | 顯示全部樓層
下載了,參考一下
回復(fù)

使用道具 舉報(bào)

ID:201936 發(fā)表于 2017-9-29 08:35 | 顯示全部樓層
下載了學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:230847 發(fā)表于 2017-9-30 09:03 來自手機(jī) | 顯示全部樓層
謝謝樓主,學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:235691 發(fā)表于 2017-9-30 10:35 | 顯示全部樓層

下載了,參考一下
回復(fù)

使用道具 舉報(bào)

ID:235868 發(fā)表于 2017-9-30 19:39 | 顯示全部樓層
樓主,切換了幾個(gè)界面,液晶屏突然就死機(jī)了,是怎么回事啊
回復(fù)

使用道具 舉報(bào)

ID:101808 發(fā)表于 2017-11-14 18:10 | 顯示全部樓層
45k啊,這可是個(gè)大程序!
回復(fù)

使用道具 舉報(bào)

ID:344184 發(fā)表于 2018-6-3 20:29 | 顯示全部樓層
謝謝樓主,學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:63646 發(fā)表于 2018-7-17 10:35 | 顯示全部樓層
非常好的資料
回復(fù)

使用道具 舉報(bào)

ID:378458 發(fā)表于 2018-7-24 14:25 | 顯示全部樓層
正好在研究菜單,下載下來好好學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

ID:374157 發(fā)表于 2018-8-10 14:36 | 顯示全部樓層
下載試試
回復(fù)

使用道具 舉報(bào)

ID:334500 發(fā)表于 2018-8-19 10:15 | 顯示全部樓層
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:408907 發(fā)表于 2018-10-13 10:28 | 顯示全部樓層
哈哈 好好學(xué)習(xí)一下!!
回復(fù)

使用道具 舉報(bào)

ID:82419 發(fā)表于 2018-10-13 18:18 來自手機(jī) | 顯示全部樓層
留下腳印
回復(fù)

使用道具 舉報(bào)

ID:408907 發(fā)表于 2018-10-21 21:54 | 顯示全部樓層
學(xué)習(xí)一下,看看如何搞定菜單。
回復(fù)

使用道具 舉報(bào)

ID:37147 發(fā)表于 2019-5-17 18:35 | 顯示全部樓層
不知如何移植STM32
回復(fù)

使用道具 舉報(bào)

ID:202803 發(fā)表于 2019-6-18 22:40 | 顯示全部樓層
樓主能貼圖片出來看看嗎
回復(fù)

使用道具 舉報(bào)

ID:547522 發(fā)表于 2019-7-7 10:08 來自手機(jī) | 顯示全部樓層
對(duì)于我來說超牛啊,51黑有你更精彩。
回復(fù)

使用道具 舉報(bào)

ID:589541 發(fā)表于 2019-7-24 14:16 | 顯示全部樓層
看看,學(xué)習(xí)學(xué)習(xí),
回復(fù)

使用道具 舉報(bào)

ID:206373 發(fā)表于 2019-7-29 16:58 | 顯示全部樓層
下載了,參考一下
回復(fù)

使用道具 舉報(bào)

ID:617478 發(fā)表于 2020-2-26 07:40 | 顯示全部樓層
下載了,參考一下
回復(fù)

使用道具 舉報(bào)

ID:108573 發(fā)表于 2020-2-26 10:15 | 顯示全部樓層
不錯(cuò),記錄一下:12864多級(jí)菜單
回復(fù)

使用道具 舉報(bào)

ID:231648 發(fā)表于 2020-4-7 16:26 | 顯示全部樓層
移植OLED 屏幕試試額 多謝博主
回復(fù)

使用道具 舉報(bào)

ID:71535 發(fā)表于 2020-4-7 17:18 | 顯示全部樓層
12864多級(jí)菜單學(xué)了很久還沒弄明白,希望這次好學(xué)。
回復(fù)

使用道具 舉報(bào)

ID:123917 發(fā)表于 2024-6-20 22:48 | 顯示全部樓層
請(qǐng)教,我下載后怎么看不到第二圖片的代碼
回復(fù)

使用道具 舉報(bào)

ID:1064915 發(fā)表于 2024-6-21 11:10 | 顯示全部樓層
程序是帶字庫的,能否改成ks0108的學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

ID:1044755 發(fā)表于 2024-7-31 10:21 | 顯示全部樓層
相見恨晚啊,收藏一下,以后下載
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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