首页 > 其他分享 >OLED动画设计

OLED动画设计

时间:2023-11-18 16:36:11浏览次数:46  
标签:动画设计 menu list uint8 param OLED user

前言

之前在b站上看到很多大佬分享了OLED丝滑滑动的界面的效果,当时对这个超级喜欢,但是看到大部分都是用的U8G2的OLED图形库。这对于一些资源比较紧张的单片机,而且还想用上这种的并不是很友好。而且我最开始使用OLED的时候用的都是中景园的代码,都是比较简单的GUI接口,所以掌握理论方法实现这个尤为重要。

后面看到了一个大佬分享了相关教程,了解的相关知识,使用更少的资源实现这种方法。

大佬的视频教程链接:

OLED尝试实现稚晖君动画菜单_哔哩哔哩_bilibili

渐变效果

首先是实现渐变效果。

根据大佬的介绍,主要是使用了rand()这个标准库里的随机数函数。将每个字节与之相与后。每次减少两个字节,即可实现这种渐变效果。

展示效果如图:

ezgif.com-video-to-gif

核心代码:

p[i] = p[i] & (rand() % 0xff) >> disapper_temp; // rand()%0xff = 0 ~ 0xff

完整代码:

/**
 * @brief             图片渐变消失
 * @param[in]         x 图片的起始x坐标
 * @param[in]         y 图片的起始y坐标
 * @param[in]         px 图片的x长度
 * @param[in]         py 图片的y长度
 * @param[in]         bg 图片buff地址
 * @param[in]         mode 0:白色背景和黑色字符   1:黑色背景和白色字符
 * @retval            0 : 完成渐变效果
 * @retval            1 : 图片大小超出
 */
uint32_t GUI_DisapperBMP(uint8_t x, uint8_t y, uint8_t px, uint8_t py, const uint8_t *bg, uint8_t mode)
{
    uint32_t len;

    if ((x + px > OLED_WIDTH) || (y + py > OLED_HEIGHT))
    {
        elog_w(TAG, "bmp over .....");
        return 1;
    }
    len = (uint32_t)(ceil((float)px / 2) * ceil((float)py / 4));

    int32_t disapper_temp = 0;
    while (disapper_temp <= 8)
    {
        OLED_Clear();                        // 清除内部缓冲区
        GUI_ShowBMP(x, y, px, py, bg, mode); // 第一段输出位置

        uint8_t *p = Get_OLEDBuffer();
        for (uint32_t i = 0; i < len; i++)
        {
            p[i] = p[i] & (rand() % 0xff) >> disapper_temp; // rand()%0xff = 0 ~ 0xff
        }

        disapper_temp += 2;

        OLED_Display();
        delay1ms(100);
    }
    OLED_Display();
    // delay1ms(1000);
    return 0;
}

/**
 * @brief             图片渐变显示
 * @param[in]         x 图片的起始x坐标
 * @param[in]         y 图片的起始y坐标
 * @param[in]         px 图片的x长度
 * @param[in]         py 图片的y长度
 * @param[in]         bg 图片buff地址
 * @param[in]         mode 0:白色背景和黑色字符   1:黑色背景和白色字符
 * @retval            0 : 完成渐变效果
 * @retval            1 : 图片大小超出
 */
uint32_t GUI_ComeBMP(uint8_t x, uint8_t y, uint8_t px, uint8_t py, const uint8_t *bg, uint8_t mode)
{
    uint32_t len;

    if ((x + px > OLED_WIDTH) || (y + py > OLED_HEIGHT))
    {
        elog_w(TAG, "bmp over .....");
        return 2;
    }
    len = (uint32_t)(ceil((float)px / 2) * ceil((float)py / 4));

    int32_t come_temp = 8;
    while (come_temp >= 0)
    {
        OLED_Clear();                        // 清除内部缓冲区
        GUI_ShowBMP(x, y, px, py, bg, mode); // 第一段输出位置
        uint8_t *p = Get_OLEDBuffer();

        for (uint32_t i = 0; i < len; i++)
        {
            p[i] = p[i] & (rand() % 0xff) >> come_temp; // rand()%0xff = 0 ~ 0xff
        }

        come_temp -= 2;

        OLED_Display();
        delay1ms(100);
    }

    GUI_ShowBMP(x, y, px, py, bg, mode);
    OLED_Display();
    // delay1ms(1000);
    return 0;
}

几个接口说明

  • OLED_Clear oled清屏函数
  • GUI_ShowBMPoled显示一个图片
  • OLED_Displayoled刷新显示
  • Get_OLEDBuffer获得内部oled缓存地址。

不足处:这里刷新是对于整个屏幕刷新,可以根据实际情况对这里进行调整。

菜单界面滑动

这里比较简单,首先要先设计好菜单结构体:

typedef struct
{
    menu_mode_type_t menu_mode; // 菜单号
    char *str;	// 菜单名
    uint8_t len;	// 菜单名长度
} menu_list_type_t;

static const menu_list_type_t menu_list[] = {
    {CONFIG_PID_MENU, "SET PID", 8},
    {SHOW_VERSION_MENU, "Version", 8},
    {MENU_1, "To be add", 10},
    {MENU_2, "To be add", 10},
    {MENU_3, "To be add", 10},
};

菜单相关参数设置:

typedef struct
{
    int8_t list_x_now;       // 当前x位置
    int8_t list_x_tag;       // 目标x位置
    int8_t list_y_now;       // 当前y位置
    int8_t list_y_tag;       // 目标y位置
    int8_t list_top_line;    // 记录界面头部位置
    int8_t list_bottom_line; // 记录界面底部位置
    int8_t frame_list_index; // 记录选择第几个菜单
    int8_t frame_list_line;  // 记录当前页面的位置 // 最大为 (OLED_HEIGHT / MENU_FONT_NUM-1)
} user_menu_ui_type_t;

static user_menu_ui_type_t user_menu_para = {0, 0, 0, 0, 0, OLED_HEIGHT / MENU_FONT_NUM, 0, 0}; // 用户菜单界面参数

画点函数这里需要加个限制,超出范围就不画点了:

/**
 * @description: 在oled上画一个点
 * @param {uint8_t} x:  点的x坐标
 * @param {uint8_t} y:  点的y坐标
 * @param {uint8_t} color:  点的颜色值 1:白 ; 0:黑色
 * @return {*}
 */
void GUI_DrawPoint(uint8_t x, uint8_t y, uint8_t color)
{
    uint8_t pos, bx, temp = 0;
    uint8_t *p = Get_OLEDBuffer();
    if (x > 127 || y > 63)
    {
        // elog_w(TAG, "Out of range.........");
        return; // 超出范围了.
    }

    pos = 7 - y / 8;
    bx = y % 8;
    temp = 1 << (7 - bx);
    if (color)
        p[x + pos * OLED_WIDTH] |= temp;
    else
        p[x + pos * OLED_WIDTH] &= ~temp;
}

菜单界面刷新代码:

    OLED_Clear();

    for (uint32_t i = 0; i < menu_list_len; i++)
    {
        // if ((user_menu_para.list_y_now + i * MENU_FONT_NUM) >= 0)
        if (user_menu_para.frame_list_index == i)
        {
            GUI_ShowString(user_menu_para.list_x_now, user_menu_para.list_y_now + i * MENU_FONT_NUM, menu_list[i].str, MENU_FONT_NUM, 0);
        }
        else
        {
            GUI_ShowString(user_menu_para.list_x_now, user_menu_para.list_y_now + i * MENU_FONT_NUM, menu_list[i].str, MENU_FONT_NUM, 1);
        }
    }

    // 菜单滑动
    if (user_menu_para.list_y_now < user_menu_para.list_y_tag)
    {
        user_menu_para.list_y_now += 1;
    }
    else if (user_menu_para.list_y_now > user_menu_para.list_y_tag)
    {
        user_menu_para.list_y_now -= 1;
    }

这里根据外部按键控制list_y_tag这个成员的值,整体菜单会一行一行刷过去。

展示效果:

video_20231118_152416_3

详细代码可见:

CW32_MiniHeating: 利用CW32实现恒温加热台 (gitee.com)

这里比较不足的是方框滑动,并不是很丝滑,这里可能需要使用U8G2的图形库才能比较好的实现,自己实现的话需要研究一下。

标签:动画设计,menu,list,uint8,param,OLED,user
From: https://www.cnblogs.com/tangwc/p/17840676.html

相关文章

  • STM32驱动OLED实现充电动画
    先看效果因为之前在项目中OLED一般只显示字符,今天闲来无事了解了一下取模功能,话不多说,直接开始教学。首先寻找一张你想显示的图片使用画图打开(重新调整大小,128乘以64)接着保存,注意是以单色图保存,下面是保存为单色的样子接着取模(使用的软件为Pctolcd2002),模式选择图片模式,按照下图修......
  • 苹果电子iPad Pro系列或推出OLED版,改善PG模拟游戏体验
    在过去的一年中,苹果iPad系列未推出任何新品,然而,明年可能会带来令人振奋的更新。PG游戏软件APP猜测,苹果将进行全面的iPad产品线升级,包括最基础的iPad到高端的iPadPro。其中,最引人瞩目的是采用OLED显示屏的iPadPro,该款产品还将搭载M3芯片,这将是重大升级。根据韩媒的报道,LG、三星和......
  • STM32 OLED显示字符汉字
    本文代码使用HAL库。@TOC前言OLED屏幕是一种高对比度、高亮度、低功耗、灵活可弯曲的显示技术。在电子产品中,OLED屏幕通常用于显示各种文本、图标、图像等内容。本篇文章将介绍使用I2C接口在OLED屏幕上显示字符,汉字。一、OLED接线:我使用的OLED分辨率是128x64。这里......
  • 如何解决“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”问题
    最近在做Excel文件导入时候,出现"未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序" 问题 产生原因:这个问题一般是在导入Excel文件的时候报的错,原因是缺少了相对应的MicrosoftAccessDatabaseEngine组件。解决方法:安装AccessDatabaseEngine插件1)访问下载路径(http......
  • an软件怎么下载|动画设计软件|中文直装版下载 软件激活版
    AdobeAnimate2022SP是adobe最新发布的一款二维动画制作软件。相信大家对这款软件都不陌生。最重要的是帮助设计师设计交互式矢量图形和位图动画,并支持制作后快速发布到多个平台,包括HTML5Canvas、WebGL、Flash/AdobeAIR和自定义平台,让用户在桌面、移动和电视。同时,该软件应......
  • an软件怎么下载|动画设计软件|中文直装版下载 正版下载
    AdobeAnimate(简称AN)是由Adobe公司开发的一款专业动画和交互式媒体设计软件。它的历史可以追溯到1996年,最初是以Flash格式为基础的软件,用于创建网页动画和互动内容。随着技术的发展,AdobeAnimate逐渐扩展了其功能和应用领域。现在,它被广泛应用于游戏开发、动画制作、广告制作等领域......
  • 全志R128驱动OLED屏幕步骤教程
    驱动OLED屏本文案例代码下载地址OLED驱动案例代码https://www.aw-ol.com/downloads?cat=24OLED,即有机发光二极管(OrganicLightEmittingDiode)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广......
  • LCD时代即将终结!曝苹果新iPad升级为OLED屏
    市场调研机构Omdia在一份报告中提到,苹果将在2024年推出配备OLED屏的iPadPro,有11和13英寸两种尺寸,供应商为三星和LG。报告指出,苹果目标是2024年生产1000万台OLED版iPadPro,其中三星供货400万台,LG供货600万台。展望未来,苹果还将会在iPadmini和iPadAir产品线上使用OLED,届时苹果......
  • STM32之OLED显示
    OLED显示屏学习,不是追求速度的,是追求质量的学习资料:【正点原子】手把手教你学STM32HAL库开发全集OLED基础知识ATK_OLED模块是一块小尺寸(0.96寸)、高亮、自带升压电路的高性能OLED显示模块,分辨率为128*64,采用SSD1306驱动IC,该芯片内部集成DCDC升压,仅需3.3V供电。模块支持......
  • 微软推出统一 Copilot AI 助手;谷歌拟自主研发 AI 芯片;苹果拟在国内引进新的 OLED 供应
    开发者朋友们大家好:这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,欢迎大家留......