s3c2440裸机-LCD编程(五、LCD上实现画点、线、圆)

发布时间:2023-08-02  

1.画点

无论是何种图形,都是基于点来构成的,因此我们需要先实现画点,其他的都是上层的一些数据处理了,像各种图形、甚至色彩鲜艳的图片无非都是一些由点构造出的数据而已。


我们在在farmebuffer.c实现画点,在geomentry.c实现画线、画圆等几何图形,font.c实现画字。


那么一个像素点要显示到lcd上,我们要知道它的位置坐标,然后还要知道它的颜色值,假设该像素点的坐标为(x,y),那么该像素的地址为:


(x,y)= fb_base + (xres*(bpp/8))*y +x*bpp/8;

那么所以在画点前需要先获取lcd参数:fb_base、xres、yres、bpp;


static unsigned int fb_base;

static int xres, yres, bpp;


void fb_get_lcd_params(void)

{

get_lcd_params(&fb_base, &xres, &yres, &bpp);

}

然后画点函数如下:


static unsigned int fb_base;

static int xres, yres, bpp;

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 / 8) * y + x * bpp / 8;


switch (bpp)//根据像素不同bpp格式,在Frame buffer中存放方式不一样,但对用户来说,不关心颜色格式,通通当做32位色颜色处理,所以这里需要做格式转换

{

case 8:

pc = (unsigned char *) pixel_base;

*pc = color;

break;

case 16:

pw = (unsigned short *) pixel_base;

*pw = convert32bppto16bpp(color);

break;

case 32:

pdw = (unsigned int *) pixel_base;

*pdw = color;

break;

}

}

用户传入的颜色数据一般都是32bit的,即格式为:0x00RRGGBB,


对于8PP,通过的是调色板索引实现的,这个后续再讲解,直接*pc = color即可(这样只取了高8位,低精度的数据就丢了)。


对于16PP,那么需要进行颜色转换后再存放进frame buffer。


对于32PP,大小刚好对应,直接*pc = color即可。


使用convert32bppto16bpp()函数进行颜色数据转换:


//先分别取出RGB,再相应的清除低位数据,实现将RGB888变为RGB565

unsigned short convert32bppto16bpp(unsigned int rgb)

{

int r = (rgb >> 16)& 0xff;

int g = (rgb >> 8) & 0xff;

int b = rgb & 0xff;

/* rgb565 */

r = r >> 3;//取低5位

g = g >> 2;//取低6位

b = b >> 3;//取低5位


return ((r<<11) | (g<<5) | (b));

}

2.画线画圆

画圆画线的具体原理不是本主题的重点,这些属于研究算法的范畴了,比如这里就有现成的算法可以用,如这篇博客:https://blog.csdn.net/p1126500468/article/details/50428613,里面有画圆画线的函数实现,直接使用就可以了,套用画点的"轮子"就可以了。


3.测试

新建一个geometry.c,复制博客中代码,替换里面的描点显示函数即可。


/* 画线 */

draw_line(0, 0, xres - 1, 0, 0xff0000); //(0,0) 到(xres - 1, 0)两点间的线

draw_line(xres - 1, 0, xres - 1, yres - 1, 0xffff00);

draw_line(0, yres - 1, xres - 1, yres - 1, 0xff00aa);

draw_line(0, 0, 0, yres - 1, 0xff00ef);

draw_line(0, 0, xres - 1, yres - 1, 0xff4500);

draw_line(xres - 1, 0, 0, yres - 1, 0xff0780);


delay(1000000);


/* 画圆 */

draw_circle(xres/2, yres/2, yres/4, 0xff00);

测试结果如下:

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>