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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32F1C8T6 OLED12864菜單源程序 行數限定+參數設定

  [復制鏈接]
跳轉到指定樓層
樓主
ID:861056 發表于 2022-3-5 12:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
菜單+行數限定+參數設定 - 4按鍵
用于多級菜單顯示完成各項功能選擇

main函數

  1. //字庫放在這里面,中文用多少生成多少#include "codetab.h"
  2. //PB6 -- SCL; PB7 -- SDA */

  3. #include "delay.h"
  4. #include "stm32f10x.h"
  5. #include "OLED_I2C.h"
  6. #include "exti.h"
  7. #include "stdio.h"
  8. #include "key.h"
  9. #include "stmflash.h"

  10. #define FLASH_SAVE_ADDR  0X08009000                //設置FLASH 保存地址(必須為偶數,且其值要大于本代碼所占用FLASH的大小+0X08000000)
  11. //C8T6和CBT6(僅FLASH容量有區別)一般是在同一生產線生產的,
  12. //如果CBT6的FLASH容量部分不能使用那么就作為C8T6
  13. //36864= 0X9 000        
  14. //64K=0X10 000
  15. #define linenumber 4
  16. struct MenuItem
  17. {
  18.         short MenuCount;//當前菜單項目總數
  19.         u8 *DisplayString;//當前項目要顯示的字符
  20.         void(*Subs)();//選擇某一菜單后執行的功能函數
  21.         struct MenuItem *ChildrenMenus;//當前項目的子菜單
  22.         struct MenuItem *ParentMenus;//當前項目的父菜單
  23. };
  24. struct mydata
  25. {
  26.         float length1;
  27.         float length2;
  28.         float angle;
  29. };
  30. struct mydata rmydata;
  31. int selectItem_current,selectItem_hidden,selectItem;
  32. int key_num=0;
  33. int juli,jiaodu;

  34. void caidan(void);
  35. int key_scan(void);//是否按下確認鍵
  36. void display(struct MenuItem * MenuPoint,int selectItem_current,int selectItem_hidden);
  37. void caidan_init(void);
  38. void fun1(void);
  39. void fun2(void);
  40. void fun3(void);
  41. void fun4(void);
  42. void fun5(void);
  43. void fun6(void);

  44. int main(void)
  45. {
  46.         delay_init();                     //延時函數初始化         
  47.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
  48.         I2C_Configuration();
  49.         OLED_Init();        
  50.         OLED_CLS();
  51.         KEY_Init();
  52.         caidan_init();
  53.         //fun2();//第一次下載需要去掉fun2()前面的注釋,不然程序直接卡死
  54.         STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&rmydata,sizeof(rmydata));
  55.         while(1)
  56.         {
  57.                 key_num=KEY_Scan();
  58.                 caidan();
  59.                 delay_ms(20);
  60.         }
  61. }
  62. int my_min(int a,int b)
  63. {
  64.         if (a<b)return a;
  65.         return b;
  66. }
  67. //由于定義從上往下,數組定義時子類都為NULL
  68. //第一級
  69. struct MenuItem MainMenu[] = {
  70. { 8,(u8 *)"第一",NULL,NULL,NULL },
  71. { 6,(u8 *)"第二",NULL,NULL,NULL },
  72. { 6,(u8 *)"第三",NULL,NULL,NULL },
  73. { 6,(u8 *)"第四",NULL,NULL,NULL },
  74. { 6,(u8 *)"第五",NULL,NULL,NULL },
  75. { 6,(u8 *)"第六",NULL,NULL,NULL },
  76. { 6,(u8 *)"參數初始化",fun2,NULL,NULL },
  77. { 6,(u8 *)"讀取參數并顯示",fun3,NULL,NULL }
  78. };
  79. //第二級
  80. struct MenuItem Setmenu1[2]={
  81. { 2,(u8 *)"返回上一級",NULL,NULL,MainMenu },
  82. { 2,(u8 *)"確定",NULL,NULL,MainMenu },
  83. };
  84. struct MenuItem Setmenu2[] = {
  85. { 4,(u8 *)"返回上一級",NULL,NULL,MainMenu },
  86. { 3,(u8 *)"讀取參數",fun3,NULL,MainMenu },
  87. { 3,(u8 *)"設定長度",fun4,NULL,MainMenu },
  88. { 3,(u8 *)"確定",fun1,NULL,MainMenu } };
  89. struct MenuItem Setmenu3[] = {
  90. { 4,(u8 *)"返回上一級",NULL,NULL,MainMenu },
  91. { 3,(u8 *)"設定長度",fun5,NULL,MainMenu },
  92. { 3,(u8 *)"設定角度",fun6,NULL,MainMenu },
  93. { 3,(u8 *)"確定",NULL,NULL,MainMenu } };
  94. struct MenuItem* MenuPoint=MainMenu;//當前菜單

  95. void caidan_init(void)
  96. {
  97.         MainMenu[0].ChildrenMenus = Setmenu1;
  98.         MainMenu[1].ChildrenMenus = Setmenu2;
  99.         MainMenu[2].ChildrenMenus = Setmenu3;
  100.         selectItem_current =1;
  101.         selectItem_hidden  =0;
  102.         selectItem=selectItem_current+selectItem_hidden;
  103.         display(MenuPoint,selectItem_current,selectItem_hidden);
  104. }

  105. void display(struct MenuItem * MenuPoint,int selectItem_current,int selectItem_hidden)
  106. {
  107.         int j;
  108.         u16 x=16;
  109.         u16 y=0;
  110.         OLED_Show(0,selectItem_current*2-2,(u8 *)"->");
  111.         for ( j= selectItem_hidden; j < my_min(MenuPoint->MenuCount,linenumber+selectItem_hidden);j++)
  112.         {
  113.                 OLED_Show(x,y,MenuPoint[j].DisplayString);
  114.                 y+=2;
  115.         }
  116. }

  117. void caidan(void)
  118. {
  119.         if(key_num>0)
  120.         switch(key_num)
  121.         {
  122.                 case WKUP_PRES:
  123.                 {//上
  124.                         OLED_CLS();
  125.                         selectItem_current--;
  126.                         if (selectItem_current==0)
  127.                         {
  128.                                 if(selectItem_hidden>0)selectItem_hidden--;
  129.                                 selectItem_current++;
  130.                         }
  131.                         selectItem=selectItem_current+selectItem_hidden;
  132.                         display(MenuPoint,selectItem_current,selectItem_hidden);
  133.                 };break;
  134.                 case KEY1_PRES:
  135.                 {//下
  136.                         OLED_CLS();
  137.                         selectItem_current++;
  138.                         if(selectItem_current>linenumber)//當前的行數超過總行數
  139.                         {
  140.                                 if (selectItem_current+selectItem_hidden <= MenuPoint->MenuCount)
  141.                                         selectItem_hidden++;
  142.                                 selectItem_current--;
  143.                         }
  144.                         else if(selectItem_current>MenuPoint->MenuCount)selectItem_current--;
  145.                         selectItem=selectItem_current+selectItem_hidden;
  146.                         display(MenuPoint,selectItem_current,selectItem_hidden);
  147.                 };break;
  148.                 case KEY0_PRES:
  149.                 {//右 確認進入此項目
  150.                         if(selectItem== 1&&MenuPoint!=MainMenu)//滿足退回上一級條件
  151.                         {
  152.                                         OLED_CLS();
  153.                                         MenuPoint = MenuPoint[selectItem - 1].ParentMenus;
  154.                                         selectItem_current =1;
  155.                                         selectItem_hidden  =0;
  156.                                         //selectItem = 1;
  157.                                         display(MenuPoint,selectItem_current,selectItem_hidden);
  158.                         }
  159.                         else if (MenuPoint[selectItem - 1].ChildrenMenus != NULL)//判斷是否有下一級
  160.                         {                                
  161.                                 OLED_CLS();
  162.                                 MenuPoint = MenuPoint[selectItem - 1].ChildrenMenus;
  163.                                 selectItem_current =1;
  164.                                 selectItem_hidden  =0;
  165.                                 display(MenuPoint,selectItem_current,selectItem_hidden);
  166.                         }
  167.                         else if(MenuPoint[selectItem - 1].Subs != NULL)
  168.                                 MenuPoint[selectItem - 1].Subs();//功能函數執行
  169.                 };break;
  170.         }
  171. }
  172. void fun1()
  173. {
  174.         OLED_Show(16,0,(u8*)"fun1");
  175. }
  176. void fun2()//初始化參數
  177. {
  178.         rmydata.length1=1.23;
  179.         rmydata.length2=2.34;
  180.         rmydata.angle=10.2;
  181.         STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&rmydata,sizeof(rmydata));
  182. }
  183. void fun3()//讀取并顯示
  184. {
  185.         u8 key;
  186.         char str[10];
  187.         OLED_CLS();
  188.         STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&rmydata,sizeof(rmydata));
  189.         sprintf(str,"長度1:%.2f",(float)rmydata.length1);
  190.         OLED_Show(16,0,(u8*)str);
  191.         sprintf((char*)str,"長度2:%.2f",(float)rmydata.length2);
  192.         OLED_Show(16,2,(u8*)str);
  193.         sprintf((char*)str,"角度:%.2f",(float)rmydata.angle);
  194.         OLED_Show(16,4,(u8*)str);
  195.         while(1)
  196.         {
  197.                 key=KEY_Scan();
  198.                 delay_ms(20);
  199.                 if(key!=0)
  200.                 {
  201.                         OLED_CLS();
  202.                         display(MenuPoint,selectItem_current,selectItem_hidden);
  203.                         return;
  204.                 }
  205.         }
  206. }

  207. void fun4()
  208. {
  209.         char str[10];
  210.         u8 lengthwei[3],wei=2,jieshu=0;//0 個位 ,1小數點后1位  2小數點后2位
  211.         int current_length;
  212.         u8 i,key;
  213.         int time=0;
  214.         current_length=rmydata.length1*100;
  215.         lengthwei[0]=current_length/100;
  216.         lengthwei[1]=current_length%100/10;
  217.         lengthwei[2]=current_length%10;
  218.         OLED_CLS();
  219.         while(1)
  220.         {
  221.                 key=KEY_Scan();
  222.                 delay_ms(20);
  223.                 if(key!=0)
  224.                 {
  225.                         if(key==1)jieshu=!jieshu;
  226.                         else if(key==2)
  227.                         {
  228.                                 if(jieshu==0)wei++;
  229.                                 else if(wei<=2) lengthwei[wei]--;
  230.                         }
  231.                         else if(key==3)
  232.                         {
  233.                                 OLED_CLS();
  234.                                 display(MenuPoint,selectItem_current,selectItem_hidden);
  235.                                 rmydata.length1=current_length*0.01;
  236.                                 STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&rmydata,sizeof(rmydata));
  237.                                 return;
  238.                         }
  239.                         else if(key==4)
  240.                         {
  241.                                 if(jieshu==0)wei--;
  242.                                 else if(wei<=2) lengthwei[wei]++;
  243.                         }
  244.                         if(wei>=3)wei=2;
  245.                         OLED_CLS();
  246.                 }         
  247.                 time++;      
  248.                 if(time<=20)
  249.                 {//.前一位的正下方顯示^
  250.                         if(wei==0)OLED_Show(8*5,2,(u8*)"^");
  251.                         //.后的某一位正下方顯示↑
  252.                         else OLED_Show(8*6+8*wei,2,(u8*)"^");
  253.                 }
  254.                 else if(time<=40){if(jieshu==0)OLED_Show(0,2,(u8*)"                ");}
  255.                 else time=0;
  256.                 for(i=0;i<3;i++)if(lengthwei[wei]>=10)lengthwei[wei]=9;        
  257.                 current_length=lengthwei[0]*100+lengthwei[1]*10+lengthwei[2];
  258.                 sprintf((char*)str,"長度:%.2f",current_length*0.01);
  259.                 OLED_Show(0,0,(u8*)str);
  260.         }
  261. }
  262. void fun5()
  263. {
  264.         char str[10];
  265.         u8 lengthwei[3],wei=2,jieshu=0;//0 個位 ,1小數點后1位  2小數點后2位
  266.         int current_length;
  267.         u8 i,key;
  268.         int time=0;
  269.         current_length=rmydata.length2*100;
  270.         lengthwei[0]=current_length/100;
  271.         lengthwei[1]=current_length%100/10;
  272.         lengthwei[2]=current_length%10;
  273.         OLED_CLS();
  274.         while(1)
  275.         {
  276.                 key=KEY_Scan();
  277.                 delay_ms(20);
  278.                 if(key!=0)
  279.                 {
  280.                         if(key==1)jieshu=!jieshu;
  281.                         else if(key==2)
  282.                         {
  283.                                 if(jieshu==0)wei++;
  284.                                 else if(wei<=2) lengthwei[wei]--;
  285.                         }
  286.                         else if(key==3)
  287.                         {
  288.                                 OLED_CLS();
  289.                                 display(MenuPoint,selectItem_current,selectItem_hidden);
  290.                                 rmydata.length2=current_length*0.01;
  291.                                 STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&rmydata,sizeof(rmydata));
  292.                                 return;
  293.                         }
  294.                         else if(key==4)
  295.                         {
  296.                                 if(jieshu==0)wei--;
  297.                                 else if(wei<=2) lengthwei[wei]++;
  298.                         }
  299.                         if(wei>=3)wei=2;
  300.                         OLED_CLS();
  301.                 }
  302.                 time++;
  303.                 if(time<=20)
  304.                 {//.前一位的正下方顯示^
  305.                         if(wei==0)OLED_Show(8*5,2,(u8*)"^");
  306.                         //.后的某一位正下方顯示↑
  307.                         else OLED_Show(8*6+8*wei,2,(u8*)"^");
  308.                 }
  309.                 else if(time<=40){if(jieshu==0)OLED_Show(0,2,(u8*)"                ");}
  310.                 else time=0;
  311.                 for(i=0;i<3;i++)if(lengthwei[wei]>=10)lengthwei[wei]=9;        
  312.                 current_length=lengthwei[0]*100+lengthwei[1]*10+lengthwei[2];
  313.                 sprintf((char*)str,"長度:%.2f",current_length*0.01);
  314.                 OLED_Show(0,0,(u8*)str);
  315.         }
  316. }

  317. void fun6()
  318. {
  319.         char str[10];
  320.         u8 lengthwei[3],wei=2,jieshu=0;//0 個位 ,1小數點后1位  2小數點后2位
  321.         int current_angle;
  322.         u8 i,key;
  323.         int time=0;
  324.         current_angle=rmydata.angle*10;
  325.         lengthwei[0]=current_angle/100;
  326.         lengthwei[1]=current_angle%100/10;
  327.         lengthwei[2]=current_angle%10;
  328.         OLED_CLS();
  329.         //key=5;
  330.         while(1)
  331.         {
  332.                 key=KEY_Scan();
  333.                 delay_ms(20);
  334.                 if(key!=0)
  335.                 {
  336.                         if(key==1)jieshu=!jieshu;
  337.                         else if(key==2)
  338.                         {
  339.                                 if(jieshu==0)wei++;
  340.                                 else if(wei<=2) lengthwei[wei]--;
  341.                         }
  342.                         else if(key==3)
  343.                         {
  344.                                 OLED_CLS();
  345.                                 display(MenuPoint,selectItem_current,selectItem_hidden);
  346.                                 rmydata.angle=current_angle*0.1;
  347.                                 STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&rmydata,sizeof(rmydata));
  348.                                 return;
  349.                         }
  350.                         else if(key==4)
  351.                         {
  352.                                 if(jieshu==0)wei--;
  353.                                 else if(wei<=2) lengthwei[wei]++;
  354.                         }
  355.                         if(wei>=3)wei=2;
  356.                         OLED_CLS();
  357.                 }
  358.                 time++;
  359.                 if(time<=20)
  360.                 {
  361.                         if(wei==2)OLED_Show(8*8,2,(u8*)"^");
  362.                         else OLED_Show(8*5+8*wei,2,(u8*)"^");
  363.                 }
  364.                 else if(time<=40){if(jieshu==0)OLED_Show(0,2,(u8*)"                ");}
  365.                 else time=0;
  366.                 for(i=0;i<3;i++)if(lengthwei[wei]>=10)lengthwei[wei]=9;        
  367.                 current_angle=lengthwei[0]*100+lengthwei[1]*10+lengthwei[2];
  368.                 sprintf((char*)str,"角度:%2.1f",current_angle*0.1);
  369.                 OLED_Show(0,0,(u8 *)str);
  370.         }
  371. }
復制代碼

Keil代碼下載: 菜單+行數限定+參數設定 - 4按鍵 - 最后.7z (187.93 KB, 下載次數: 169)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1014699 發表于 2022-4-30 19:47 | 只看該作者
請問這個菜單界面效果是啥樣的
回復

使用道具 舉報

板凳
ID:861056 發表于 2023-8-1 17:18 | 只看該作者
bbbba 發表于 2022-4-30 19:47
請問這個菜單界面效果是啥樣的

多級菜單顯示,你可以修改里面的代碼,換成自己想要的頁面,很簡單
回復

使用道具 舉報

地板
ID:1087948 發表于 2023-8-2 14:32 | 只看該作者
問一下這個是針對于4腳還是3腳
回復

使用道具 舉報

5#
ID:861056 發表于 2023-10-13 14:08 | 只看該作者
liyonghua111 發表于 2023-8-2 14:32
問一下這個是針對于4腳還是3腳

什么意思
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日夜夜免费精品 | 色综合一区二区 | 91精品国产91久久久久久吃药 | 免费观看一级特黄欧美大片 | 国产成人精品亚洲日本在线观看 | 色综合久久久 | 日韩一级免费观看 | 天堂av中文 | 亚洲一区二区三区四区在线观看 | 国产精品影视在线观看 | 中文字幕视频在线 | 日本三级在线 | 成人在线免费观看 | 免费国产精品久久久久久 | 亚洲国产一区二区视频 | jav成人av免费播放 | 91看片视频 | 久久久久国产 | 玖玖视频免费 | 国产精品一区一区 | av毛片在线播放 | 日韩国产在线 | 免费国产精品久久久久久 | 国产激情一区二区三区 | 一级毛片在线播放 | 永久免费在线观看 | 人人干人人干人人干 | 久久久久久久久久久蜜桃 | 黄色大片免费观看 | 国内久久精品 | 亚洲精品久久久久久国产精华液 | 欧美一区二区三区精品免费 | 天天影视网天天综合色在线播放 | 91精品国产乱码久久久久久久久 | 亚洲国产精品一区 | 国产在线97 | 国产成人99久久亚洲综合精品 | 国内精品视频在线观看 | 国产免费观看一区 | 91精品国产91久久久久游泳池 | 国产成人99久久亚洲综合精品 |