久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32F1C8T6 OLED12864菜單源程序 行數限定+參數設定
[打印本頁]
作者:
nuonuoa
時間:
2022-3-5 12:14
標題:
STM32F1C8T6 OLED12864菜單源程序 行數限定+參數設定
菜單+行數限定+參數設定 - 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
作者:
bbbba
時間:
2022-4-30 19:47
請問這個菜單界面效果是啥樣的
作者:
nuonuoa
時間:
2023-8-1 17:18
bbbba 發表于 2022-4-30 19:47
請問這個菜單界面效果是啥樣的
多級菜單顯示,你可以修改里面的代碼,換成自己想要的頁面,很簡單
作者:
liyonghua111
時間:
2023-8-2 14:32
問一下這個是針對于4腳還是3腳
作者:
nuonuoa
時間:
2023-10-13 14:08
liyonghua111 發表于 2023-8-2 14:32
問一下這個是針對于4腳還是3腳
什么意思
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
在线一区二区国产
|
国产免费一区二区
|
日韩精品一区二区三区中文字幕
|
久久丁香
|
91av在线免费播放
|
中文字幕第一页在线
|
www.色婷婷
|
一二三四在线视频观看社区
|
国产欧美性成人精品午夜
|
亚洲精品一级
|
99精品国产一区二区青青牛奶
|
精品国产免费人成在线观看
|
国产激情视频在线免费观看
|
亚洲色图在线观看
|
999久久久国产精品 欧美成人h版在线观看
|
日韩一区二区三区在线视频
|
日本视频在线播放
|
日韩中文在线观看
|
国产精品日韩一区二区
|
久草热视频
|
99精品观看
|
成人免费在线播放
|
午夜精
|
男女视频在线观看免费
|
久久九九免费
|
天天拍天天色
|
日韩成人在线观看
|
人人爽人人爽人人片av
|
狠狠的干狠狠的操
|
久久6视频
|
午夜专区
|
免费在线成人
|
国产精品一区二区在线
|
日韩国产欧美一区
|
亚洲福利在线观看
|
亚洲欧美日韩系列
|
免费看黄色小视频
|
aaaaa毛片
|
在线播放国产一区二区三区
|
欧美精品一区在线
|
亚洲精品一区二区三区中文字幕
|