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

发布者:JoyousJourney最新更新时间:2016-12-18 来源: eefocus关键字:OLED屏  GUI支持  2D图形库 手机看文章 扫描二维码
随时随地手机看文章

环境:

主机:WIN10

开发环境:MDK5.13

MCU:STM32F103


说明:

gui库的基础是一个2D图形库,为控件提供绘图功能

此图形库还包括单色BMP图像显示函数,为图片控件提供支持


源代码:

接口函数:

gui_interface.h


  1. /** 

  2. * Copyright (c), 2015-2025 

  3. * @file gui_interface.h 

  4. * @brief gui接口头文件 

  5. * @author jdh 

  6. * @date 2015/9/6 

  7. * @update 2015/9/7 

  8. */  

  9.   

  10. #ifndef _GUI_INTERFACE_H_  

  11. #define _GUI_INTERFACE_H_  

  12.   

  13. /********************************************************************* 

  14. *                           头文件 

  15. **********************************************************************/  

  16.   

  17. #include "inf_lcd.h"  

  18.   

  19. /********************************************************************* 

  20. *                           宏定义 

  21. **********************************************************************/  

  22.   

  23. /** 

  24. * @brief 屏幕尺寸 

  25. */  

  26.   

  27. #define LCD_WIDTH           128  

  28. #define LCD_HEIGHT          64  

  29.   

  30. /********************************************************************* 

  31. *                           函数 

  32. **********************************************************************/  

  33.   

  34. /** 

  35. * @brief 画点 

  36. * @param x:x坐标 

  37. * @param y:y坐标 

  38. * @param show:0:不显示,1:显示 

  39. */  

  40.   

  41. void gui_interface_draw_pixel(uint8_t x,uint8_t y,uint8_t show);  

  42.   

  43. #endif  



gui_interface.c


  1. /** 

  2. * Copyright (c), 2015-2025 

  3. * @file gui_interface.c 

  4. * @brief gui接口主文件 

  5. * @author jdh 

  6. * @date 2015/9/6 

  7. */  

  8.   

  9. /********************************************************************* 

  10. *                           头文件 

  11. **********************************************************************/  

  12.   

  13. #include "gui_interface.h"  

  14.   

  15. /********************************************************************* 

  16. *                           函数 

  17. **********************************************************************/  

  18.   

  19. /** 

  20. * @brief 画点 

  21. * @param x:x坐标 

  22. * @param y:y坐标 

  23. * @param show:0:不显示,1:显示 

  24. */  

  25.   

  26. void gui_interface_draw_pixel(uint8_t x,uint8_t y,uint8_t show)  

  27. {  

  28.     if (x >= LCD_WIDTH || y >= LCD_HEIGHT)  

  29.     {  

  30.         return;  

  31.     }  

  32.       

  33.     inf_lcd_draw_pixel(x,y,show);  

  34. }  



2D图形库:

gui_2d_lib.h


  1. /** 

  2. * Copyright (c), 2015-2025 

  3. * @file gui_2d_lib.c 

  4. * @brief 2d图形库主文件 

  5. * @author jdh 

  6. * @date 2015/9/6 

  7. * @update 2015/9/7 

  8. * @update 2015/11/22 

  9. */  

  10.   

  11. #ifndef _GUI_2D_LIB_H_  

  12. #define _GUI_2D_LIB_H_  

  13.   

  14. /********************************************************************* 

  15. *                           头文件 

  16. **********************************************************************/  

  17.   

  18. #include "gui_interface.h"  

  19.   

  20. /********************************************************************* 

  21. *                           函数 

  22. **********************************************************************/  

  23.   

  24. /** 

  25. * @brief 绘制水平线条 

  26. * @param y:y位置 

  27. * @param x0:x起始位置 

  28. * @param x1:x结束位置 

  29. */  

  30.   

  31. void gui_draw_hline(uint16_t y,uint16_t x0,uint16_t x1);  

  32.   

  33. /** 

  34. * @brief 绘制垂直线条 

  35. * @param x:x位置 

  36. * @param y0:y起始位置 

  37. * @param y1:y结束位置 

  38. */  

  39.   

  40. void gui_draw_vline(uint16_t x,uint16_t y0,uint16_t y1);  

  41.   

  42. /** 

  43. * @brief 绘制线条 

  44. * @param x0:x起始位置 

  45. * @param y0:y起始位置 

  46. * @param x1:x结束位置 

  47. * @param y2:y结束位置 

  48. */  

  49.   

  50. void gui_draw_line(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1);  

  51.   

  52. /** 

  53. * @brief 绘制矩形 

  54. * @param x0:左上角x坐标 

  55. * @param y0:左上角y坐标 

  56. * @param x1:右上角x坐标 

  57. * @param y2:右上角y坐标 

  58. */  

  59.   

  60. void gui_draw_rect(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1);  

  61.   

  62. /** 

  63. * @brief 填充矩形 

  64. * @param x0:左上角x坐标 

  65. * @param y0:左上角y坐标 

  66. * @param x1:右上角x坐标 

  67. * @param y2:右上角y坐标 

  68. * @param show:0:不显示,1:显示 

  69. */  

  70.   

  71. void gui_fill_rect(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint8_t show);  

  72.   

  73. /** 

  74. * @brief 在指定位置显示图片 

  75. * @param x:x坐标 

  76. * @param y:y坐标 

  77. * @param bmp:图片 

  78. */  

  79.   

  80. void gui_draw_bitmap(uint16_t x,uint16_t y,const uint8_t *bmp);  

  81.   

  82. #endif  

  83.   

  84.   

  85.   


gui_2d_lib.c

[cpp] view plain copy

  1. /** 

  2. * Copyright (c), 2015-2025 

  3. * @file gui_2d_lib.c 

  4. * @brief 2d图形库主文件 

  5. * @author jdh 

  6. * @date 2015/9/6 

  7. * @update 2015/9/7 

  8. * @update 2015/11/22 

  9. */  

  10.   

  11. /********************************************************************* 

  12. *                           头文件 

  13. **********************************************************************/  

  14.   

  15. #include "gui_2d_lib.h"  

  16. #include "string.h"  

  17.   

  18. /********************************************************************* 

  19. *                           数据结构 

  20. **********************************************************************/  

  21.   

  22. #pragma pack(1)  

  23.   

  24. /** 

  25. * @brief 文件头 

  26. */  

  27.   

  28. struct _Bmp_File_Header  

  29. {  

  30.     //文件标志  

  31.     uint16_t type;  

  32.     //文件大小  

  33.     uint32_t size;  

  34.     //保留  

  35.     uint16_t reserved1;  

  36.     //保留  

  37.     uint16_t reserved2;  

  38.     //位图偏移量  

  39.     uint32_t offbits;  

  40. };  

  41.   

  42. /** 

  43. * @bri信息头 

  44. */  

  45.   

  46. struct _Bmp_Info_Header  

  47. {  

  48.     //信息头大小  

  49.     uint32_t size;  

  50.     //位图宽度  

  51.     uint32_t width;  

  52.     //位图高度  

  53.     uint32_t height;  

  54.     //位图的位面数  

  55.     uint16_t planes;  

  56.     //每个像素点所需的数据位数(24)  

  57.     uint16_t offbits;  

  58.     //压缩算法  

  59.     uint32_t compression;  

  60.     //位图数据字节数  

  61.     uint32_t size_image;  

  62.     //以像素/米的单位表示水平分辨率  

  63.     uint32_t xpe_is_per_meter;  

  64.     //以像素/米的单位表示垂直分辨率  

  65.     uint32_t ype_is_per_meter;  

  66.     //位图使用的颜色数  

  67.     uint32_t color_used;  

  68.     //指定重要颜色数  

  69.     uint32_t color_important;  

  70. };  

  71.   

  72. #pragma pack()  

  73.   

  74. /********************************************************************* 

  75. *                           函数 

  76. **********************************************************************/  

  77.   

  78. /** 

  79. * @brief 绘制水平线条 

  80. * @param y:y位置 

  81. * @param x0:x起始位置 

  82. * @param x1:x结束位置 

  83. */  

  84.   

  85. void gui_draw_hline(uint16_t y,uint16_t x0,uint16_t x1)  

  86. {  

  87.     uint16_t x = 0;  

  88.       

  89.     for (x = x0;x <= x1;x++)  

  90.     {  

  91.         gui_interface_draw_pixel(x,y,1);  

  92.     }  

  93. }  

  94.   

  95. /** 

  96. * @brief 绘制垂直线条 

  97. * @param x:x位置 

  98. * @param y0:y起始位置 

  99. * @param y1:y结束位置 

  100. */  

  101.   

  102. void gui_draw_vline(uint16_t x,uint16_t y0,uint16_t y1)  

  103. {  

  104.     uint16_t y = 0;  

  105.       

  106.     for (y = y0;y <= y1;y++)  

  107.     {  

  108.         gui_interface_draw_pixel(x,y,1);  

  109.     }  

  110. }  

  111.   

  112. /** 

  113. * @brief 绘制线条 

  114. * @param x0:x起始位置 

  115. * @param y0:y起始位置 

  116. * @param x1:x结束位置 

  117. * @param y2:y结束位置 

  118. */  

  119.   

  120. void gui_draw_line(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1)  

  121. {  

  122.     float a = 0;  

  123.     float b = 0;  

  124.     float xx0 = x0;  

  125.     float yy0 = y0;  

  126.     float xx1 = x1;  

  127.     float yy1 = y1;  

  128.     uint16_t x = 0;  

  129.     uint16_t y = 0;  

  130.       

  131.     a = (yy0 - yy1) / (xx0 - xx1);  

  132.     b = yy0 - (yy0 - yy1) * x0 / (x0 - x1);  

  133.       

  134.     for (x = x0;x <= x1 - x0;x++)  

  135.     {  

  136.         y = a * x + b;  

  137.         gui_interface_draw_pixel(x,y,1);  

  138.     }  

  139. }  

  140.   

  141. /** 

  142. * @brief 绘制矩形 

  143. * @param x0:左上角x坐标 

  144. * @param y0:左上角y坐标 

  145. * @param x1:右上角x坐标 

  146. * @param y2:右上角y坐标 

  147. */  

  148.   

  149. void gui_draw_rect(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1)  

  150. {  

  151.     gui_draw_hline(y0,x0,x1);  

  152.     gui_draw_hline(y1,x0,x1);  

  153.     gui_draw_vline(x0,y0,y1);  

  154.     gui_draw_vline(x1,y0,y1);  

  155. }  

  156.   

  157. /** 

  158. * @brief 填充矩形 

  159. * @param x0:左上角x坐标 

  160. * @param y0:左上角y坐标 

  161. * @param x1:右上角x坐标 

  162. * @param y2:右上角y坐标 

  163. * @param show:0:不显示,1:显示 

  164. */  

  165.   

  166. void gui_fill_rect(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint8_t show)  

  167. {  

  168.     uint16_t i = 0;  

  169.     uint16_t j = 0;  

  170.       

  171.     for (i = x0;i <= x1;i++)  

  172.     {  

  173.         for (j = y0;j <= y1;j++)  

  174.         {  

  175.             gui_interface_draw_pixel(i,j,show);  

  176.         }     

  177.     }     

  178. }  

  179. /** 

  180. * @brief 在指定位置显示图片 

  181. * @param x:x坐标 

  182. * @param y:y坐标 

  183. * @param bmp:图片 

  184. */  

  185.   

  186. void gui_draw_bitmap(uint16_t x,uint16_t y,const uint8_t *bmp)  

  187. {  

  188.     struct _Bmp_File_Header bmp_file_header;  

  189.     struct _Bmp_Info_Header bmp_info_header;  

  190.     uint8_t *buf_pt = 0;  

  191.     uint16_t i = 0;  

  192.     uint16_t j = 0;  

  193.     uint8_t bit = 0;  

  194.     uint8_t index_bit = 0;  

  195.     uint16_t row = 0;  

  196.     uint16_t column = 0;  

  197.     uint16_t num_bit_invalid = 0;  

  198.       

  199.     //读取文件头  

  200.     memcpy(&bmp_file_header,bmp,sizeof(struct _Bmp_File_Header));  

  201.     //读取信息头  

  202.     memcpy(&bmp_info_header,bmp + sizeof(struct _Bmp_File_Header),sizeof(struct _Bmp_Info_Header));  

  203.     //图片数据  

  204.     buf_pt = (uint8_t *)bmp + bmp_file_header.offbits;  

  205.     //4字节对齐导致的无效位数  

  206.     num_bit_invalid = 32 - (bmp_info_header.width % 32);  

  207.       

  208.     //显示图片  

  209.     for (i = 0;i < bmp_info_header.width * bmp_info_header.height;i++)  

  210.     {  

  211.         bit = (*buf_pt >> (7 - index_bit)) & 0x1;  

  212.         inf_lcd_draw_pixel(x + column,y + bmp_info_header.height -1 - row,bit);  

  213.           

  214.         index_bit++;  

  215.         if (index_bit >= 8)  

  216.         {  

  217.             index_bit = 0;  

  218.             buf_pt++;  

  219.         }  

  220.           

  221.         column++;  

  222.         if (column >= bmp_info_header.width)  

  223.         {  

  224.             column = 0;  

  225.             row++;  

  226.               

  227.             //补齐  

  228.             for (j = 0;j < num_bit_invalid;j++)  

  229.             {  

  230.                 index_bit++;  

  231.                 if (index_bit >= 8)  

  232.                 {  

  233.                     index_bit = 0;  

  234.                     buf_pt++;  

  235.                 }  

  236.             }  

  237.         }  

  238.     }  

  239. }  

  240.   

  241.  


关键字:OLED屏  GUI支持  2D图形库 引用地址:为OLED屏增加GUI支持2:2D图形库

上一篇:为OLED屏增加GUI支持1:OLED驱动
下一篇:为OLED屏增加GUI支持4:文本框控件

推荐阅读最新更新时间:2024-03-16 15:26

LG将为小米供应曲面OLED 下半年Note机型或先用上
据The Investor网站北京时间4月19日报道,业界消息称,LG显示器将为姐妹公司LG电子、小米公司的下一款旗舰机供应OLED面板。这批OLED面板预计将从今年上半年开始发货,类似于三星电子旗舰智能机所使用的曲面屏。自从去年以来,LG显示器已为小米Note2供应了部分柔性OLED面板。但是由于LG显示器还在着手提高生产良率,OLED面板的全面生产尚未开始。 消息称,LG显示器的曲面OLED面板很可能用于LG电子、小米的更大尺寸手机——LG电子的V系列和小米的Note系列,这两种系列机型将在今年下半年发布。 LG显示器的第四代OLED面板月产量在2.2万块。接下来几个月,LG显示器将开始运营新的E5生产线,生产最新第六代OLE
[手机便携]
才是王道 三星QLED电视继续向OLED发起挑战
在美国及全球,三星都是第一大电视销售商,在过去10多年里它一直是第一名,2019看起来仍然会维持不变。 最近,三星推出一系列新电视,全是2019年的新品,比过去几年提前一个多月发布。与以往相比,新电视尺寸更大。在41款新电视中,有7款是75英寸版本,有8款达到80英寸甚至更大,其中还有一款98英寸8K电视。 自2016年以来,电视价格持续下跌,购物者用更大的电视替换主流电视,65英寸及更大屏幕的电视越来越流行。三星引用IHS Markit的报告说,2019年75英寸及更大屏幕的电视市场会增长43%,达到300万台,2022年增长到580万台。 三星力推大屏电视还有一个原因:在高端电视市场,三星最大的竞争对手是LG OLED电视,最
[家用电子]
大<font color='red'>屏</font>才是王道 三星QLED电视继续向<font color='red'>OLED</font>发起挑战
大小OLED都要被三星通吃?不知LGD会不会慌
我们都知道三星是小屏OLED的绝对霸主,而LGD则占据着大屏OLED的绝大多数市场。不过最近的一则消息,恐怕要颠覆这个格局。    最近有消息称三星Display将重启大尺寸OLED的投资,将于今年投建QD-OLED试产线,结合量子点和OLED面板,开发新的喷墨生产技术。预计2019上半年完成QD-OLED面板生产设备架设,2019下半年进入试产,试产规模约2万台左右。三星电子目前规划2020年,为QD-OLED电视试产阶段,2021年起正式进入量产。    大屏OLED,三星和LG都曾重点押注    大屏OLED方面,三星和LG都曾在2012年推出过55吋OLED电视,并在2013年试图商业化,但是没过一年,OLED最大
[家用电子]
大小<font color='red'>OLED</font><font color='red'>屏</font>都要被三星通吃?不知LGD会不会慌
OLED显示结构及其特点介绍
        O LED显示 屏是OEL显示技术的一种应用,在过去的十多年,越来越多的科研力量投入到 OLED 技术的研发中,O LED显示屏 结构以及OLED显示技术也越发的成熟。目前,OLED显示器在人们的日常生活中发挥着不可替代的作用。基于OLED显示屏的广泛应用,本章就OLED显示屏结构及其特点做简要分析。   为了形像说明OLED显示屏结构,可以将每个OLED单元比做一块汉堡包,发光材料就是夹在中间的蔬菜。每个OLED的显示单元都能受控制地产生三种不同颜色的光。OLED与LCD一样,也有主动式和被动式之分。被动方式下由行列地址选中的单元被点亮。主动方式下,OLED单元后有一个薄膜晶体管(TFT),发光单元在TFT
[手机便携]
浅析LED背光、LED显示OLED显示的区别
  LED背光是指用LED(发光二极管)来作为液晶显示屏的背光源,而LED背光显示器只是液晶显示器的背光源由传统的CCFL冷光灯管(类似日光灯)过度到LED(发光二极管)。液晶的成像原理可以简单的理解为,外界施加电压使液晶分子偏转便如闸门般地阻隔背光源发出光线的通透度,进而将光线投射在不同颜色的彩色滤光片中形成图像。   背光模组由CCFL过渡到LED可以带来很多好处,可以让显示器屏幕的亮度更加均匀,产品功耗更低,外形可以更轻薄时尚。但目前市场上普遍采用的是W-LED(白光LED)背光源,事实上这种背光源仅仅是将发光的元器件更换了而已,而显示效果的提升非常微弱甚至没有提升。而对液晶产品显示效果提升明显的RGB-LED(三色LE
[电源管理]
京东方加速量产OLED 2018年将为1900万台智能手机提供OLED
  10月26日,BOE( 京东方 )成都第6代柔性AM OLED 生产线量产,该生产线的成功量产不仅开启了柔性显示新纪元,也预示着中国企业开始在新型显示时代引领全球AM OLED 产业发展。对此,里昂证券(CLSA)金融分析师认为, 京东方 加速量产 OLED ,预计 京东方 将在2018年出货1900万片智能手机OLED屏,2019年出货4100万片。下面就随嵌入式小编一起来了解一下相关内容吧。 京东方加速量产OLED 2018年将为1900万台智能手机提供OLED屏   里昂证券表示,中国的主要智能手机制造商将在2018年2月或3月推出首款采用京东方柔性OLED屏的智能手机。如果京东方在2018年上半年宣布新的OL
[嵌入式]
中国OLED破壁 能否成为中国“第三张名片”
   OLED 分为PM OLED (无源驱动型)和AM OLED (有源驱动型)。除了技术上的区别之外,后者结构更加复杂、技术门槛高、需要更大的投资。相关数据显示, AMOLED 的市场空间大得多。下面就随手机便携小编一起来了解一下相关内容吧。 中国OLED屏破壁 能否成为中国“第三张名片”   苹果iPhoneX首次使用 AMOLED (有机发光二极管)屏,点燃了 AMOLED 的热潮。继韩国企业之后,中国各地纷纷上马AMOLED面板生产线,呈积极追赶之势。   国内京东方、和辉光电、天马、维信诺现已具备了少量AMOLED产能,TCL集团旗下的华星光电以及信利、柔宇科技等未来也将成为柔性AMOLED屏的供应商。   
[手机便携]
中国<font color='red'>OLED</font><font color='red'>屏</font>破壁 能否成为中国“第三张名片”
iPhone 12 mini销量不佳,苹果将补偿购买三星OLED的显示
外媒 MacRumors 报道,据《韩国先驱报》消息,由于 iPhone 12 mini 机型的需求低于预期,苹果很可能因 OLED 面板订单不足而向三星显示进行补偿。   据 Omdia 市场数据显示,三星 1 月份全球小尺寸 OLED 出货量月环比下降 9%,至 4500 万台,该公司将下降的原因归结为 iPhone 12 mini 销售低迷。一位业内人士表示,苹果很可能会因此对三星错失 OLED 面板采购目标进行补偿。   “目前还不确定苹果是否会向三星显示器支付罚金,但考虑到其合同历史和 iPhone 12 mini 销售低迷,苹果很可能会对三星进行补偿。”一位业内人士匿名表示。   三星是 iPhone 12
[手机便携]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved