菜單+行數限定+參數設定 - 4按鍵
用于多級菜單顯示完成各項功能選擇
main函數
- //字庫放在這里面,中文用多少生成多少#include "codetab.h"
- //PB6 -- SCL; PB7 -- SDA */
- #include "delay.h"
- #include "stm32f10x.h"
- #include "OLED_I2C.h"
- #include "exti.h"
- #include "stdio.h"
- #include "key.h"
- #include "stmflash.h"
- #define FLASH_SAVE_ADDR 0X08009000 //設置FLASH 保存地址(必須為偶數,且其值要大于本代碼所占用FLASH的大小+0X08000000)
- //C8T6和CBT6(僅FLASH容量有區別)一般是在同一生產線生產的,
- //如果CBT6的FLASH容量部分不能使用那么就作為C8T6
- //36864= 0X9 000
- //64K=0X10 000
- #define linenumber 4
- struct MenuItem
- {
- short MenuCount;//當前菜單項目總數
- u8 *DisplayString;//當前項目要顯示的字符
- void(*Subs)();//選擇某一菜單后執行的功能函數
- struct MenuItem *ChildrenMenus;//當前項目的子菜單
- struct MenuItem *ParentMenus;//當前項目的父菜單
- };
- struct mydata
- {
- float length1;
- float length2;
- float angle;
- };
- struct mydata rmydata;
- int selectItem_current,selectItem_hidden,selectItem;
- int key_num=0;
- int juli,jiaodu;
- void caidan(void);
- int key_scan(void);//是否按下確認鍵
- void display(struct MenuItem * MenuPoint,int selectItem_current,int selectItem_hidden);
- void caidan_init(void);
- void fun1(void);
- void fun2(void);
- void fun3(void);
- void fun4(void);
- void fun5(void);
- void fun6(void);
- int main(void)
- {
- delay_init(); //延時函數初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
- I2C_Configuration();
- OLED_Init();
- OLED_CLS();
- KEY_Init();
- caidan_init();
- //fun2();//第一次下載需要去掉fun2()前面的注釋,不然程序直接卡死
- STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&rmydata,sizeof(rmydata));
- while(1)
- {
- key_num=KEY_Scan();
- caidan();
- delay_ms(20);
- }
- }
- int my_min(int a,int b)
- {
- if (a<b)return a;
- return b;
- }
- //由于定義從上往下,數組定義時子類都為NULL
- //第一級
- struct MenuItem MainMenu[] = {
- { 8,(u8 *)"第一",NULL,NULL,NULL },
- { 6,(u8 *)"第二",NULL,NULL,NULL },
- { 6,(u8 *)"第三",NULL,NULL,NULL },
- { 6,(u8 *)"第四",NULL,NULL,NULL },
- { 6,(u8 *)"第五",NULL,NULL,NULL },
- { 6,(u8 *)"第六",NULL,NULL,NULL },
- { 6,(u8 *)"參數初始化",fun2,NULL,NULL },
- { 6,(u8 *)"讀取參數并顯示",fun3,NULL,NULL }
- };
- //第二級
- struct MenuItem Setmenu1[2]={
- { 2,(u8 *)"返回上一級",NULL,NULL,MainMenu },
- { 2,(u8 *)"確定",NULL,NULL,MainMenu },
- };
- struct MenuItem Setmenu2[] = {
- { 4,(u8 *)"返回上一級",NULL,NULL,MainMenu },
- { 3,(u8 *)"讀取參數",fun3,NULL,MainMenu },
- { 3,(u8 *)"設定長度",fun4,NULL,MainMenu },
- { 3,(u8 *)"確定",fun1,NULL,MainMenu } };
- struct MenuItem Setmenu3[] = {
- { 4,(u8 *)"返回上一級",NULL,NULL,MainMenu },
- { 3,(u8 *)"設定長度",fun5,NULL,MainMenu },
- { 3,(u8 *)"設定角度",fun6,NULL,MainMenu },
- { 3,(u8 *)"確定",NULL,NULL,MainMenu } };
- struct MenuItem* MenuPoint=MainMenu;//當前菜單
- void caidan_init(void)
- {
- MainMenu[0].ChildrenMenus = Setmenu1;
- MainMenu[1].ChildrenMenus = Setmenu2;
- MainMenu[2].ChildrenMenus = Setmenu3;
- selectItem_current =1;
- selectItem_hidden =0;
- selectItem=selectItem_current+selectItem_hidden;
- display(MenuPoint,selectItem_current,selectItem_hidden);
- }
- void display(struct MenuItem * MenuPoint,int selectItem_current,int selectItem_hidden)
- {
- int j;
- u16 x=16;
- u16 y=0;
- OLED_Show(0,selectItem_current*2-2,(u8 *)"->");
- for ( j= selectItem_hidden; j < my_min(MenuPoint->MenuCount,linenumber+selectItem_hidden);j++)
- {
- OLED_Show(x,y,MenuPoint[j].DisplayString);
- y+=2;
- }
- }
- void caidan(void)
- {
- if(key_num>0)
- switch(key_num)
- {
- case WKUP_PRES:
- {//上
- OLED_CLS();
- selectItem_current--;
- if (selectItem_current==0)
- {
- if(selectItem_hidden>0)selectItem_hidden--;
- selectItem_current++;
- }
- selectItem=selectItem_current+selectItem_hidden;
- display(MenuPoint,selectItem_current,selectItem_hidden);
- };break;
- case KEY1_PRES:
- {//下
- OLED_CLS();
- selectItem_current++;
- if(selectItem_current>linenumber)//當前的行數超過總行數
- {
- if (selectItem_current+selectItem_hidden <= MenuPoint->MenuCount)
- selectItem_hidden++;
- selectItem_current--;
- }
- else if(selectItem_current>MenuPoint->MenuCount)selectItem_current--;
- selectItem=selectItem_current+selectItem_hidden;
- display(MenuPoint,selectItem_current,selectItem_hidden);
- };break;
- case KEY0_PRES:
- {//右 確認進入此項目
- if(selectItem== 1&&MenuPoint!=MainMenu)//滿足退回上一級條件
- {
- OLED_CLS();
- MenuPoint = MenuPoint[selectItem - 1].ParentMenus;
- selectItem_current =1;
- selectItem_hidden =0;
- //selectItem = 1;
- display(MenuPoint,selectItem_current,selectItem_hidden);
- }
- else if (MenuPoint[selectItem - 1].ChildrenMenus != NULL)//判斷是否有下一級
- {
- OLED_CLS();
- MenuPoint = MenuPoint[selectItem - 1].ChildrenMenus;
- selectItem_current =1;
- selectItem_hidden =0;
- display(MenuPoint,selectItem_current,selectItem_hidden);
- }
- else if(MenuPoint[selectItem - 1].Subs != NULL)
- MenuPoint[selectItem - 1].Subs();//功能函數執行
- };break;
- }
- }
- void fun1()
- {
- OLED_Show(16,0,(u8*)"fun1");
- }
- void fun2()//初始化參數
- {
- rmydata.length1=1.23;
- rmydata.length2=2.34;
- rmydata.angle=10.2;
- STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&rmydata,sizeof(rmydata));
- }
- void fun3()//讀取并顯示
- {
- u8 key;
- char str[10];
- OLED_CLS();
- STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&rmydata,sizeof(rmydata));
- sprintf(str,"長度1:%.2f",(float)rmydata.length1);
- OLED_Show(16,0,(u8*)str);
- sprintf((char*)str,"長度2:%.2f",(float)rmydata.length2);
- OLED_Show(16,2,(u8*)str);
- sprintf((char*)str,"角度:%.2f",(float)rmydata.angle);
- OLED_Show(16,4,(u8*)str);
- while(1)
- {
- key=KEY_Scan();
- delay_ms(20);
- if(key!=0)
- {
- OLED_CLS();
- display(MenuPoint,selectItem_current,selectItem_hidden);
- return;
- }
- }
- }
- void fun4()
- {
- char str[10];
- u8 lengthwei[3],wei=2,jieshu=0;//0 個位 ,1小數點后1位 2小數點后2位
- int current_length;
- u8 i,key;
- int time=0;
- current_length=rmydata.length1*100;
- lengthwei[0]=current_length/100;
- lengthwei[1]=current_length%100/10;
- lengthwei[2]=current_length%10;
- OLED_CLS();
- while(1)
- {
- key=KEY_Scan();
- delay_ms(20);
- if(key!=0)
- {
- if(key==1)jieshu=!jieshu;
- else if(key==2)
- {
- if(jieshu==0)wei++;
- else if(wei<=2) lengthwei[wei]--;
- }
- else if(key==3)
- {
- OLED_CLS();
- display(MenuPoint,selectItem_current,selectItem_hidden);
- rmydata.length1=current_length*0.01;
- STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&rmydata,sizeof(rmydata));
- return;
- }
- else if(key==4)
- {
- if(jieshu==0)wei--;
- else if(wei<=2) lengthwei[wei]++;
- }
- if(wei>=3)wei=2;
- OLED_CLS();
- }
- time++;
- if(time<=20)
- {//.前一位的正下方顯示^
- if(wei==0)OLED_Show(8*5,2,(u8*)"^");
- //.后的某一位正下方顯示↑
- else OLED_Show(8*6+8*wei,2,(u8*)"^");
- }
- else if(time<=40){if(jieshu==0)OLED_Show(0,2,(u8*)" ");}
- else time=0;
- for(i=0;i<3;i++)if(lengthwei[wei]>=10)lengthwei[wei]=9;
- current_length=lengthwei[0]*100+lengthwei[1]*10+lengthwei[2];
- sprintf((char*)str,"長度:%.2f",current_length*0.01);
- OLED_Show(0,0,(u8*)str);
- }
- }
- void fun5()
- {
- char str[10];
- u8 lengthwei[3],wei=2,jieshu=0;//0 個位 ,1小數點后1位 2小數點后2位
- int current_length;
- u8 i,key;
- int time=0;
- current_length=rmydata.length2*100;
- lengthwei[0]=current_length/100;
- lengthwei[1]=current_length%100/10;
- lengthwei[2]=current_length%10;
- OLED_CLS();
- while(1)
- {
- key=KEY_Scan();
- delay_ms(20);
- if(key!=0)
- {
- if(key==1)jieshu=!jieshu;
- else if(key==2)
- {
- if(jieshu==0)wei++;
- else if(wei<=2) lengthwei[wei]--;
- }
- else if(key==3)
- {
- OLED_CLS();
- display(MenuPoint,selectItem_current,selectItem_hidden);
- rmydata.length2=current_length*0.01;
- STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&rmydata,sizeof(rmydata));
- return;
- }
- else if(key==4)
- {
- if(jieshu==0)wei--;
- else if(wei<=2) lengthwei[wei]++;
- }
- if(wei>=3)wei=2;
- OLED_CLS();
- }
- time++;
- if(time<=20)
- {//.前一位的正下方顯示^
- if(wei==0)OLED_Show(8*5,2,(u8*)"^");
- //.后的某一位正下方顯示↑
- else OLED_Show(8*6+8*wei,2,(u8*)"^");
- }
- else if(time<=40){if(jieshu==0)OLED_Show(0,2,(u8*)" ");}
- else time=0;
- for(i=0;i<3;i++)if(lengthwei[wei]>=10)lengthwei[wei]=9;
- current_length=lengthwei[0]*100+lengthwei[1]*10+lengthwei[2];
- sprintf((char*)str,"長度:%.2f",current_length*0.01);
- OLED_Show(0,0,(u8*)str);
- }
- }
- void fun6()
- {
- char str[10];
- u8 lengthwei[3],wei=2,jieshu=0;//0 個位 ,1小數點后1位 2小數點后2位
- int current_angle;
- u8 i,key;
- int time=0;
- current_angle=rmydata.angle*10;
- lengthwei[0]=current_angle/100;
- lengthwei[1]=current_angle%100/10;
- lengthwei[2]=current_angle%10;
- OLED_CLS();
- //key=5;
- while(1)
- {
- key=KEY_Scan();
- delay_ms(20);
- if(key!=0)
- {
- if(key==1)jieshu=!jieshu;
- else if(key==2)
- {
- if(jieshu==0)wei++;
- else if(wei<=2) lengthwei[wei]--;
- }
- else if(key==3)
- {
- OLED_CLS();
- display(MenuPoint,selectItem_current,selectItem_hidden);
- rmydata.angle=current_angle*0.1;
- STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&rmydata,sizeof(rmydata));
- return;
- }
- else if(key==4)
- {
- if(jieshu==0)wei--;
- else if(wei<=2) lengthwei[wei]++;
- }
- if(wei>=3)wei=2;
- OLED_CLS();
- }
- time++;
- if(time<=20)
- {
- if(wei==2)OLED_Show(8*8,2,(u8*)"^");
- else OLED_Show(8*5+8*wei,2,(u8*)"^");
- }
- else if(time<=40){if(jieshu==0)OLED_Show(0,2,(u8*)" ");}
- else time=0;
- for(i=0;i<3;i++)if(lengthwei[wei]>=10)lengthwei[wei]=9;
- current_angle=lengthwei[0]*100+lengthwei[1]*10+lengthwei[2];
- sprintf((char*)str,"角度:%2.1f",current_angle*0.1);
- OLED_Show(0,0,(u8 *)str);
- }
- }
復制代碼
Keil代碼下載:
菜單+行數限定+參數設定 - 4按鍵 - 最后.7z
(187.93 KB, 下載次數: 169)
2022-3-5 17:53 上傳
點擊文件名下載附件
代碼文件 下載積分: 黑幣 -5
|