基于hispark套件的oled屏简易菜单设计 原创
落叶亦知冬
发布于 2022-12-8 22:59
浏览
3收藏
基于hispark套件的oled屏简易菜单设计
看见润和板子上有一个oled屏,就想着用这个屏幕来设计一个多级菜单,经查阅相关资料和学习,总结了以下的学习资料,供大家参与。
设计思路
- 采用数组的方式保存页面状态
- 通过监听按钮状态中断刷新页面
- 页面执行函数传值
代码实现
- 创建操作结构体
typedef void(*Display)();
//oled菜单状态
typedef struct{
int current; //页面索引
int enter; //按下enter键跳转的页面
Display display; //此页面的执行函数
} MenuControl;
- 页面结构
MenuControl menucontrol[] = {
{0, 1, startPage}, //主页面
{1, 2, firstPage}, //子页面
{2, 1, secondPage}}; //二级子页面
- 按钮操作函数
static void OnButtonPressed(char *arg)
{
(void)arg;
hi_u16 adc_value;
hi_adc_read(HI_ADC_CHANNEL_2,&adc_value,HI_ADC_EQU_MODEL_4,HI_ADC_CUR_BAIS_AUTO,1);
if(adc_value < 500){
if(firstParam == 2){
firstParam = 0;
}else{
firstParam++;
}
}else{
if(nowPage == 2){
nowPage = 0;
}else{
nowPage++;
}
}
printf("nowPage:%d",nowPage);
}
此处按钮用adc区分输入
通过调试可知其adc取值存在三个状态
未触发按键的高状态 触发按键2的中状态 和触发按键1的低状态
- 各页面的显示函数
/*
主页面
*/
void startPage()
{
OledFillScreen(0);
IoTI2cInit(AHT20_I2C_IDX, AHT20_BAUDRATE);
OledShowString((WIDTH / 2) - (FSIZE * 9 / 2) - 1, 3, "startPage", 1);
OledShowString(0, 7, "cancel", 1);
OledShowString(WIDTH - (FSIZE * 5 / 2) - 1, 7, "enter", 1);
}
/*
子页面
*/
void firstPage()
{
OledFillScreen(0);
IoTI2cInit(AHT20_I2C_IDX, AHT20_BAUDRATE);
OledShowString((WIDTH / 2) - (FSIZE * 11 / 2) - 1, 1, "secondPage0", 1);
OledShowString((WIDTH / 2) - (FSIZE * 11 / 2) - 1, 3, "secondPage1", 1);
OledShowString((WIDTH / 2) - (FSIZE * 11 / 2) - 1, 5, "secondPage2", 1);
// 光标 通过获取全局定义的变量参数来定位光标的位置
OledShowString(30, 2 * firstParam + 1, "-", 1);
}
/*
二级子页面
*/
void secondPage()
{
OledFillScreen(0);
IoTI2cInit(AHT20_I2C_IDX, AHT20_BAUDRATE);
// 同理 子页面的下一个页面按照参数而变
switch (firstParam)
{
case 0:
OledShowString(0, 0, "This is page0", 1);
break;
case 1:
OledShowString(0, 0, "This is page1", 1);
break;
case 2:
OledShowString(0, 0, "This is page2", 1);
break;
default:
break;
}
}
- 主函数接口使用
static void MenuDemo(void)
{
/*
初始化按钮
*/
IoTGpioInit(IOT_GPIO_KEY);
hi_io_set_func(IOT_GPIO_KEY, 0);
IoTGpioSetDir(IOT_GPIO_KEY, IOT_GPIO_DIR_IN);
hi_io_set_pull(IOT_GPIO_KEY, 1);
IoTGpioRegisterIsrFunc(IOT_GPIO_KEY, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW,OnButtonPressed, NULL);
osThreadAttr_t attr;
attr.name = "MenuTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 4096;
attr.priority = osPriorityNormal;
if (osThreadNew(menuTask,NULL,&attr) == NULL){
printf("Thread Error");
}
}
效果展示
按下右键进入下一个页面
按下左键可选择相应选项
根据选项显示不同的内容
接口函数解析
IoTGpioRegisterIsrFunc(IOT_GPIO_KEY, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW,
OnButtonPressed, NULL);
//第一个参数IO口号 第四个是中断执行函数
本人菜鸡一枚,有不足之处还请大家加以指点,上述代码只给大家提供思路,欢迎大家一起学习进步。
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
menu_demo.zip 437.71K 29次下载
已于2022-12-8 23:04:22修改
赞
5
收藏 3
回复
相关推荐
看起来功能实现的不错
感谢