上篇博客中进行了lcd的简单测试,这篇博客将进行更加复杂的测试——画点、画线、画圆。画线和画圆是在画点的基础上实现的,因此本篇博客重点实现画点操作。

先抛出这样的一个问题,已知:

(x,y)的坐标;

bpp;

xres;

yres;

那么,如何在framebuffer中获得像素的地址呢?

(x,y)像素的起始地址 = fb_base +(xres * bpp /8)* y +x * bpp/8

(xres * bpp /8)表示一行占据多少个字节,乘以y表示y行共占据多少个像素

2)在framebuffer.c中实现画点操作

 1 #include "lcd.h"
 2
 3 /* 实现画点 */
 4
 5 /* 获得LCD参数 */
 6 static unsigned int fb_base;
 7 static int xres, yres, bpp;
 8
 9 void fb_get_lcd_params(void)
10 {
11     get_lcd_params(&fb_base, &xres, &yres, &bpp);
12 }
13
14 /* rgb: 0x00RRGGBB */
15 unsigned short convert32bppto16bpp(unsigned int rgb)
16 {
17     int r = (rgb >> 16)& 0xff;    /*将红色的值拿到*/
18     int g = (rgb >> 8) & 0xff;     /*将绿色的值拿到*/
19     int b = rgb & 0xff;            /*将蓝色的值拿到*/
20
21     /* rgb565 */                   /*需要将rgb组成一个16位的数,怎么组*/
22     r = r >> 3;                    /*将红色的值右移3位,相当于取高5位。为什么这么取,得看16bpp数据的组织格式*/
23     g = g >> 2;                        /*将绿色的值右移2位,相当于取高6位。为什么这么取,得看16bpp数据的组织格式*/
24     b = b >> 3;                        /*将蓝色的值右移3位,相当于取高5位。为什么这么取,得看16bpp数据的组织格式*/
25
26     return ((r<<11) | (g<<5) | (b));  /*组合成16位的数据*/
27 }
28
29
30 /* color : 32bit, 0x00RRGGBB
31  * color是32位的,用的lcd是16位的,因此需要将color转换成是16位的。
32  */
33 void fb_put_pixel(int x, int y, unsigned int color)
34 {
35     unsigned char  *pc;  /* 8bpp */
36     unsigned short *pw;  /* 16bpp */
37     unsigned int   *pdw; /* 32bpp */
38
39     unsigned int pixel_base = fb_base + (xres * bpp / 8) * y + x * bpp / 8;
40
41     switch (bpp)
42     {
43         case 8:
44             pc = (unsigned char *) pixel_base;
45             *pc = color;  /*这个地方是有问题的,之所以将color直接赋给*pc,是因为程序压根不会走到这。因为所使用的lcd是16位的。*/
46             break;
47         case 16:
48             pw = (unsigned short *) pixel_base;
49             *pw = convert32bppto16bpp(color);
50             break;
51         case 32:
52             pdw = (unsigned int *) pixel_base;
53             *pdw = color;
54             break;
55     }
56 }

画线、画圆的操作在geometry.c中实现,它不是我们的重点,直接拿别人的使用即可。只需要将自己写的画点的函数fb_put_pixel用上即可

  1 #include "framebuffer.h"
  2
  3 /*
  4  * http://blog.csdn.net/p1126500468/article/details/50428613
  5  */
  6
  7  //-------------画圆函数。参数:圆心,半径,颜色----------
  8  //        画1/8圆 然后其他7/8对称画
  9  //          ---------------->X
 10  //          |(0,0)   0
 11  //          |       7     1
 12  //          |      6       2
 13  //          |       5     3
 14  //       (Y)V          4
 15  //
 16  //      L = x^2 + y^2 - r^2
 17  void draw_circle(int x, int y, int r, int color)
 18  {
 19      int a, b, num;
 20      a = 0;
 21      b = r;
 22      while(22 * b * b >= r * r)          // 1/8圆即可
 23      {
 24          fb_put_pixel(x + a, y - b,color); // 0~1
 25          fb_put_pixel(x - a, y - b,color); // 0~7
 26          fb_put_pixel(x - a, y + b,color); // 4~5
 27          fb_put_pixel(x + a, y + b,color); // 4~3
 28
 29          fb_put_pixel(x + b, y + a,color); // 2~3
 30          fb_put_pixel(x + b, y - a,color); // 2~1
 31          fb_put_pixel(x - b, y - a,color); // 6~7
 32          fb_put_pixel(x - b, y + a,color); // 6~5
 33
 34          a++;
 35          num = (a * a + b * b) - r*r;
 36          if(num > 0)
 37          {
 38              b--;
 39              a--;
 40          }
 41      }
 42  }
 43
 44  //-----------画线。参数:起始坐标,终点坐标,颜色--------
 45  void draw_line(int x1,int y1,int x2,int y2,int color)
 46  {
 47      int dx,dy,e;
 48      dx=x2-x1;
 49      dy=y2-y1;
 50      if(dx>=0)
 51      {
 52          if(dy >= 0) // dy>=0
 53          {
 54              if(dx>=dy) // 1/8 octant
 55              {
 56                  e=dy-dx/2;
 57                  while(x1<=x2)
 58                  {
 59                      fb_put_pixel(x1,y1,color);
 60                      if(e>0){y1+=1;e-=dx;}
 61                      x1+=1;
 62                      e+=dy;
 63                  }
 64              }
 65              else         // 2/8 octant
 66              {
 67                  e=dx-dy/2;
 68                  while(y1<=y2)
 69                  {
 70                      fb_put_pixel(x1,y1,color);
 71                      if(e>0){x1+=1;e-=dy;}
 72                      y1+=1;
 73                      e+=dx;
 74                  }
 75              }
 76          }
 77          else            // dy<0
 78          {
 79              dy=-dy;   // dy=abs(dy)
 80              if(dx>=dy) // 8/8 octant
 81              {
 82                  e=dy-dx/2;
 83                  while(x1<=x2)
 84                  {
 85                      fb_put_pixel(x1,y1,color);
 86                      if(e>0){y1-=1;e-=dx;}
 87                      x1+=1;
 88                      e+=dy;
 89                  }
 90              }
 91              else         // 7/8 octant
 92              {
 93                  e=dx-dy/2;
 94                  while(y1>=y2)
 95                  {
 96                      fb_put_pixel(x1,y1,color);
 97                      if(e>0){x1+=1;e-=dy;}
 98                      y1-=1;
 99                      e+=dx;
100                  }
101              }
102          }
103      }
104      else //dx<0
105      {
106          dx=-dx;     //dx=abs(dx)
107          if(dy >= 0) // dy>=0
108          {
109              if(dx>=dy) // 4/8 octant
110              {
111                  e=dy-dx/2;
112                  while(x1>=x2)
113                  {
114                      fb_put_pixel(x1,y1,color);
115                      if(e>0){y1+=1;e-=dx;}
116                      x1-=1;
117                      e+=dy;
118                  }
119              }
120              else         // 3/8 octant
121              {
122                  e=dx-dy/2;
123                  while(y1<=y2)
124                  {
125                      fb_put_pixel(x1,y1,color);
126                      if(e>0){x1-=1;e-=dy;}
127                      y1+=1;
128                      e+=dx;
129                  }
130              }
131          }
132          else            // dy<0
133          {
134              dy=-dy;   // dy=abs(dy)
135              if(dx>=dy) // 5/8 octant
136              {
137                  e=dy-dx/2;
138                  while(x1>=x2)
139                  {
140                      fb_put_pixel(x1,y1,color);
141                      if(e>0){y1-=1;e-=dx;}
142                      x1-=1;
143                      e+=dy;
144                  }
145              }
146              else         // 6/8 octant
147              {
148                  e=dx-dy/2;
149                  while(y1>=y2)
150                  {
151                      fb_put_pixel(x1,y1,color);
152                      if(e>0){x1-=1;e-=dy;}
153                      y1-=1;
154                      e+=dx;
155                  }
156              }
157          }
158      }
159  }    

3)在led_test.c中,需要测什么?看下图:

 1 #include "geometry.h"
 2
 3 void lcd_test(void)
 4 {
 5     unsigned int fb_base;
 6     int xres, yres, bpp;
 7     int x, y;
 8     unsigned short *p;
 9     unsigned int *p2;
10
11     /* 初始化LCD */
12     lcd_init();
13
14     /* 使能LCD */
15     lcd_enable();
16
17     /* 获得LCD的参数: fb_base, xres, yres, bpp */
18     get_lcd_params(&fb_base, &xres, &yres, &bpp);
19     fb_get_lcd_params();
20
21     /* 往framebuffer中写数据 */
22     if (bpp == 16)
23     {
24         /* 让LCD输出整屏的红色 */
25
26         /* 565: 0xf800 */
27
28         p = (unsigned short *)fb_base;
29         for (x = 0; x < xres; x++)
30             for (y = 0; y < yres; y++)
31                 *p++ = 0xf800;
32
33         /* green */
34         p = (unsigned short *)fb_base;
35         for (x = 0; x < xres; x++)
36             for (y = 0; y < yres; y++)
37                 *p++ = 0x7e0;
38
39         /* blue */
40         p = (unsigned short *)fb_base;
41         for (x = 0; x < xres; x++)
42             for (y = 0; y < yres; y++)
43                 *p++ = 0x1f;
44
45         /* black */
46         p = (unsigned short *)fb_base;
47         for (x = 0; x < xres; x++)
48             for (y = 0; y < yres; y++)
49                 *p++ = 0;
50
51     }
52
53
54     delay(1000000);
55
56     /* 画线 */
57     draw_line(0, 0, xres - 1, 0, 0xff0000);
58     draw_line(xres - 1, 0, xres - 1, yres - 1, 0xffff00);
59     draw_line(0, yres - 1, xres - 1, yres - 1, 0xff00aa);
60     draw_line(0, 0, 0, yres - 1, 0xff00ef);
61     draw_line(0, 0, xres - 1, yres - 1, 0xff4500);
62     draw_line(xres - 1, 0, 0, yres - 1, 0xff0780);
63
64     delay(1000000);
65
66     /* 画圆 */
67     draw_circle(xres/2, yres/2, yres/4, 0xff00);
68 }

所看到的现象就是,lcd显输出整屏红色----->绿色------->蓝色------->黑色---------->画线--------->画圆

转载于:https://www.cnblogs.com/-glb/p/11360985.html

LCD编程_画点线圆相关推荐

  1. pygame zero趣味编程_画圆

    import pgzrun def draw():screen.fill((128,200,120)) #背景填充色,括号内是RGB值(取值在0--255之间)screen.draw.circle(( ...

  2. 华兴数控g71外圆循环编程_数控G71内外圆粗车循环指令教案

    G71 内外圆粗车循环指令 一. 场地安全: 1 .强调实习课堂安全要求: 2 .上机安全操作规程. 二. 教学目的: 知识目标 : 1 .了解并掌握 G71 指令的功能和格式. 2 .理解并掌握 G ...

  3. QT学习笔记-画点线圆

    widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui {class Widget; }class ...

  4. LeafletJS 简单使用2 - 地图标点L.marker()、清除标点removeLayer、点击地图标点、清除地图map.remove()、画点线L.polygon()、画圆L.circle()

    目录 1. 业务需求 2. 代码示例 注意的点 补充示例:`L.polygon()` 画点线.`L.circle()` 画圆(该文档中未涉及) 3. 页面展示 1. 业务需求 现有数据:初始经纬度信息 ...

  5. 画箱线图_箱线图的N种画法

    图中标示了箱线图中每条线和点表示的含义,其中应用到了分位数的概念 线的主要包含五个数据节点,将一组数据从大到小排列,分别计算出他的上边缘(Maximum),上四分位数(Q3),中位数(Median), ...

  6. python k线图和指标_量化交易中,如何使用Python画K线、成交量、买卖点【邢不行】...

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. [历史文章汇总] 请点击此处 这是邢不行第  68 ...

  7. python绘制彩色同心圆_少儿编程之画十个彩色同心圆

    少儿编程之画十个彩色同心圆 上节课我们学习了,彩色圆环的画法.那这一节课只要对上节课进行适当修改一下,就可以变成了画同心圆的程序了. 一.首先,我们修改一下角色,打开scratch软件后删除默认的角色 ...

  8. python移动平均线绘图_对python pandas 画移动平均线的方法详解

    数据文件 66001_.txt 内容格式: date,jz0,jz1,jz2,jz3,jz4,jz5 2012-12-28,0.9326,0.8835,1.0289,1.0027,1.1067,1.0 ...

  9. 手绘线条一直画不直_板绘画线手抖?线画不直?板绘练习画线技巧攻略!

    板绘画线手抖?线画不直?很多人画画都时先画草稿再线稿最后上色,所以线条就非常重要!但这对于刚接触手绘板的小伙伴不太友好,毕竟使用板绘跟使用纸和笔画画的差别还是蛮大的.因此,就会遇到连条流畅圆滑的线都画 ...

最新文章

  1. Ubuntu管理开机自启动程序
  2. 深度学习时间序列预测:GRU算法构建多变量时间序列预测模型+代码实战
  3. 两篇文章说中断和异常之一
  4. Android中利用隐式意图发送短信
  5. Java开发之掌握JSP技术
  6. centos6.5安装配置zabbix3.0.3
  7. Pandas 文本数据方法 cat()
  8. crontab 定时备份 出现permission:denied
  9. LeetCode 127. 单词接龙(广度优先遍历)
  10. sql数据库自动增量备份_SQL自动增量
  11. greensock 框架
  12. python3实用编程技巧_Python3实用编程技巧进阶一
  13. centos7 分辨率修改,CentOS 7 修改屏幕分辨率
  14. 如何使用Depend工具分析DLL
  15. 简述观察法的优缺点_各种观察法的优缺点
  16. luogu P3527 [POI2011]MET-Meteors
  17. discard是什么意思啊(discard是什么意思翻译)
  18. Linux 实用指令 -- 网络配置(查看网络IP和网关、 ping 测试主机之间网络连通、Linux网络环境配置(指定固定ip))
  19. 【SHOI2001】洛谷2530 化工厂装箱员
  20. 如何将json类型的数据转换成csv格式

热门文章

  1. 业务流程分析的主要方法
  2. LTE中常见的专业词汇缩写
  3. 北京师范大学珠海分校课件资源库
  4. json串反转义(消除反斜杠)
  5. uni-app 跨平台、项目级别的请求库 luch-request封装
  6. java面试宝典2019(好东西先留着)
  7. [转]一个优秀的php相册系统——Coppermine Photo Gallery
  8. 失荆州,败夷陵影响有多大
  9. 【Shell】Shell变量及相关操作
  10. 图像的正交变换---沃尔什——哈达马变换