久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
OLED四行多級(jí)菜單STM32程序
[打印本頁(yè)]
作者:
fgth5s
時(shí)間:
2017-7-20 15:56
標(biāo)題:
OLED四行多級(jí)菜單STM32程序
單片機(jī)源程序如下:
/***
*****************************************************************************
* @file menu.c
* @author 原作:張子墨
* @version V1.0
* @brief OLED四行多級(jí)菜單
*****************************************************************************
***/
#include "menu.h"
#include "oled.h"
#include "key.h"
#include "delay.h"
#include "text.h"
#include "fontupd.h"
/*菜單結(jié)構(gòu)定義*/
struct Option
{
unsigned char KeyLevel; //菜單選項(xiàng)所屬菜單表號(hào)
unsigned char EnterIndex; //選項(xiàng)進(jìn)入索引號(hào)
unsigned char CancelIndex; //選項(xiàng)退出索引號(hào)
unsigned char *KeyWord; //菜單選項(xiàng)文字描述指針
unsigned char WordMete; //菜單選項(xiàng)描述文字字節(jié)數(shù)
};
/**
* 具體菜單選項(xiàng)定義,定義一個(gè)結(jié)構(gòu)數(shù)組
* 存儲(chǔ)在編碼區(qū),節(jié)省內(nèi)存RAM
**/
struct Option sOption[OPTIONMETE] =
{
/*菜單表號(hào) 進(jìn)入索引 退出索引 菜單選項(xiàng)文字 菜單選項(xiàng)文字字節(jié)數(shù)*/
{0, OPTIONMETE - 1, 0, "1.亮度調(diào)節(jié)", 10},//0
{0, 6, 1, "2.時(shí)間設(shè)置", 10},//1
{0, OPTIONMETE - 1, 2, "3.系統(tǒng)檢測(cè)", 10},//2
{0, OPTIONMETE - 1, 3, "4.修改密碼", 10},//3
{0, OPTIONMETE - 1, 4, "5.幫助說(shuō)明", 10},//4
{0, OPTIONMETE - 1, 5, "6.系統(tǒng)信息", 12},//5
{1, OPTIONMETE - 1, 1, "1.時(shí)鐘設(shè)置", 10},//6
{1, OPTIONMETE - 1, 1, "2.日期設(shè)置", 10},//7
};
/*菜單表分類數(shù)組*/
unsigned char Level[MENULEVEL][3] =
{
/*每層表單對(duì)應(yīng)的開始索引 結(jié)束索引 選項(xiàng)數(shù)目*/
{0, 5, 6},
{6, 7, 2},
};
/*菜單索引定義*/
unsigned char FirstLineDisIndex = 0; //屏幕第一行顯示的索引號(hào)
unsigned char SelectLine_L = 1; //原來(lái)選中行
unsigned char SelectLine = 1; //當(dāng)前選擇的行
unsigned char SelectIndex = 0; //當(dāng)前選定行對(duì)應(yīng)的索引號(hào)
unsigned char LastIndex = 0; //進(jìn)入功能函數(shù)前的索引號(hào),判斷具體功能使用
/**
* @name void Select_Line(unsigned char line, unsigned char clear)
* @brief 選中行反白顯示
* @param line:選中行 clear:1,選中行清除反白 0,選中行反白顯示
* @retval none
*/
void Select_Line(unsigned char line, unsigned char clear)
{
switch (line) //選擇行
{
case 1:
OLED_Fill(0, 0, 127, 15, 0); //清除原來(lái)的顯示
Show_Str(0, 0, sOption[FirstLineDisIndex].WordMete*8, 16, \
sOption[FirstLineDisIndex].KeyWord, 16, clear);
break;
case 2:
OLED_Fill(0, 16, 127, 31, 0); //清除原來(lái)的顯示
Show_Str(0, 16, sOption[FirstLineDisIndex+1].WordMete*8, 16, \
sOption[FirstLineDisIndex+1].KeyWord, 16, clear);
break;
case 3:
OLED_Fill(0, 32, 127, 47, 0); //清除原來(lái)的顯示
Show_Str(0, 32, sOption[FirstLineDisIndex+2].WordMete*8, 16, \
sOption[FirstLineDisIndex+2].KeyWord, 16, clear);
break;
case 4:
OLED_Fill(0, 48, 127, 63, 0); //清除原來(lái)的顯示
Show_Str(0, 48, sOption[FirstLineDisIndex+3].WordMete*8, 16, \
sOption[FirstLineDisIndex+3].KeyWord, 16, clear);
break;
default :
break;
}
delay_ms(10);
}
/**
* @name void Display_OLEDMenu (void)
* @brief 刷新菜單功能函數(shù)
* @param none
* @retval none
*/
void Display_OLEDMenu (void)
{
unsigned char LineMete = Level[sOption[SelectIndex].KeyLevel][2]; //循環(huán)量,顯示行數(shù)
OLED_Fill(0, 0, 128, 64, 0); //清屏,否則會(huì)出現(xiàn)一些亂碼
delay_ms(10);
do //分別顯示各行菜單項(xiàng)
{
OLED_Fill(0, 0, 127, 15, 0);
Show_Str(0, 0, sOption[FirstLineDisIndex].WordMete*8, 16, \
sOption[FirstLineDisIndex].KeyWord, 16, 1);
if(--LineMete == 0) break;
OLED_Fill(0, 16, 127, 31, 0);
Show_Str(0, 16, sOption[FirstLineDisIndex+1].WordMete*8, 16, \
sOption[FirstLineDisIndex+1].KeyWord, 16, 1);
if(--LineMete == 0) break;
OLED_Fill(0, 32, 127, 47, 0);
Show_Str(0, 32, sOption[FirstLineDisIndex+2].WordMete*8, 16, \
sOption[FirstLineDisIndex+2].KeyWord, 16, 1);
if(--LineMete == 0) break;
OLED_Fill(0, 48, 127, 63, 0);
Show_Str(0, 48, sOption[FirstLineDisIndex+3].WordMete*8, 16, \
sOption[FirstLineDisIndex+3].KeyWord, 16, 1);
}
while(0);
Select_Line(SelectLine_L, 1); //消除上一行反白
Select_Line(SelectLine, 0); //填充所需反白
}
/**
* @name bool MenuLevelStart (void)
* @brief 判斷當(dāng)前索引是否是表單第一項(xiàng)功能函數(shù)
* @param none
* @retval 返回Bit標(biāo)志,是第一項(xiàng)返回TURE,不是返回FALSE
*/
bool MenuLevelStart (void)
{
unsigned char i = MENULEVEL;
do
{
i--;
if(SelectIndex == Level[i][0])
return TURE;
}
while(i);
return FALSE;
}
/**
* @name bool MenuLevelEnd (void)
* @brief 判斷當(dāng)前索引是否是表單最后一項(xiàng)功能函數(shù)
* @param none
* @retval 返回Bit標(biāo)志,是最后一項(xiàng)返回TURE,不是返回FALSE
*/
bool MenuLevelEnd (void)
{
unsigned char i = MENULEVEL;
do
{
i--;
if(SelectIndex == Level[i][1])
return TURE;
}
while(i);
return FALSE;
}
/**
* @name void MenuUpOneOption (void)
* @brief 菜單上移一項(xiàng)函數(shù)
* @param none
* @retval none
*/
void MenuUpOneOption (void)
{
if(MenuLevelStart ()) //如果當(dāng)前為表單第一項(xiàng)
{
if(Level[sOption[SelectIndex].KeyLevel][2] >= 4) //并且表單中選項(xiàng)數(shù)目大于等于4個(gè)
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][1] - 3; //第一行顯示索引號(hào)為倒數(shù)第四項(xiàng)
SelectIndex = Level[sOption[SelectIndex].KeyLevel][1]; //選擇索引為表單最后一項(xiàng)
SelectLine_L = SelectLine; //記錄原來(lái)行
SelectLine = 4; //標(biāo)記選擇行為第四行
}
else //如果選項(xiàng)數(shù)目并不大于四個(gè)
{
SelectIndex = Level[sOption[SelectIndex].KeyLevel][1]; //選擇索引為當(dāng)前表單最后一個(gè)
SelectLine_L = SelectLine; //記錄原來(lái)行
SelectLine = Level[sOption[SelectIndex].KeyLevel][2]; //顯示行表單數(shù)目(最后一個(gè))
}
}
else //如果當(dāng)前不是開始索引
{
if(SelectLine == 1) //并且已經(jīng)在屏幕最上邊一行
{
FirstLineDisIndex--; //顯示索引上移
SelectIndex--; //選擇索引自減
SelectLine_L = SelectLine; //記錄原來(lái)行
SelectLine = 1; //選擇行還是第一行
}
else //如果不是第一行
{
SelectLine_L = SelectLine; //記錄原來(lái)行
SelectLine--; //選擇行自減
SelectIndex--; //選擇索引自減
}
}
Display_OLEDMenu(); //刷新屏幕顯示
}
/**
* @name void MenuDownOneOption (void)
* @brief 菜單下移一項(xiàng)函數(shù)
* @param none
* @retval none
*/
void MenuDownOneOption (void)
{
if(MenuLevelEnd ()) //如果當(dāng)前是表單最后一個(gè)索引
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][0]; //第一行顯示索引為表單第一個(gè)選項(xiàng)
SelectIndex = Level[sOption[SelectIndex].KeyLevel][0]; //選擇索引為表單第一個(gè)選項(xiàng)索引
SelectLine_L = SelectLine; //記錄原來(lái)行
SelectLine = 1; //選擇行為第一行
}
else //如果不是最后的索引
{
if(SelectLine != 4) //如果當(dāng)前不是屏幕最底行
{
SelectIndex++; //選擇索引自加
SelectLine_L = SelectLine; //記錄原來(lái)行
SelectLine++; //選擇行下移
}
else //如果是屏幕最低行
{
FirstLineDisIndex++; //第一行顯示下移
SelectIndex++; //選擇索引自加
}
}
Display_OLEDMenu(); //刷新屏幕顯示
}
/**
* @name void MenuEnterOption (void)
* @brief 進(jìn)入某項(xiàng)功能函數(shù)
* @param none
* @retval none
*/
void MenuEnterOption (void)
{
LastIndex = SelectIndex; //標(biāo)記進(jìn)入前的索引號(hào)(以便判斷具體功能)
SelectIndex = sOption[SelectIndex].EnterIndex; //更新選擇索引為之前索引號(hào)對(duì)應(yīng)進(jìn)入索引
if(SelectIndex != OPTIONMETE - 1) //如果當(dāng)前索引不是功能選擇索引
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][0]; //第一行顯示為進(jìn)入表單第一項(xiàng)
SelectLine_L = SelectLine;
SelectLine = 1; //設(shè)定第一行為選擇行
Display_OLEDMenu (); //刷新菜單
}
else
{
FunctionAction (); //如果是功能選擇項(xiàng),進(jìn)入功能分支判斷函數(shù)
}
}
/**
* @name void MenuCancelOption (void)
* @brief 菜單退出功能函數(shù)
* @param none
* @retval none
*/
void MenuCancelOption (void)
{
if(SelectIndex != OPTIONMETE - 1) //如果不是從功能返回
{
SelectIndex = sOption[SelectIndex].CancelIndex; //選擇索引為選項(xiàng)返回索引
}
else //如果是從功能返回
{
SelectIndex = LastIndex; //索引等于進(jìn)入前保存索引
}
if(Level[sOption[SelectIndex].KeyLevel][2] >= 4) //如果返回表單選項(xiàng)數(shù)目大于4個(gè)
{
if(SelectIndex > Level[sOption[SelectIndex].KeyLevel][1] - 3) //根據(jù)返回選項(xiàng)確定顯示首項(xiàng)
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][1] - 3;
SelectLine_L = SelectLine;
SelectLine = 4 - (Level[sOption[SelectIndex].KeyLevel][1] - SelectIndex);
}
else //一般顯示方式
{
FirstLineDisIndex = SelectIndex; //第一行顯示索引
SelectLine_L = SelectLine;
SelectLine = 1; //選擇第一行
}
}
else //如果返回表單選項(xiàng)數(shù)目不足4個(gè)
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][0]; //第一行顯示索引為表單第一項(xiàng)
SelectLine_L = SelectLine;
SelectLine = SelectIndex - Level[sOption[SelectIndex].KeyLevel][0] + 1; //選擇行標(biāo)志為當(dāng)前選擇索引對(duì)應(yīng)行
}
Display_OLEDMenu (); //刷新菜單
}
/**
* @name void ShutDown (void)
* @brief 某一項(xiàng)功能函數(shù) 實(shí)際應(yīng)該改為實(shí)際功能函數(shù)
* @param none
* @retval none
*/
void SystemState (void)
{
OLED_Clear(); //清屏
delay_ms(1);
Show_Str(16, 29, 128, 16, "系統(tǒng)版本V1.0", 16, 1);
}
void System_Help (void)
{
OLED_Clear(); //清屏
delay_ms(1);
Show_Str(0, 0, 128, 16, "1.上下鍵選擇", 16, 1);
Show_Str(0, 16, 128, 16, "2.左鍵確定", 16, 1);
Show_Str(0, 32, 128, 16, "3.右鍵退出", 16, 1);
}
void SystemTest (void)
{
OLED_Clear(); //清屏
delay_ms(1);
if (font_init())
{
OLED_Fill(0, 16, 128, 31, 0);
Show_Str(32, 16, 128, 16, "字庫(kù)錯(cuò)誤", 16, 1);
}
else
{
OLED_Fill(0, 16, 128, 31, 0);
Show_Str(32, 16, 128, 16, "字庫(kù)正常", 16, 1);
}
}
u16 radio = 0x7F;
void OLED_Light (void)
{
u8 flag = 1;
OLED_Clear(); //清屏
delay_ms(1);
Show_Str(32, 0, 128, 16, "亮度調(diào)節(jié)", 16, 1);
OLED_DrawRectangle(0, 16, 93, 31, 1); //畫進(jìn)度條的邊框
while (1)
{
/*限制進(jìn)度條的范圍*/
if (radio <= 2)
{
radio = 2;
}
else if (radio >= 255)
{
radio = 255;
}
OLED_Write_Com(0x81); //對(duì)比度設(shè)置
OLED_Write_Com(radio); //1~255;默認(rèn)0X7F (亮度設(shè)置,越大越亮)
if (flag == 1)
{
flag = 0;
OLED_Fill(1+(92 * radio / 255), 17, 93, 31, 0); //消除進(jìn)度條的多余部分
OLED_Fill(1, 17, 1+(92 * radio / 255), 31, 1); //填充進(jìn)度條
OLED_ShowNum(94, 16, (100 * radio / 255), 3, 16, 1); //顯示進(jìn)度百分比
OLED_ShowChar(120, 16, '%', 16, 1);
}
delay_ms(10);
switch (KEY_Scan(1)) //按鍵掃描
{
case KEY_UP : //按上鍵增加亮度
flag = 1;
radio += 2;
break;
case KEY_DOWN : //按下鍵減小亮度
flag = 1;
radio -= 2;
break;
case KEY_RIGHT : //按右鍵退出
MenuCancelOption();
return;
default :
break;
}
}
}
void NoThisFunction (void)
{
unsigned char Font[] = {"沒有這個(gè)功能"};
OLED_Clear(); //清屏
delay_ms(1);
Show_Str(16, 16, 128, 16, Font, 16, 1);
delay_ms(500);
MenuCancelOption();
}
/**
* @name void FunctionAction (void)
* @brief 具體功能散轉(zhuǎn)函數(shù)
* @param none
* @retval none
*/
void FunctionAction (void)
{
switch (LastIndex) //根據(jù)進(jìn)入前的索引判斷具體函數(shù)
{
case 0:
OLED_Light();
break;
// case 1:
// break;
// case 2:
// break;
case 2:
SystemTest();
break;
// case 4:
// break;
case 4:
System_Help();
break;
case 5:
復(fù)制代碼
這個(gè)是Keil4的工程,用Keil5編譯有錯(cuò)誤:
OLED菜單程序.rar
(1.09 MB, 下載次數(shù): 750)
2017-7-21 02:40 上傳
點(diǎn)擊文件名下載附件
僅供參考
作者:
rodderliu
時(shí)間:
2017-11-26 00:47
GOOD 非常好
作者:
szb0321
時(shí)間:
2017-11-30 09:12
oled屏幕操作正在學(xué)習(xí)中,不知道樓主屏幕水平滾動(dòng)、垂直滾動(dòng)有沒有嘗試過
作者:
micheal_wang
時(shí)間:
2017-11-30 14:20
下載下來(lái)看看看
作者:
後輪追前輪
時(shí)間:
2017-12-31 00:49
再再進(jìn)入菜單怎么就老是亂跳了呢
作者:
120542121
時(shí)間:
2018-1-3 21:52
謝謝分享,先下載,然后在試試
作者:
小時(shí)候可花
時(shí)間:
2018-1-13 21:57
oled屏幕操作正在學(xué)習(xí)
作者:
dyc1229
時(shí)間:
2018-3-28 16:39
正需要呢,十分感謝你的分享,謝謝了
作者:
bennyqian
時(shí)間:
2018-4-25 17:05
很好,真好需要!
作者:
he33504898
時(shí)間:
2018-5-6 22:16
下了 編譯不過,樓主解釋一下
作者:
lh6774
時(shí)間:
2018-5-9 16:53
好東西 正需要
作者:
TIGER520169
時(shí)間:
2018-5-31 15:47
謝謝分享!
作者:
mhktzy
時(shí)間:
2018-6-16 21:20
謝謝分享!
作者:
mrliangg
時(shí)間:
2018-6-21 11:49
謝謝分享!
作者:
y12345678
時(shí)間:
2018-6-24 16:17
請(qǐng)問ssd1306驅(qū)動(dòng)的四腳顯示屏能用這個(gè)嗎?
作者:
y12345678
時(shí)間:
2018-6-24 16:23
請(qǐng)問是ssd306驅(qū)動(dòng)的顯示屏用的嗎?幾腳的?
作者:
owlandauk
時(shí)間:
2018-7-27 17:01
謝謝分享
作者:
kanwoe
時(shí)間:
2018-8-17 12:03
感謝分享!!
作者:
icefish
時(shí)間:
2018-9-12 17:40
學(xué)習(xí)了!感謝分享!
作者:
346500452
時(shí)間:
2018-9-19 17:23
下載看看可不可以用
作者:
xuming123
時(shí)間:
2018-12-17 13:49
謝謝分享
作者:
yjwpm
時(shí)間:
2018-12-17 17:44
正需要呢,十分感謝你的分享,謝謝了
作者:
tonyhy1975
時(shí)間:
2018-12-20 12:33
感謝分享,值得學(xué)習(xí)
作者:
hilam
時(shí)間:
2019-8-4 16:08
沒人交流學(xué)習(xí)心得嗎?我覺得做一個(gè)KEY FUNC處理結(jié)構(gòu)體程序框架好,這樣更完美
作者:
那個(gè)誰(shuí)和誰(shuí)
時(shí)間:
2019-8-22 09:51
很好,謝謝分享。
作者:
wsxujn
時(shí)間:
2019-8-29 23:47
下來(lái)看看,怎么樣
作者:
wyy19970316
時(shí)間:
2019-12-15 22:02
正在學(xué)習(xí),非常感謝樓主
作者:
wsxujn
時(shí)間:
2020-1-20 11:41
stm32f4的,看看怎樣
作者:
bignobeach
時(shí)間:
2020-5-12 22:52
mark 一下
作者:
布萊克先生
時(shí)間:
2020-9-7 15:43
感謝樓主,最近正在學(xué)習(xí)這部分
作者:
蛋黃派@SZPT
時(shí)間:
2020-9-12 18:16
MARK 一下
作者:
沉云兒
時(shí)間:
2021-7-28 16:40
?57個(gè)error有點(diǎn)夸張了吧
作者:
sr861126
時(shí)間:
2023-12-1 08:35
沒有103的嗎、
作者:
fhq1087
時(shí)間:
2024-1-23 18:57
這個(gè)真是太友好了,瞌睡了送來(lái)枕頭
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品成人一区二区三区夜夜夜
|
国产视频中文字幕
|
国产精品不卡一区
|
男女一区二区三区
|
日本成人福利视频
|
精品亚洲一区二区
|
久久高清精品
|
久久久久久久久久久久亚洲
|
久久国产精品一区
|
国产区在线免费观看
|
爽爽免费视频
|
最新午夜综合福利视频
|
国产精品欧美一区二区三区不卡
|
亚洲iv一区二区三区
|
亚洲日韩视频
|
中文字幕免费视频
|
天堂一区二区三区四区
|
99国内精品
|
国产激情综合五月久久
|
午夜激情视频
|
国产精品久久久久久婷婷天堂
|
91久久精品日日躁夜夜躁欧美
|
天天av综合
|
国产视频线观看永久免费
|
亚洲欧美综合网
|
亚洲国产午夜
|
欧洲一级毛片
|
高清人人天天夜夜曰狠狠狠狠
|
欧美网站一区二区
|
国产免费拔擦拔擦8x高清
|
日韩在线视频一区二区三区
|
91麻豆精品国产91久久久久久
|
国产美女黄色
|
色综合色综合
|
男女羞羞视频在线
|
99pao成人国产永久免费视频
|
色播视频在线观看
|
精品国产一区二区三区久久
|
特黄视频
|
日本一二三区在线观看
|
欧一区
|