博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为OLED屏添加GUI支持2:2D图形库
阅读量:6240 次
发布时间:2019-06-22

本文共 6922 字,大约阅读时间需要 23 分钟。

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

本文博客链接:,作者:jdh,转载请注明.

 

环境:

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

你可能感兴趣的文章
组合游戏-博弈论中经典模型题目
查看>>
浅谈HTTP的GET和POST
查看>>
点灯笼
查看>>
try{}catch{}
查看>>
[Aaronyang] 写给自己的WPF4.5 笔记11[自定义控件-AyImageButton的过程 1/4]
查看>>
Linux VMware新添加网络适配器找不到配置文件问题
查看>>
Javascript百学不厌 - this
查看>>
机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)
查看>>
实用算法实现-第 14 篇 启发式搜索
查看>>
c#常用的排序算法
查看>>
论文阅读——Visual inertial odometry using coupled nonlinear optimization
查看>>
Office插件编程[转]
查看>>
读代码还是读文档,来自知乎
查看>>
Linux 常见编译错误
查看>>
ASP.NET MVC 3 Controller
查看>>
Vs中调试MVC源代码步骤
查看>>
JavaScript项目重构到底有多少坑要填要踩
查看>>
footer绝对定位但是不在页面最下边解决方案
查看>>
Oil Deposits(油田)(DFS)
查看>>
Android 画图(自定义坐标轴控件的拖动实现)
查看>>