[原创] 我的5110画图库--Nokia 5110液晶屏实现画点、画线、画矩形、画圆和画图

ming1006   2012-10-12 22:24 楼主

  最近花了好多时间终于完成了5110液晶屏的画图函数库,完善了画图的基本函数,有画点,画直线,画折线,画矩形,画圆和贴图的基本功能。函数库提供了使用缓冲区和不使用缓冲区的函数,可以根据需要灵活使用。单片机使用的是stm32,但是我的做了宏定义,非常容易移植到其他单片机上,具体情况在代码注释中应该介绍的蛮详细的(注释花了我不少时间整理哦)。   在画图的算法上,我画直线采用了Bresenham算法,画圆是用的中点画圆法,不过我稍微改了一些,没有使用浮点数,还有在一些乘法计算时采用移位代替,这两点都使画图速度大大加快了。
  闲话少说,先上图吧!

 

 


再看看我的头文件都提供的哪些函数吧(个人觉得还是蛮多的):
  LCD5110.h

  1. #ifndef _LCD5110_H_
  2. #define _LCD5110_H_
  3.  
  4. /*--------修改本文件 <5110端口和引脚宏定义> 可以改变单片机引脚连线-------------*/
  5. /*----------如果要移植到其他单片机上只需再修改本文件的<5110引脚动-------------*/
  6. /*------------作宏定义>和LCD5110.c文件中LcdPortInit函数对单片机--------------*/
  7. /*--------------引脚的初始化,5110的VCC为3V时或显示不清时可以---------------*/
  8. /*-------------------修改LCD5110.c中LcdInit函数的配置----------------------*/
  9.  
  10. #include "stm32f0xx.h"
  11. #include "stm32f0xx_gpio.h"
  12. #include "Delay.h"
  13. #include "Font6_8.h"
  14. #include "Icon10_8.h"
  15. #include "Font8_16.h"
  16. #include "Font16_16.h"
  17. #include "Bitmap.h"
  18.  
  19.  
  20. /*------保留下面这句表示使用buf,注释掉表示不使用buf-----*/
  21. #define USE_BUF
  22. /*------保留上面这句表示使用buf,注释掉表示不使用buf-----*/
  23.  
  24. #define u8                 unsigned char
  25. #define u16         unsigned short
  26.  
  27. typedef struct
  28. {
  29.         u8 x;
  30.         u8 y;
  31. }point;
  32.  
  33. /*------5110屏幕尺寸和功能宏定义------*/
  34. #define DATA        1                                                                                                                                //数据
  35. #define CMD 0                                                                                                                                        //命令
  36. #define LCD_X        84                                                                                                                        //液晶屏横坐标宽度
  37. #define LCD_ROW LCD_X                                                                                                        //液晶屏列宽度
  38. #define LCD_Y        48                                                                                                                        //液晶屏纵坐标高度
  39. #define LCD_COLUMN LCD_Y / 8                                                                        //液晶屏行高度
  40. #define LCD_AREA LCD_X * LCD_Y                                                                //液晶屏面积
  41. #define LCD_AREA_BYTE LCD_COLUMN * LCD_ROW                //液晶屏字节容量
  42.  
  43. /*------位宏定义--------*/
  44. #define BIT0         0x00000001
  45. #define BIT1         0x00000002
  46. #define BIT2         0x00000004
  47. #define BIT3         0x00000008
  48. #define BIT4         0x00000010
  49. #define BIT5         0x00000020
  50. #define BIT6         0x00000040
  51. #define BIT7         0x00000080
  52. #define BIT8         0x00000100
  53. #define BIT9         0x00000200
  54. #define BIT10 0x00000400
  55. #define BIT11 0x00000800
  56. #define BIT12 0x00001000
  57. #define BIT13 0x00002000
  58. #define BIT14 0x00004000
  59. #define BIT15 0x00008000
  60.  
  61. /*------5110端口和引脚宏定义--------*/
  62.  
  63. #define LCD5110_PORT         GPIOB                                        //5110所在端口
  64. #define LCD_SCLK_BIT         BIT3                                        //SCLK端口位
  65. #define LCD_SDIN_BIT         BIT4                                        //SDIN端口位
  66. #define LCD_DC_BIT                  BIT5                                        //DC端口位
  67. #define LCD_SCE_BIT                BIT6                                        //SCE端口位
  68. #define LCD_REST_BIT         BIT7                                        //REST端口位
  69.  
  70.  
  71. /*------5110引脚动作宏定义-----------*/
  72. #define LCD_SCLK_H        LCD5110_PORT->BSRR = LCD_SCLK_BIT                //SCLK置1       
  73. #define LCD_SCLK_L  LCD5110_PORT->BRR  = LCD_SCLK_BIT                //SCLK置0
  74.  
  75. #define LCD_SDIN_H        LCD5110_PORT->BSRR = LCD_SDIN_BIT
  76. #define LCD_SDIN_L  LCD5110_PORT->BRR  = LCD_SDIN_BIT
  77.  
  78. #define LCD_DC_H                LCD5110_PORT->BSRR = LCD_DC_BIT
  79. #define LCD_DC_L          LCD5110_PORT->BRR  = LCD_DC_BIT
  80.  
  81. #define LCD_SCE_H                LCD5110_PORT->BSRR = LCD_SCE_BIT
  82. #define LCD_SCE_L          LCD5110_PORT->BRR  = LCD_SCE_BIT
  83.  
  84. #define LCD_REST_H        LCD5110_PORT->BSRR = LCD_REST_BIT
  85. #define LCD_REST_L  LCD5110_PORT->BRR  = LCD_REST_BIT
  86.  
  87. #define RCC_LCD5110_PORT         RCC_AHBENR_GPIOAEN << (((uint32_t)LCD5110_PORT-(uint32_t)GPIOA) >> 10)                        //5110 RCC使能
  88.  
  89. /*--------------------------------------------------------------------------------------------------------------*/
  90. /*-------函数分不使用buf和使用buf,不使用buf最快,但是行不是任意坐标,是在5110本身的行的基础上定义的;----------*/
  91. /*-------画的图案的高度必须是8的倍数,而且图案不能相或来进行叠加。使用buf的话不论是写字还是画图都没有-----------*/
  92. /*-------坐标限制,图案宽度和高度也没有限制,而且可以进行图案和字符的叠加。使用buf的函数分两类,一类------------*/
  93. /*-------是只对buf操作,大部分以tobuf,ofbuf,buf结尾比如PutChartoBuf、PutCircletoBuf、ClearBuf,这一类-----------*/
  94. /*-------函数操作完后需要调用Refresh、RefreshAll这两个函数将buf的变化刷新到5110上,较灵活,可以通过减-----------*/
  95. /*-------少刷新次数来加快画图速度。另一种是对buf操作后自动将结果刷新到5110上,大部分以buf开头,如BufPutChar-----*/
  96. /*-------、BufPutHanzi等,还有画点画线画圆函数PutLine、PutRect等。----------------------------------------------*/
  97.  
  98. /////////////////////////////////////////////////////////////////////////////////////////////////////
  99. /////*                                以下为不使用缓冲区写字画图的相关函数                                *//////
  100. //*--------------------------------------------------------*//
  101. /////////////////////////////////////////////////////////////////////////////////////////////////////
  102.  
  103.  
  104. //*******                                以下是基本操作和初始化函数                                *****//
  105.  
  106. /*----------初始化5110-----------*/
  107. void InitLcd(void);
  108. /*-------清空整个5110屏幕--------*/
  109. void LcdClearAll(void);
  110. /*---设置5110行和列坐标----*/
  111. void SetXY(u8 row,u8 column);
  112.  
  113. //******                                以下是高度为8的各种操作函数                                *******//
  114. //**                        包括6*8字符和字符串,6*8符号,10*8图标                          **//
  115. //--every row contains 14 characters,there are 6 rows (font = 6 * 8)--//
  116.                 //-----------------           row                  ---------------------//
  117.                 //0 1 2 3 4 5 6 7 8 9 10 11 12 13//                column = 0
  118.                 //0 1 2 3 4 5 6 7 8 9 10 11 12 13//                column = 1
  119.                 //0 1 2 3 4 5 6 7 8 9 10 11 12 13//                column = 2
  120.                 //0 1 2 3 4 5 6 7 8 9 10 11 12 13//                column = 3
  121.                 //0 1 2 3 4 5 6 7 8 9 10 11 12 13//                column = 4
  122.                 //0 1 2 3 4 5 6 7 8 9 10 11 12 13//                column = 5
  123. //-------------------------------------------------------//
  124.  
  125. /*---直接写一个ASCII字符(6*8)到5110(不需要坐标,紧跟上个字符或图标)---*/
  126. void WriteChar(u8 value);
  127. /*---直接写一个ASCII字符(6*8)到5110---*/
  128. void PutChar(u8 value,u8 column,u8 row);
  129. /*---直接写一个字符串(6*8)到5110(不需要坐标,紧跟上个字符或图标)---*/
  130. void WriteStr(char * str);
  131. /*--直接写一个字符串(6*8)到5110--*/
  132. void PutStr(char * str,u8 column,u8 row);
  133. /*---画sign(6*8)(不需要坐标,紧跟上个字符或图标)---*/
  134. void WriteSign(char * sign);
  135. /*----画sign(6*8)----*/
  136. void PutSign(char * sign,u8 column,u8 row);
  137. /*---画Icon(10*8)(不需要坐标,紧跟上个字符或图标)---*/
  138. void WriteIcon(char * icon);
  139. /*--画Icon(10*8),row(0~74)--*/
  140. void PutIcon(char * icon,u8 column,u8 row);
  141.  
  142. //********                                以下是高度为16的各种操作函数                                *******//
  143. //**                                包括8*16字符和字符串,16*16汉字                           **//
  144. //--every row contains 10 characters,there are 3 rows (font = 8 * 16)--//
  145. //-----------       row       ------------//
  146.                 //0 1 2 3 ... 81 82 83//        column = 0
  147.                 //0 1 2 3 ... 81 82 83//
  148.                 //0 1 2 3 ... 81 82 83//        column = 1
  149.                 //0 1 2 3 ... 81 82 83//
  150.                 //0 1 2 3 ... 81 82 83//        column = 2
  151.                 //0 1 2 3 ... 81 82 83//
  152. //-----------------------------------------//
  153.  
  154. /*-----直接写一个ASCII字符(8*16)到5110------*/
  155. void PutWideChar(u8 value,u8 column,u8 row);
  156. /*--直接写一个字符串(6*8)到5110,自动换行,row(0~76)--*/
  157. void PutWideStr(char * str,u8 column,u8 row);
  158.  
  159. //--every row contains 5 characters,there are 3 rows (font = 16 * 16)--//
  160. //----------      row       --------------//
  161.                 //0 1 2 3 ... 81 82 83//        column = 0
  162.                 //0 1 2 3 ... 81 82 83//
  163.                 //0 1 2 3 ... 81 82 83//        column = 1
  164.                 //0 1 2 3 ... 81 82 83//
  165.                 //0 1 2 3 ... 81 82 83//        column = 2
  166.                 //0 1 2 3 ... 81 82 83//
  167. //----------------------------------------//
  168.  
  169. /*-----直接写一个汉字(16*16)到5110------*/
  170. void PutHanzi(char Hanzi[],u8 column,u8 row);
  171. /*--写一串汉字(16*16),自动换行,row(0~58)--*/
  172. void PutHanziStr(char Hanzi[],u8 column,u8 row,u8 num);
  173.  
  174. //********                                以下是画图的各种操作函数                                *********//
  175. //**                                  包括84*48,高度为8的倍数的图片                       **//
  176. //---------------           x                  ----------------------//
  177.                 //0 1 2 3 4 5 6 7 8 9 10 11 12 13//                y = 0
  178.                 //0 1 2 3 4 5 6 7 8 9 10 11 12 13//                y = 1
  179.                 //0 1 2 3 4 5 6 7 8 9 10 11 12 13//                y = 2
  180.                 //0 1 2 3 4 5 6 7 8 9 10 11 12 13//                y = 3
  181.                 //0 1 2 3 4 5 6 7 8 9 10 11 12 13//                y = 4
  182.                 //0 1 2 3 4 5 6 7 8 9 10 11 12 13//                y = 5
  183. //-----------------------------------------------//
  184.  
  185. /*---画picture(84*48),全屏---*/
  186. void DrawPicture(char bitmap[]);
  187. /*---画picture(高度必须是8的倍数)---*/
  188. void DrawBmp(char bitmap[],u8 x,u8 y,u8 width,u8 height);
  189.  
  190. #ifdef USE_BUF        /*USE_BUF*/
  191.  
  192. /////////////////////////////////////////////////////////////////////////////////////////////////////
  193. /////*                                以下为使用缓冲区写字画图的相关函数                                *//////
  194. //*-------------以下坐标统一为两种----------------*//
  195. /////////////////////////////////////////////////////////////////////////////////////////////////////
  196. //----------------------           x                  ------------------------//
  197.                 //0 1 2 3 4 5 ...78 79 80 81 82 83//                y = 0
  198.                 //0 1 2 3 4 5 ...78 79 80 81 82 83//                y = 1
  199.                 //0 1 2 3 4 5 ...78 79 80 81 82 83//                y = 2
  200.                 //                                                        .
  201.  
提示词:如果您需要查看本帖隐藏内容,请登录或者注册

回复评论 (50)

回复 楼主 ming1006 的帖子

好东西!谢谢楼主的无私奉献。
点赞  2012-10-12 23:39

回复 沙发 IC爬虫 的帖子

多谢支持啊!
点赞  2012-10-13 00:07
前两天刚刚搞过5110,不过没有LZ这么深入。:carnation:
点赞  2012-10-14 22:51

真的,这回我顶你!

真的,这回我顶你!
点赞  2012-10-15 11:10

不错,顶

http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2012-10-15 12:20

回复 4楼 眼大5子 的帖子

接下去希望能继续拓展功能,不知道还能加些什么
点赞  2012-10-15 22:34

回复 5楼 gaupen1186 的帖子

呵呵,真心谢了
点赞  2012-10-15 22:34

回复 6楼 ddllxxrr 的帖子

多谢捧场啊
点赞  2012-10-15 22:35
楼主很有心,做这个东西很好
点赞  2012-10-16 12:17
搞点通用菜单嘛  楼主
点赞  2012-10-16 12:57
谢谢你的建议,有时间会考虑做个,最近还有些事情要做,以后应该会完善
点赞  2012-10-16 16:02

看来楼主这C语言的功底还挺深厚的嘛

看来楼主这C语言的功底还挺深厚的嘛..........
点赞  2012-10-16 22:21
楼主真的很强大!
点赞  2012-10-18 09:07
哥啊,你好有才啊,顶一个。
点赞  2012-10-18 15:03
不知道我那个破诺基亚里面是不是这个显示屏,拆了看看。
点赞  2012-10-18 15:04

回复 16楼 gaoyang9992006 的帖子

Nokia 5110 和3110都是这个屏幕
点赞  2012-10-18 23:16
这个真的不错哦
点赞  2012-10-26 00:00
很有学习价值的东东
点赞  2012-10-26 10:55
怎么按引脚定义接好了,5110显示不了啊
点赞  2012-11-3 20:46
123下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复