历史上的今天
返回首页

历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2020年10月14日 | 为OLED屏增加GUI支持2:2D图形库

2020-10-14 来源:eefocus

环境:


主机: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++;

}

}

}

}

}

推荐阅读

史海拾趣

Discera公司的发展小趣事

随着CMOS MEMS谐振器技术的不断成熟,Discera公司开始注重专利的申请和保护。他们投入大量资源用于技术研发和专利申请,逐渐在MEMS谐振器技术领域积累了大量的专利。这些专利不仅保护了公司的核心技术,也为公司的持续发展提供了坚实的法律保障。

深圳杜因特(DOINGTER)公司的发展小趣事

2013年,深圳杜因特半导体有限公司在深圳龙岗区成立,由创始人苏佩义带领团队开始创业之旅。公司初创时,专注于功率半导体的研发与生产,特别是MOS场效应管产品。尽管起步艰难,但团队凭借对技术的执着和对市场的敏锐洞察,逐渐在电子行业崭露头角。

绿宝石(BERYL)公司的发展小趣事

绿宝石公司注重品牌建设和形象提升。公司加大了广告宣传的投入力度,通过电视、网络、户外广告等多种渠道进行品牌推广。此外,绿宝石公司还积极参与社会公益活动,履行企业社会责任。这些举措不仅提升了公司的知名度和美誉度,也增强了消费者对绿宝石品牌的认同感和忠诚度。

爱普特半导体(APTSEMI)公司的发展小趣事

随着国产芯片产业的快速发展,人才短缺问题日益凸显。爱普特半导体深知人才是企业发展的核心资源,因此,公司积极构建高端半导体人才队伍。通过引进国内外优秀人才、加强内部培训、建立激励机制等多种措施,爱普特成功打造了一支技术过硬、经验丰富的研发团队。这支团队为公司的技术创新和产品研发提供了有力保障,推动了公司的快速发展。

Harwin公司的发展小趣事

进入20世纪80年代和90年代,Harbour Industries继续深化其在电缆领域的研发。为了满足军事和国防部门对电缆的特殊需求,公司开始研发并生产Mil-Spec(军用规格)电缆。这些电缆不仅具备高度的耐用性和可靠性,还符合严格的军事标准。Harbour凭借其在技术上的不断创新和产品质量的持续提升,成功地将Mil-Spec电缆推向市场,并赢得了众多军事客户和合作伙伴的信赖。

Eaton公司的发展小趣事

在伊顿的发展历程中,合作伙伴起到了至关重要的作用。伊顿一直秉持开放合作的态度,与全球各地的企业和机构建立了广泛的合作关系。通过与合作伙伴的共同努力,伊顿不仅在技术和产品上取得了突破和创新,还实现了市场份额的快速增长和业务的全球化拓展。例如,伊顿与天合智慧达成的战略合作伙伴关系,就是双方共同推动分布式光伏产业发展的有力证明。这一合作不仅为双方带来了共赢的机会,也为全球能源结构的转型和升级做出了积极贡献。

以上五个故事涵盖了伊顿公司在电子行业中的发展历程、在中国市场的拓展、与绿色能源的结合、在商用车领域的发展以及与合作伙伴的共赢等多个方面。这些故事不仅展示了伊顿公司的实力和成就,也体现了其不断创新和追求卓越的精神。

问答坊 | AI 解惑

全面了解红外遥控

全面了解红外遥控…

查看全部问答>

小信号放大电路设计_TLC2652应用案例.pdf

讲得挺通俗易懂的。给大家推荐一下!…

查看全部问答>

基于DSP的PWM双闭环直流调速系统

基于DSP的PWM双闭环直流调速系统…

查看全部问答>

VS2008+ce6.0好像跑不起来,

该种组合试了多次,没有安装成功,是否6.0不支持2008啊.难道必须返回2005吗??…

查看全部问答>

锅炉补水泵,频繁起停,只有加速时间,减速时间为零?

今一锅炉房,用变频器开关控制补水泵起停频繁,但只有加速时间控制过程,没有减速时间控制过程,加减速时间设定31秒,为什么?…

查看全部问答>

STM32F103FLASH编程问题

                                 请问STM32 的FLASH 在编程时,是不是只能对数据时0XFFFF的地址进行编程,而不能对已编程的地址写数据?请高手指教 ...…

查看全部问答>

请问430如何做数字滤波?

我现在使用149,AD每毫秒采集一组数据。波形中特别高的频率是没用的,怎么才能滤掉? 我在网上搜了一下,好像可以用快速傅里叶变换, 问题是430的计算能力和RAM能够做这么复杂的运算么? 请各位赐教,谢谢…

查看全部问答>

鸟蛋级新手问几个基本问题

1,给msp430下程序 74244做的jtag74244所需电压是3.3v还是5v? 2,由于原来做过一些at89s51用的电路需要做怎样的处理才能让msp430使用? 3,我看到msp430的驱动电流是6mA,这是拉电流还是灌电流? 4,用430后是不是所有的Vdd都要用3.3v的电压? ...…

查看全部问答>

CC2530 zigbee模块,无线传感网络

      一、        SZ2 模块特点   l        发射功率20dBm;接收灵敏度 -104dBm (BER=10-2) l        开 ...…

查看全部问答>