为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++;
}
}
}
}
}

为OLED屏添加GUI支持2:2D图形库的更多相关文章

  1. 为OLED屏添加GUI支持6:进度条控件

    为OLED屏添加GUI支持6:进度条控件 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:MDK5.13 MCU:S ...

  2. 为OLED屏添加GUI支持3:字库

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

  3. 为OLED屏增加GUI支持

    为OLED屏增加GUI支持1:OLED驱动 为OLED屏增加GUI支持2:2D图形库 为OLED屏增加GUI支持3:字库 为OLED屏增加GUI支持4:文本框控件 为OLED屏增加GUI支持5:图片控 ...

  4. 图像分辨率 像素 大小 LCD显示 为OLED屏增加GUI支持

    1. 根据一张标准图片的分辨率,结合每个像素的大小,可以计算得到这张图片的大小(字节数) 补充点:bmp格式的图片有24色或者32色.(其一个像素点可能占用24bits或者32bits)  至于图片怎 ...

  5. 简易四则运算生成程序——添加GUI支持

    项目成员:张金生     张政 工程地址: https://coding.net/u/jx8zjs/p/paperOne/git ssh://git@git.coding.net:jx8zjs/pap ...

  6. [Unity3D][Vuforia][IOS]vuforia在unity3d中添加自己的动态模型,识别自己的图片,添加GUI,播放视频

    使用环境 unity3D 5 pro vuforia 4 ios 8.1(6.1) xcode 6.1(6.2) 1.新建unity3d工程,添加vuforia 4.0的工程包 Hierarchy中 ...

  7. CEF3编译添加mp4支持(对应CefSharp63.0.3),chromium63(3239),附release下载

    编译环境需求(3239版本) win7或更高,64位 vs2017 15.3.2+ 默认位置安装 不需要安装附带的win10sdk,sdk单独装 Windows 10.0.15063.468 SDK ...

  8. 树莓派使用 OLED 屏显示图片及文字

    树莓派默认是不带显示屏的,如果想要查看系统的一些信息,需要使用电脑登录到树莓派,或者通过 HDMI 连接外接显示器查看.这样做总是有点麻烦,我们可以通过外接一个 OLED 屏来显示一些关键参数或者图片 ...

  9. 把自己Github上的代码添加Cocoapods支持

    转载请注明原链接:http://www.cnblogs.com/zhanggui/p/6003481.html 一.前言 这两天被cocoapods折磨的心力憔悴.看cocoapods官网的添加支持, ...

随机推荐

  1. 路飞学城Python-Day3

    Moudle 1 Chapter 1 #练习题# 1.简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型?"""编译型:编译类指在应用源程 ...

  2. [TJOI2015]弦论(后缀数组or后缀自动机)

    解法一:后缀数组 听说后缀数组解第k小本质不同的子串是一个经典问题. 把后缀排好序后第i个串的本质不同的串的贡献就是\(n-sa[i]+1-LCP(i,i-1)\)然后我们累加这个贡献,看到哪一个串的 ...

  3. BZOJ 1355[Baltic2009]Radio Transmission(KMP)

    题意 给你一个字符串,它是由某个字符串不断自我连接形成的. 但是这个字符串是不确定的,现在只想知道它的最短长度是多少. (n<=1000000) 题解 这种求最小循环节的题一般是KMP. 因为有 ...

  4. [SHOI2009]Booking 会场预约

    题目:洛谷P2161. 题目大意:有一些操作,分为两种: A.增加一个从第l天到第r天的预约,并删除与这个预约冲突的其他预约,输出删除了多少个预约. B.输出当前有效预约个数. 两个预约冲突定义为两个 ...

  5. 【codeforces 20B】Equation

    [题目链接]:http://codeforces.com/contest/20/problem/B [题意] 给你一个方程,让你输出这个方程的解的情况. [题解] a==0,b==0,c==0时,为恒 ...

  6. ASP.NET-ajax.BeginForm使用02

      Ajax.BeginForm中OnFailure.Onsuccess.OnComplete函数是可以处理从后台返回的数据的,比直接使用jquery的$.ajax方法还要节约时间   @using( ...

  7. sort函数自定义compare方法

    今天看到有C++这样写: sort(ins.begin(), ins.end(), [](Interval a, Interval b){return a.start < b.start;}); ...

  8. Android 最火的高速开发框架xUtils

    Github下载地址:https://github.com/wyouflf/xUtils xUtils简单介绍 xUtils 包括了非常多有用的Android工具. xUtils 最初源于Afinal ...

  9. Ubuntu 10.04 右上角网络管理图标消失的解决的方法

           那个显示网络状态的那个图标.叫做:network-manager.假设是有线网络连接的话.是上下两个箭头,假设是无线网络的话.是一个发射信号的形状. sudo gedit /etc/Ne ...

  10. Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题

    前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用  http://www.cnblogs.com/ngnetboy/p/3521547.htm ...