基于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;
  • 页面结构
    基于hispark套件的oled屏简易菜单设计-鸿蒙开发者社区
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");
    }
}

效果展示

按下右键进入下一个页面
基于hispark套件的oled屏简易菜单设计-鸿蒙开发者社区
按下左键可选择相应选项
基于hispark套件的oled屏简易菜单设计-鸿蒙开发者社区
根据选项显示不同的内容
基于hispark套件的oled屏简易菜单设计-鸿蒙开发者社区

接口函数解析

IoTGpioRegisterIsrFunc(IOT_GPIO_KEY, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW,
        OnButtonPressed, NULL);
//第一个参数IO口号 第四个是中断执行函数

本人菜鸡一枚,有不足之处还请大家加以指点,上述代码只给大家提供思路,欢迎大家一起学习进步。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
menu_demo.zip 437.71K 27次下载
已于2022-12-8 23:04:22修改
5
收藏 3
回复
举报
2条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

看起来功能实现的不错

2
回复
2022-12-9 10:38:55
落叶亦知冬
落叶亦知冬 回复了 红叶亦知秋
看起来功能实现的不错

感谢

1
回复
2022-12-9 11:40:12
回复
    相关推荐