为OLED屏添加GUI支持2:2D图形库
为OLED屏添加GUI支持2:2D图形库
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.
环境:
主机:WIN10
开发环境:MDK5.13
MCU:STM32F103
源码:
接口函数:
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
/**
* 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图形库相关推荐
- 为OLED屏增加GUI支持3:字库
为OLED屏增加GUI支持3:字库 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:MDK5.13 MCU:STM3 ...
- GRBL三轴+脱机运行移植STM32F103C8T6 GRBL_V1.1f三轴移植到STM32F103C8T6,并添加脱机控制,使用OLED屏和旋转编码器控制,联机脱机都可使用
主页全部资料打包!GRBL三轴+脱机运行移植STM32F103C8T6 GRBL_V1.1f三轴移植到STM32F103C8T6,并添加脱机控制,使用OLED屏和旋转编码器控制,联机脱机都可使用. 只 ...
- 熄屏显示为何只有OLED屏有?为何LCD屏不支持?熄屏显示耗电严重吗
现在用户对手机屏幕的关注一点都不比配置低,尤其是LCD和OLED到底哪个好,更是争论不休.而今天小编就是来讲讲OLED屏的熄屏显示功能,小编依稀记得诺基亚时代的一些功能机,就算锁屏都能显示日期时间,觉 ...
- STM32通过SPI协议驱动OLED屏
坚持就是胜利 一.SPI协议介绍 01 简介 02 SPI物理层 03 SPI基本通讯过程 二.OLED显示器介绍 01 简介 02 接口定义 03 与STM32接线图 三.汉字取模软件介绍 01 下 ...
- OLED屏显和汉字点阵编码
目录 一.SPI协议 (1)SPI协议简介 (2)SPI物理层 (3)协议层 (4)SPI 基本通讯过程 (5)CPOL/CPHA 及通讯模式 (6)通讯引脚 (7)SPI优缺点 二.OLED (1) ...
- 基于STM32的0.96寸OLED屏显示学号姓名和滚动显示
文章目录 **一.SPI(串行外设接口)** **二.使用0.96寸OLED显示屏显示学号姓名** **三.0.96寸OLED在STM32f103上实现滚动显示长字符** **四.参考资料** 一.S ...
- 基于STM32的OLED屏显实例
文章标题 一.SPI协议 1.什么是SPI 2.SPI物理层 3.SPI协议层 4.SPI特点 5.通讯引脚 二.OLED屏显原理 1.简介 2.OLED屏显原理 三.OLED屏显实例 1.显示自己的 ...
- 实验 STM32 基于SPI的OLED屏显示
STM32 基于SPI的OLED屏显示 一.任务要求 二.显示自己的学号和姓名 1.例子程序的改写 (1)下载资料 (2)解压后找到文件,并用KEIL打开. (3)改写程序 2.连接硬件 3.运行结果 ...
- stc89c52rc转移到面包板,使用oled屏
1.芯片转移到面包板上: stc89c52引脚图: 面包板的导通: 将stc89c52芯片接在插在面包板上,每一排引脚在面包板的一边. 按照芯片的引脚图,需要接线的有,VCC接高电平,VSS接低电平, ...
最新文章
- mac地址信息查询站点
- 如何压缩神经网络(将已经训练好的压缩)
- 云+网+端 技术架构
- python的span方法_Python Span.set_extension方法代码示例
- Sculpture ACM/ICPC NWERC 2008 离散化
- STL源码剖析 list概述
- python怎么运行matlab代码_用python运行matlab代码
- 我来做百科(第一天)
- bootstrap 横铺 行_bootstrap的布局(container、row、col-xs-4)
- g++是什么_路由器信号分为2.4G和5G,有什么区别?怎么选?
- 【转载】html中object标签详解
- 利用flashback database实现部分对象回滚
- 80后的我们为什么不结婚?
- 拼多多Java面试题、笔试题(含答案)
- STM32F4 之STM32CubeMx编程学习
- [学习笔记]周跳探测
- 美通社企业新闻汇总 | 2019.1.17 | 骊住在上海成立亚洲研发中心,霍尼韦尔深入参与中国最大石化项目建设...
- requests爬取图片(百思不得其姐)
- 电脑文件不小心删除了怎么恢复 ? 删除的文件如何恢复文件?
- python:继承,重用代码
热门文章
- Odoo12中删除无效项目
- 使用EntityFramework Core和Enums作为字符串的ASP.NET Core Razor页面——第一部分
- win32获取当前运行程序的内存地址_一个lock锁,就可以分出程序员对问题处置方式水平的高中低...
- idea中实体类右击没有ptg_这些6到飞起的idea插件,你还没用过?
- 英语学习app源码_无纸化英语学习APP击败%89英语学习者
- django1.11 mysql配置_Mysql没有使用python3.6与Django 1.11.7连接
- python查看系统信息_学习python获取系统信息和磁盘容量
- 调整oracle scn,在Oracle中增进SCN及案例介绍
- Linux删除安卓温控,RK平台关闭温度控制降频功能
- github 代理_GitHub访问提速方法