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

本文博客链接:http://blog.csdn.net/jdh99,作者: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++;}}}}
}

转载于:https://www.cnblogs.com/wzjhoutai/p/7017537.html

为OLED屏添加GUI支持2:2D图形库相关推荐

  1. 为OLED屏增加GUI支持3:字库

    为OLED屏增加GUI支持3:字库 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:MDK5.13 MCU:STM3 ...

  2. GRBL三轴+脱机运行移植STM32F103C8T6 GRBL_V1.1f三轴移植到STM32F103C8T6,并添加脱机控制,使用OLED屏和旋转编码器控制,联机脱机都可使用

    主页全部资料打包!GRBL三轴+脱机运行移植STM32F103C8T6 GRBL_V1.1f三轴移植到STM32F103C8T6,并添加脱机控制,使用OLED屏和旋转编码器控制,联机脱机都可使用. 只 ...

  3. 熄屏显示为何只有OLED屏有?为何LCD屏不支持?熄屏显示耗电严重吗

    现在用户对手机屏幕的关注一点都不比配置低,尤其是LCD和OLED到底哪个好,更是争论不休.而今天小编就是来讲讲OLED屏的熄屏显示功能,小编依稀记得诺基亚时代的一些功能机,就算锁屏都能显示日期时间,觉 ...

  4. STM32通过SPI协议驱动OLED屏

    坚持就是胜利 一.SPI协议介绍 01 简介 02 SPI物理层 03 SPI基本通讯过程 二.OLED显示器介绍 01 简介 02 接口定义 03 与STM32接线图 三.汉字取模软件介绍 01 下 ...

  5. OLED屏显和汉字点阵编码

    目录 一.SPI协议 (1)SPI协议简介 (2)SPI物理层 (3)协议层 (4)SPI 基本通讯过程 (5)CPOL/CPHA 及通讯模式 (6)通讯引脚 (7)SPI优缺点 二.OLED (1) ...

  6. 基于STM32的0.96寸OLED屏显示学号姓名和滚动显示

    文章目录 **一.SPI(串行外设接口)** **二.使用0.96寸OLED显示屏显示学号姓名** **三.0.96寸OLED在STM32f103上实现滚动显示长字符** **四.参考资料** 一.S ...

  7. 基于STM32的OLED屏显实例

    文章标题 一.SPI协议 1.什么是SPI 2.SPI物理层 3.SPI协议层 4.SPI特点 5.通讯引脚 二.OLED屏显原理 1.简介 2.OLED屏显原理 三.OLED屏显实例 1.显示自己的 ...

  8. 实验 STM32 基于SPI的OLED屏显示

    STM32 基于SPI的OLED屏显示 一.任务要求 二.显示自己的学号和姓名 1.例子程序的改写 (1)下载资料 (2)解压后找到文件,并用KEIL打开. (3)改写程序 2.连接硬件 3.运行结果 ...

  9. stc89c52rc转移到面包板,使用oled屏

    1.芯片转移到面包板上: stc89c52引脚图: 面包板的导通: 将stc89c52芯片接在插在面包板上,每一排引脚在面包板的一边. 按照芯片的引脚图,需要接线的有,VCC接高电平,VSS接低电平, ...

最新文章

  1. mac地址信息查询站点
  2. 如何压缩神经网络(将已经训练好的压缩)
  3. 云+网+端 技术架构
  4. python的span方法_Python Span.set_extension方法代码示例
  5. Sculpture ACM/ICPC NWERC 2008 离散化
  6. STL源码剖析 list概述
  7. python怎么运行matlab代码_用python运行matlab代码
  8. 我来做百科(第一天)
  9. bootstrap 横铺 行_bootstrap的布局(container、row、col-xs-4)
  10. g++是什么_路由器信号分为2.4G和5G,有什么区别?怎么选?
  11. 【转载】html中object标签详解
  12. 利用flashback database实现部分对象回滚
  13. 80后的我们为什么不结婚?
  14. 拼多多Java面试题、笔试题(含答案)
  15. STM32F4 之STM32CubeMx编程学习
  16. [学习笔记]周跳探测
  17. 美通社企业新闻汇总 | 2019.1.17 | 骊住在上海成立亚洲研发中心,霍尼韦尔深入参与中国最大石化项目建设...
  18. requests爬取图片(百思不得其姐)
  19. 电脑文件不小心删除了怎么恢复 ? 删除的文件如何恢复文件?
  20. python:继承,重用代码

热门文章

  1. Odoo12中删除无效项目
  2. 使用EntityFramework Core和Enums作为字符串的ASP.NET Core Razor页面——第一部分
  3. win32获取当前运行程序的内存地址_一个lock锁,就可以分出程序员对问题处置方式水平的高中低...
  4. idea中实体类右击没有ptg_这些6到飞起的idea插件,你还没用过?
  5. 英语学习app源码_无纸化英语学习APP击败%89英语学习者
  6. django1.11 mysql配置_Mysql没有使用python3.6与Django 1.11.7连接
  7. python查看系统信息_学习python获取系统信息和磁盘容量
  8. 调整oracle scn,在Oracle中增进SCN及案例介绍
  9. Linux删除安卓温控,RK平台关闭温度控制降频功能
  10. github 代理_GitHub访问提速方法