LCD编程_画点线圆
上篇博客中进行了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中实现画点操作
#include "lcd.h" /* 实现画点 */ /* 获得LCD参数 */
static unsigned int fb_base;
static int xres, yres, bpp; void fb_get_lcd_params(void)
{
get_lcd_params(&fb_base, &xres, &yres, &bpp);
} /* rgb: 0x00RRGGBB */
unsigned short convert32bppto16bpp(unsigned int rgb)
{
int r = (rgb >> )& 0xff; /*将红色的值拿到*/
int g = (rgb >> ) & 0xff; /*将绿色的值拿到*/
int b = rgb & 0xff; /*将蓝色的值拿到*/ /* rgb565 */ /*需要将rgb组成一个16位的数,怎么组*/
r = r >> ; /*将红色的值右移3位,相当于取高5位。为什么这么取,得看16bpp数据的组织格式*/
g = g >> ; /*将绿色的值右移2位,相当于取高6位。为什么这么取,得看16bpp数据的组织格式*/
b = b >> ; /*将蓝色的值右移3位,相当于取高5位。为什么这么取,得看16bpp数据的组织格式*/ return ((r<<) | (g<<) | (b)); /*组合成16位的数据*/
} /* color : 32bit, 0x00RRGGBB
* color是32位的,用的lcd是16位的,因此需要将color转换成是16位的。
*/
void fb_put_pixel(int x, int y, unsigned int color)
{
unsigned char *pc; /* 8bpp */
unsigned short *pw; /* 16bpp */
unsigned int *pdw; /* 32bpp */ unsigned int pixel_base = fb_base + (xres * bpp / ) * y + x * bpp / ; switch (bpp)
{
case :
pc = (unsigned char *) pixel_base;
*pc = color; /*这个地方是有问题的,之所以将color直接赋给*pc,是因为程序压根不会走到这。因为所使用的lcd是16位的。*/
break;
case :
pw = (unsigned short *) pixel_base;
*pw = convert32bppto16bpp(color);
break;
case :
pdw = (unsigned int *) pixel_base;
*pdw = color;
break;
}
}
画线、画圆的操作在geometry.c中实现,它不是我们的重点,直接拿别人的使用即可。只需要将自己写的画点的函数fb_put_pixel用上即可
#include "framebuffer.h" /*
* http://blog.csdn.net/p1126500468/article/details/50428613
*/ //-------------画圆函数。参数:圆心,半径,颜色----------
// 画1/8圆 然后其他7/8对称画
// ---------------->X
// |(0,0) 0
// | 7 1
// | 6 2
// | 5 3
// (Y)V 4
//
// L = x^2 + y^2 - r^2
void draw_circle(int x, int y, int r, int color)
{
int a, b, num;
a = ;
b = r;
while( * b * b >= r * r) // 1/8圆即可
{
fb_put_pixel(x + a, y - b,color); // 0~1
fb_put_pixel(x - a, y - b,color); // 0~7
fb_put_pixel(x - a, y + b,color); // 4~5
fb_put_pixel(x + a, y + b,color); // 4~3 fb_put_pixel(x + b, y + a,color); // 2~3
fb_put_pixel(x + b, y - a,color); // 2~1
fb_put_pixel(x - b, y - a,color); // 6~7
fb_put_pixel(x - b, y + a,color); // 6~5 a++;
num = (a * a + b * b) - r*r;
if(num > )
{
b--;
a--;
}
}
} //-----------画线。参数:起始坐标,终点坐标,颜色--------
void draw_line(int x1,int y1,int x2,int y2,int color)
{
int dx,dy,e;
dx=x2-x1;
dy=y2-y1;
if(dx>=)
{
if(dy >= ) // dy>=0
{
if(dx>=dy) // 1/8 octant
{
e=dy-dx/;
while(x1<=x2)
{
fb_put_pixel(x1,y1,color);
if(e>){y1+=;e-=dx;}
x1+=;
e+=dy;
}
}
else // 2/8 octant
{
e=dx-dy/;
while(y1<=y2)
{
fb_put_pixel(x1,y1,color);
if(e>){x1+=;e-=dy;}
y1+=;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 8/8 octant
{
e=dy-dx/;
while(x1<=x2)
{
fb_put_pixel(x1,y1,color);
if(e>){y1-=;e-=dx;}
x1+=;
e+=dy;
}
}
else // 7/8 octant
{
e=dx-dy/;
while(y1>=y2)
{
fb_put_pixel(x1,y1,color);
if(e>){x1+=;e-=dy;}
y1-=;
e+=dx;
}
}
}
}
else //dx<0
{
dx=-dx; //dx=abs(dx)
if(dy >= ) // dy>=0
{
if(dx>=dy) // 4/8 octant
{
e=dy-dx/;
while(x1>=x2)
{
fb_put_pixel(x1,y1,color);
if(e>){y1+=;e-=dx;}
x1-=;
e+=dy;
}
}
else // 3/8 octant
{
e=dx-dy/;
while(y1<=y2)
{
fb_put_pixel(x1,y1,color);
if(e>){x1-=;e-=dy;}
y1+=;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 5/8 octant
{
e=dy-dx/;
while(x1>=x2)
{
fb_put_pixel(x1,y1,color);
if(e>){y1-=;e-=dx;}
x1-=;
e+=dy;
}
}
else // 6/8 octant
{
e=dx-dy/;
while(y1>=y2)
{
fb_put_pixel(x1,y1,color);
if(e>){x1-=;e-=dy;}
y1-=;
e+=dx;
}
}
}
}
}
3)在led_test.c中,需要测什么?看下图:
#include "geometry.h" void lcd_test(void)
{
unsigned int fb_base;
int xres, yres, bpp;
int x, y;
unsigned short *p;
unsigned int *p2; /* 初始化LCD */
lcd_init(); /* 使能LCD */
lcd_enable(); /* 获得LCD的参数: fb_base, xres, yres, bpp */
get_lcd_params(&fb_base, &xres, &yres, &bpp);
fb_get_lcd_params(); /* 往framebuffer中写数据 */
if (bpp == )
{
/* 让LCD输出整屏的红色 */ /* 565: 0xf800 */ p = (unsigned short *)fb_base;
for (x = ; x < xres; x++)
for (y = ; y < yres; y++)
*p++ = 0xf800; /* green */
p = (unsigned short *)fb_base;
for (x = ; x < xres; x++)
for (y = ; y < yres; y++)
*p++ = 0x7e0; /* blue */
p = (unsigned short *)fb_base;
for (x = ; x < xres; x++)
for (y = ; y < yres; y++)
*p++ = 0x1f; /* black */
p = (unsigned short *)fb_base;
for (x = ; x < xres; x++)
for (y = ; y < yres; y++)
*p++ = ; } delay(); /* 画线 */
draw_line(, , xres - , , 0xff0000);
draw_line(xres - , , xres - , yres - , 0xffff00);
draw_line(, yres - , xres - , yres - , 0xff00aa);
draw_line(, , , yres - , 0xff00ef);
draw_line(, , xres - , yres - , 0xff4500);
draw_line(xres - , , , yres - , 0xff0780); delay(); /* 画圆 */
draw_circle(xres/, yres/, yres/, 0xff00);
}
所看到的现象就是,lcd显输出整屏红色----->绿色------->蓝色------->黑色---------->画线--------->画圆
LCD编程_画点线圆的更多相关文章
- LCD编程_使用调色板
在前面的博客中,使用的像素格式都是16bpp,24bpp(24bpp实际实际上就是32bpp)?如果想使用8bpp时,就需要使用调色板. 在以前的博客中,曾经说过,在framebuffer中如果每个像 ...
- LCD编程_显示文字
在上篇博客中,实现了画点操作,然后在画点的基础上实现了画线.画圆的操作.实际上显示文字也是在画点的基础上实现的. 文字是由点组成的,那么这些点阵是在哪里获得的呢? 随便打开一个内核文件,搜索font, ...
- LCD编程_简单测试
首先,需要编写一个led_test.c的文件,依据代码框架,在led_test.c中我们能够看到的只是led.c.我们是看不到led_controller.c的.比如说,在led_test.c中,需要 ...
- Altium Designer 画"差分线"
Altium Designer 画"差分线" 如何在 Altium Designer 中快速进行差分对走线1:在原理图中让一对网络前缀相同,后缀分别为_N 和_P,并且加上差分队对 ...
- centos5.5字体为方块问题的解决_深入学习编程_百度空间
centos5.5字体为方块问题的解决_深入学习编程_百度空间 centos5.5字体为方块问题的解决 一.yum -y install fonts-chinese二.yum -y install f ...
- Matplotlib学习---用matplotlib画误差线(errorbar)
误差线用于显示数据的不确定程度,误差一般使用标准差(Standard Deviation)或标准误差(Standard Error). 标准差(SD):是方差的算术平方根.如果是总体标准差,那么用σ表 ...
- 20165325 2017-2018-2 《Java程序设计》结对编程_第二周:四则运算
20165325 2017-2018-2 <Java程序设计>结对编程_第二周:四则运算 一.码云链接 FAO项目的码云链接; 1.Git提交日志已经实现一个功能/一个bug修复的注释说明 ...
- 画删除线的方法,如何找替代方法,Deprecated注释
用@Deprecated注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择.在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告. 那么相应的替代方法应 ...
- Unity 场景中看不到物体或者OnDrawGizmos画的线看不到
有时候,Unity中的场景里面,物体突然看不见了,可以这样做: 首先,在 Hierarchy 面板选择看不见的物体,按下快捷键 f.如果物体还是看不见,见下图: 看看图中圈红的地方.如果,如果 ...
随机推荐
- [LeetCode] 269. Alien Dictionary 另类字典
There is a new alien language which uses the latin alphabet. However, the order among letters are un ...
- [LeetCode] 116. Populating Next Right Pointers in Each Node 每个节点的右向指针
You are given a perfect binary tree where all leaves are on the same level, and every parent has two ...
- nginx 配置实例(ssl、proxy、cache、gzip、upstream等优化)
[root@xxxxxxxxxxxxxx ~]# cat /usr/local/nginx/conf/nginx.conf user nobody; worker_processes ; worker ...
- Spring mvc 前后台通过json交互【转】
原文转自:https://www.cnblogs.com/zhaojiankai/p/8184596.html 本节内容: @RequestBody @ResponseBody 请求json,响应js ...
- python开发--信息处理系统
#!/usr/bin/python card_list=[] #定义列表变量 def show_menu(): print("*" * 10) print("名片管理系统 ...
- 团队作业第五次—项目冲刺-Day6
Day6 part1-SCRUM: 项目相关 作业相关 具体描述 所属班级 2019秋福大软件工程实践Z班 作业要求 团队作业第五次-项目冲刺 作业正文 hunter--冲刺集合 团队名称 hunte ...
- linux _文件目录与权限
1. 目录相关 . 代表次层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表目前使用者身份所在home目录 ~account 代表account这个使用者的home目录 cd 切换目录(c ...
- Linux内核中的并发与竞态概述
1.前言 众所周知,Linux系统是一个多任务的操作系统,当多个任务同时访问同一片内存区域的时候,这些任务可能会相互覆盖内存中数据,从而造成内存中的数据混乱,问题严重的话,还可能会导致系统崩溃. 2. ...
- 小程序1px边框在苹果机上变粗问题
在ios系统上1px的边框会变成2px,ui会感觉很粗 列表间隔,只需要一条边框 .border:after { position: absolute; content: ''; width: 100 ...
- TF-IDF & CNN
TF-IDF----------------------------------------------------------------认为一个单词出现的文本频率越小,它区别不同类别的能力就越大, ...