为OLED屏增加GUI支持2:2D图形库

发布者:自在自由最新更新时间:2020-10-14 来源: eefocus关键字:OLED屏  GUI支持  2D图形库 手机看文章 扫描二维码
随时随地手机看文章

环境:


主机:WIN10


开发环境:MDK5.13


MCU:STM32F103


说明:

gui库的基础是一个2D图形库,为控件提供绘图功能

此图形库还包括单色BMP图像显示函数,为图片控件提供支持


源代码:


接口函数:


gui_interface.h

/**

* Copyright (c), 2015-2025

* @file gui_interface.h

* @brief gui接口头文件

* @author jdh

* @date 2015/9/6

* @update 2015/9/7

*/

 

#ifndef _GUI_INTERFACE_H_

#define _GUI_INTERFACE_H_

 

/*********************************************************************

* 头文件

**********************************************************************/

 

#include "inf_lcd.h"

 

/*********************************************************************

* 宏定义

**********************************************************************/

 

/**

* @brief 屏幕尺寸

*/

 

#define LCD_WIDTH 128

#define LCD_HEIGHT 64

 

/*********************************************************************

* 函数

**********************************************************************/

 

/**

* @brief 画点

* @param x:x坐标

* @param y:y坐标

* @param show:0:不显示,1:显示

*/

 

void gui_interface_draw_pixel(uint8_t x,uint8_t y,uint8_t show);

 

#endif

 

 


gui_interface.c



/**

* Copyright (c), 2015-2025

* @file gui_interface.c

* @brief gui接口主文件

* @author jdh

* @date 2015/9/6

*/

 

/*********************************************************************

* 头文件

**********************************************************************/

 

#include "gui_interface.h"

 

/*********************************************************************

* 函数

**********************************************************************/

 

/**

* @brief 画点

* @param x:x坐标

* @param y:y坐标

* @param show:0:不显示,1:显示

*/

 

void gui_interface_draw_pixel(uint8_t x,uint8_t y,uint8_t show)

{

if (x >= LCD_WIDTH || y >= LCD_HEIGHT)

{

return;

}

inf_lcd_draw_pixel(x,y,show);

}

 


2D图形库:


gui_2d_lib.h


/**

* Copyright (c), 2015-2025

* @file gui_2d_lib.c

* @brief 2d图形库主文件

* @author jdh

* @date 2015/9/6

* @update 2015/9/7

* @update 2015/11/22

*/

 

#ifndef _GUI_2D_LIB_H_

#define _GUI_2D_LIB_H_

 

/*********************************************************************

* 头文件

**********************************************************************/

 

#include "gui_interface.h"

 

/*********************************************************************

* 函数

**********************************************************************/

 

/**

* @brief 绘制水平线条

* @param y:y位置

* @param x0:x起始位置

* @param x1:x结束位置

*/

 

void gui_draw_hline(uint16_t y,uint16_t x0,uint16_t x1);

 

/**

* @brief 绘制垂直线条

* @param x:x位置

* @param y0:y起始位置

* @param y1:y结束位置

*/

 

void gui_draw_vline(uint16_t x,uint16_t y0,uint16_t y1);

 

/**

* @brief 绘制线条

* @param x0:x起始位置

* @param y0:y起始位置

* @param x1:x结束位置

* @param y2:y结束位置

*/

 

void gui_draw_line(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1);

 

/**

* @brief 绘制矩形

* @param x0:左上角x坐标

* @param y0:左上角y坐标

* @param x1:右上角x坐标

* @param y2:右上角y坐标

*/

 

void gui_draw_rect(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1);

 

/**

* @brief 填充矩形

* @param x0:左上角x坐标

* @param y0:左上角y坐标

* @param x1:右上角x坐标

* @param y2:右上角y坐标

* @param show:0:不显示,1:显示

*/

 

void gui_fill_rect(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint8_t show);

 

/**

* @brief 在指定位置显示图片

* @param x:x坐标

* @param y:y坐标

* @param bmp:图片

*/

 

void gui_draw_bitmap(uint16_t x,uint16_t y,const uint8_t *bmp);

 

#endif

 

 


gui_2d_lib.c

/**

* Copyright (c), 2015-2025

* @file gui_2d_lib.c

* @brief 2d图形库主文件

* @author jdh

* @date 2015/9/6

* @update 2015/9/7

* @update 2015/11/22

*/

 

/*********************************************************************

* 头文件

**********************************************************************/

 

#include "gui_2d_lib.h"

#include "string.h"

 

/*********************************************************************

* 数据结构

**********************************************************************/

 

#pragma pack(1)

 

/**

* @brief 文件头

*/

 

struct _Bmp_File_Header

{

//文件标志

uint16_t type;

//文件大小

uint32_t size;

//保留

uint16_t reserved1;

//保留

uint16_t reserved2;

//位图偏移量

uint32_t offbits;

};

 

/**

* @bri信息头

*/

 

struct _Bmp_Info_Header

{

//信息头大小

uint32_t size;

//位图宽度

uint32_t width;

//位图高度

uint32_t height;

//位图的位面数

uint16_t planes;

//每个像素点所需的数据位数(24)

uint16_t offbits;

//压缩算法

uint32_t compression;

//位图数据字节数

uint32_t size_image;

//以像素/米的单位表示水平分辨率

uint32_t xpe_is_per_meter;

//以像素/米的单位表示垂直分辨率

uint32_t ype_is_per_meter;

//位图使用的颜色数

uint32_t color_used;

//指定重要颜色数

uint32_t color_important;

};

 

#pragma pack()

 

/*********************************************************************

* 函数

**********************************************************************/

 

/**

* @brief 绘制水平线条

* @param y:y位置

* @param x0:x起始位置

* @param x1:x结束位置

*/

 

void gui_draw_hline(uint16_t y,uint16_t x0,uint16_t x1)

{

uint16_t x = 0;

for (x = x0;x <= x1;x++)

{

gui_interface_draw_pixel(x,y,1);

}

}

 

/**

* @brief 绘制垂直线条

* @param x:x位置

* @param y0:y起始位置

* @param y1:y结束位置

*/

 

void gui_draw_vline(uint16_t x,uint16_t y0,uint16_t y1)

{

uint16_t y = 0;

for (y = y0;y <= y1;y++)

{

gui_interface_draw_pixel(x,y,1);

}

}

 

/**

* @brief 绘制线条

* @param x0:x起始位置

* @param y0:y起始位置

* @param x1:x结束位置

* @param y2:y结束位置

*/

 

void gui_draw_line(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1)

{

float a = 0;

float b = 0;

float xx0 = x0;

float yy0 = y0;

float xx1 = x1;

float yy1 = y1;

uint16_t x = 0;

uint16_t y = 0;

a = (yy0 - yy1) / (xx0 - xx1);

b = yy0 - (yy0 - yy1) * x0 / (x0 - x1);

for (x = x0;x <= x1 - x0;x++)

{

y = a * x + b;

gui_interface_draw_pixel(x,y,1);

}

}

 

/**

* @brief 绘制矩形

* @param x0:左上角x坐标

* @param y0:左上角y坐标

* @param x1:右上角x坐标

* @param y2:右上角y坐标

*/

 

void gui_draw_rect(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1)

{

gui_draw_hline(y0,x0,x1);

gui_draw_hline(y1,x0,x1);

gui_draw_vline(x0,y0,y1);

gui_draw_vline(x1,y0,y1);

}

 

/**

* @brief 填充矩形

* @param x0:左上角x坐标

* @param y0:左上角y坐标

* @param x1:右上角x坐标

* @param y2:右上角y坐标

* @param show:0:不显示,1:显示

*/

 

void gui_fill_rect(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint8_t show)

{

uint16_t i = 0;

uint16_t j = 0;

for (i = x0;i <= x1;i++)

{

for (j = y0;j <= y1;j++)

{

gui_interface_draw_pixel(i,j,show);

}

}

}

/**

* @brief 在指定位置显示图片

* @param x:x坐标

* @param y:y坐标

* @param bmp:图片

*/

 

void gui_draw_bitmap(uint16_t x,uint16_t y,const uint8_t *bmp)

{

struct _Bmp_File_Header bmp_file_header;

struct _Bmp_Info_Header bmp_info_header;

uint8_t *buf_pt = 0;

uint16_t i = 0;

uint16_t j = 0;

uint8_t bit = 0;

uint8_t index_bit = 0;

uint16_t row = 0;

uint16_t column = 0;

uint16_t num_bit_invalid = 0;

//读取文件头

memcpy(&bmp_file_header,bmp,sizeof(struct _Bmp_File_Header));

//读取信息头

memcpy(&bmp_info_header,bmp + sizeof(struct _Bmp_File_Header),sizeof(struct _Bmp_Info_Header));

//图片数据

buf_pt = (uint8_t *)bmp + bmp_file_header.offbits;

//4字节对齐导致的无效位数

num_bit_invalid = 32 - (bmp_info_header.width % 32);

//显示图片

for (i = 0;i < bmp_info_header.width * bmp_info_header.height;i++)

{

bit = (*buf_pt >> (7 - index_bit)) & 0x1;

inf_lcd_draw_pixel(x + column,y + bmp_info_header.height -1 - row,bit);

index_bit++;

if (index_bit >= 8)

{

index_bit = 0;

buf_pt++;

}

column++;

if (column >= bmp_info_header.width)

{

column = 0;

row++;

//补齐

for (j = 0;j < num_bit_invalid;j++)

{

index_bit++;

if (index_bit >= 8)

{

index_bit = 0;

buf_pt++;

}

}

}

}

}

关键字:OLED屏  GUI支持  2D图形库 引用地址:为OLED屏增加GUI支持2:2D图形库

上一篇:为OLED屏增加GUI支持4:文本框控件
下一篇:ucgui界面设计示例2

推荐阅读最新更新时间:2024-11-07 18:52

天马:新一代 OLED 采用 Windmill 像素排布,形似风车
IT之家 3 月 28 日消息,今晚,天马发文介绍了新一代 OLED 像素排布方式 ——Windmill 排布。官方表示,这种排布方式源于其排布造型形似风车(Windmill),同时又兼具风车节能的特点。 ▲ 图自天马微电子 据介绍,微观下的 Windmill 排布,是由一个个红、绿、蓝像素构成的双梯形结构组合构成。这种像素排布设计,在真正的达到高效节能的同时,能够在兼容新技术、产品性能提升、增加工艺冗余量方面做到合理地平衡。 ▲ 图自天马微电子 官方称,Windmill 相较于天马第一代像素排布,做出了突破性的改进,诸多性能都达到了业界领先水平,如显示文字或精细画面时效果更优,字体边缘更清晰,可识别度更高;数据处理量减少
[手机便携]
天马:新一代 <font color='red'>OLED</font> <font color='red'>屏</font>采用 Windmill 像素排布,形似风车
OLED增加GUI支持5:图片控件
环境: 主机:WIN10 开发环境:MDK5.13 MCU:STM32F103 说明: 本文定义了图片控件。OLED屏是单色屏,所以本图片控件支持的是单色BMP图像。 将普通图像转换为单色图片可以用工具BmpCvt.exe。将转换后的BMP图像转换为hex文件,可以用Bin2C.exe。这两个工具都是emwin自带工具。 源代码: 转换后的hex文件再整理成如下的示例格式: battery0.c /** * Copyright (c), 2015-2025 * @file battery0.c * @brief 电池0格图标 * @author jdh * @date 2015/11/9 *
[单片机]
OLED多电子图文广告设计
  1 引言   新一代显示器件有机电致发光显示器件OLED(OrganicLightEmittingDiode)厚度为LCD的1/3,响应速度是LCD 元件的1000倍,低温特性好,在-40℃能正常显示。设计开发一套能在多个公共场合(如厂区、校区)同步发布电子公告的多电子图文广告屏。该系统基于通用串行总线(USB)传输,速度快、 可靠性高,有效地克服了传统广告图文传输的缺陷。   2系统设计      多场合同步发布电子广告屏系统由位于Internet网络的PC机(上位机)和位于各LED控制器上的单片机(下位机)组成,采用USB总线进 行主从式通信。图1为控制系统的逻辑结构框图。上位机主要完成图文编辑、字模提取
[电源管理]
<font color='red'>OLED</font>多电子图文广告<font color='red'>屏</font>设计
4K OLED可以的 索尼真旗舰XZ Pro曝光
虽然索尼在刚刚过去的2017年一口气推出了多款新机,但很难找到一款能够被称为当家旗舰的,并且在2017年年末都没有赶上全面屏的“末班车”,让期待索尼真旗舰的朋友们颇感失望。 国外爆料大神曝光索尼新旗舰XZ Pro 不过,大家也不用心急,因为索尼真正的旗舰机目前已经在路上了。近日,有国外爆料大神曝光了一款索尼新机的消息。据悉,这款新机将会被命名为索尼Xperia XZ Pro,配备6GB大内存,搭载高通新一代骁龙845移动平台,采用5.7英寸4K分辨率的OLED显示屏。 此外,一贯活在自己世界里的索尼这次也终于开窍了,跟上了市场的大潮流,据悉,这款索尼XZ Pro将会支持指纹识别、虹膜识别、面部识别,并支持IP68防
[手机便携]
OPPO Reno8 Pro+搭载BOE(京东方)全新一代柔性OLED 绽放美好“视”界
OPPO Reno8 Pro+搭载BOE(京东方)全新一代柔性OLED屏 绽放美好“视”界 5月23日晚,OPPO举行新品发布会,正式对外发布全新人像高端机型OPPO Reno8 Pro+。BOE(京东方)为该机型提供了全新一代柔性OLED屏幕,成为继今年初Find X5之后携手OPPO带来的又一款极具创新性和突破性的代表产品,以全新像素排列、三频动态高刷、超窄边框设计及低蓝光护眼等多重技术优势,带来流光溢彩的视觉震撼和独特的美学体验,尽显BOE(京东方)在柔性显示领域强劲的技术创新实力和极具引领性的市场影响力。 此次发布的 OPPO Reno8 Pro+搭载BOE(京东方)6.7英寸 全新一代柔性OLED显示屏,采用BO
[手机便携]
国产大OLED电视亮相 预计8个月后上市
    当三星、LG的OLED(有机发光二极管)电视仍只接受预订之时,国产OLED电视也跟着露面,共同抢夺市场。“国产OLED电视价格肯定会低一些,具有例如健康运动等特殊功能。”12月2日,创维集团高层接受E天下采访时称。早前,创维在深圳发布半年报时透露,国产品牌首台OLED电视由其首发,预计TCL、康佳等家电厂商将迅速跟进。   不过,业内人士称,三星、LG还在为OLED技术“打架”,仍不成熟,而明年,4K(超高清)电视价格将会跌入“井喷”区间,快速进入寻常百姓家。据预计,4K、OLED融合的电视将在明年底或2015年初推出。    国产OLED电视广东造   “此前与华南理工大学合作研发的OLED柔性屏还只是小尺寸
[家用电子]
智能手机产业链纷纷布局OLED 中日韩抢夺OLED先机
一块小小的屏幕正挑动全球智能终端厂商的神经和市场走势。近期,苹果公司疯狂扫货三星OLED屏幕,又对 LG Display(LGD)“暗送秋波”以制衡三星;另有消息称,谷歌也欲投资LGD,以提高其OLED产能。在智能手机厂商纷纷嫩拉拢韩国面板厂商的同时, 中国地区的面板厂商也加快脚步,2016年京东方在成都、绵阳投资建设的两条6代柔性OLED面板生产线,预计今年10月将会投产;收购夏普之后,富士康也开始整合夏普的OLED技术。   随着OLED、VR、虹膜识别等技术的发展,消费电子手机领域将迎来新一轮创新与变革周期。屏幕是智能终端重要的窗口,苹果、三星对上游供应链产能的垄断,将使刚刚崛起的中国智能手机厂商面临供应链产能不足的危机,也
[电源管理]
Q3 OLED手机全球规模达到47亿美元 2020年比例将上升至53%
有机构预测OLED显示屏市场将会迎来高速增长,受苹果和三星电子OLED显示屏的大量使用。预计到2018年会有更多的厂商加入到这个行列来。2020年,这一比例将有望上升至53%。 据报道,市场调研公司IHS Markit周四发布报告称,今年第三季度全球智能手机用OLED显示屏的市场规模达到47亿美元,较去年同期的36亿美元激增了30%。 作为一种新型的屏幕类型,OLED有着无需背光源,可以自发光,可视角度更大、色彩更丰富、节能显著、可柔性弯曲等优点。随着苹果跟随部分中国厂商、三星电子,开始在旗舰智能手机iPhone X开始采用OLED显示屏,预计到2018年将会有更多的手机厂商和型号采用OLED显示屏。IHS Market此
[电源管理]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved