历史上的今天
返回首页

历史上的今天

今天是:2024年10月09日(星期三)

正在发生

2021年10月09日 | S3C2440裸机------LCD_画点线圆

2021-10-09 来源:eefocus

1.画点

我们首先实现画点的函数,

 

#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 >> 16)& 0xff;

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

int b = rgb & 0xff;

 

/* rgb565 */

r = r >> 3;

g = g >> 2;

b = b >> 3;

 

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

}

 

 

/* color : 32bit, 0x00RRGGBB

 *

 */

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)

{

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;

}

}

 

2.画线、圆

画线和画圆的函数我们没必要自己写,直接从网上找,然后把里面的画点函数替换成我们的即可。


 

#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 = 0;  

b = r;  

while(22 * 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 > 0)  

{

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>=0)

{

if(dy >= 0) // dy>=0  

{

if(dx>=dy) // 1/8 octant  

{

e=dy-dx/2;  

while(x1<=x2)

{

fb_put_pixel(x1,y1,color);  

if(e>0){y1+=1;e-=dx;}    

x1+=1;  

e+=dy;  

}

}

else // 2/8 octant

{

e=dx-dy/2;  

while(y1<=y2)

{

fb_put_pixel(x1,y1,color);  

if(e>0){x1+=1;e-=dy;}    

y1+=1;  

e+=dx;  

}

}

}

else // dy<0  

{

dy=-dy;   // dy=abs(dy)  

if(dx>=dy) // 8/8 octant  

{

e=dy-dx/2;  

while(x1<=x2)

{

fb_put_pixel(x1,y1,color);  

if(e>0){y1-=1;e-=dx;}    

x1+=1;  

e+=dy;  

}

}

else // 7/8 octant

{

e=dx-dy/2;  

while(y1>=y2)

{

fb_put_pixel(x1,y1,color);  

if(e>0){x1+=1;e-=dy;}    

y1-=1;  

e+=dx;  

}

}

}    

}

else //dx<0  

{

dx=-dx; //dx=abs(dx)  

if(dy >= 0) // dy>=0  

{

if(dx>=dy) // 4/8 octant  

{

e=dy-dx/2;  

while(x1>=x2)

{

fb_put_pixel(x1,y1,color);  

if(e>0){y1+=1;e-=dx;}    

x1-=1;  

e+=dy;  

}

}

else // 3/8 octant

{

e=dx-dy/2;  

while(y1<=y2)

{

fb_put_pixel(x1,y1,color);  

if(e>0){x1-=1;e-=dy;}    

y1+=1;  

e+=dx;  

}

}

}

else // dy<0  

{

dy=-dy;   // dy=abs(dy)  

if(dx>=dy) // 5/8 octant  

{

e=dy-dx/2;  

while(x1>=x2)

{

fb_put_pixel(x1,y1,color);  

if(e>0){y1-=1;e-=dx;}    

x1-=1;  

e+=dy;  

}

}

else // 6/8 octant

{

e=dx-dy/2;  

while(y1>=y2)

{

fb_put_pixel(x1,y1,color);  

if(e>0){x1-=1;e-=dy;}    

y1-=1;  

e+=dx;  

}

}

}    

}

 }

 

3.lcd_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 == 16)

{

/* 让LCD输出整屏的红色 */

 

/* 565: 0xf800 */

 

p = (unsigned short *)fb_base;

for (x = 0; x < xres; x++)

for (y = 0; y < yres; y++)

*p++ = 0xf800;

 

/* green */

p = (unsigned short *)fb_base;

for (x = 0; x < xres; x++)

for (y = 0; y < yres; y++)

*p++ = 0x7e0;

 

/* blue */

p = (unsigned short *)fb_base;

for (x = 0; x < xres; x++)

for (y = 0; y < yres; y++)

*p++ = 0x1f;

 

/* black */

p = (unsigned short *)fb_base;

for (x = 0; x < xres; x++)

for (y = 0; y < yres; y++)

*p++ = 0;

}

else if (bpp == 32)

{

/* 让LCD输出整屏的红色 */

 

/* 0xRRGGBB */

 

p2 = (unsigned int *)fb_base;

for (x = 0; x < xres; x++)

for (y = 0; y < yres; y++)

*p2++ = 0xff0000;

 

/* green */

p2 = (unsigned int *)fb_base;

for (x = 0; x < xres; x++)

for (y = 0; y < yres; y++)

*p2++ = 0x00ff00;

 

/* blue */

p2 = (unsigned int *)fb_base;

for (x = 0; x < xres; x++)

for (y = 0; y < yres; y++)

*p2++ = 0x0000ff;

 

/* black */

p2 = (unsigned int *)fb_base;

for (x = 0; x < xres; x++)

for (y = 0; y < yres; y++)

*p2++ = 0;

 

}

 

delay(1000000);

/* 画线 */

draw_line(0, 0, xres - 1, 0, 0xff0000);

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);

}

推荐阅读

史海拾趣

ENPIRION公司的发展小趣事

在经历了几年的快速发展后,ENPIRION公司被Altera公司收购。这一收购标志着ENPIRION公司进入了一个新的发展阶段。在Altera公司的支持下,ENPIRION公司得以继续扩大其研发和生产能力,推出更多创新的产品和服务。同时,随着人工智能、物联网和大数据技术的不断发展,ENPIRION公司也积极探索新的应用领域和市场机会,为其未来发展奠定了坚实的基础。

以上五个故事概述了ENPIRION公司在电子行业中的发展历程和关键里程碑。通过这些故事,我们可以看到ENPIRION公司凭借技术创新、市场扩展和合作伙伴关系等关键因素取得了显著的成功。

Cornerstone Sensors公司的发展小趣事

Cornerstone Sensors一直致力于技术创新和产品升级。公司不断投入研发资源,探索传感器技术的新应用和新领域。例如,公司率先推出了具有自校准功能的智能传感器,大大提高了产品的使用便捷性和准确性。此外,Cornerstone Sensors还积极探索物联网、人工智能等新兴技术与传感器的结合点,为行业发展注入了新的活力。

ETI Systems公司的发展小趣事

ETI Systems深知在电子行业中,单打独斗很难取得长远的发展。因此,公司积极寻求与行业内外的合作伙伴建立战略合作关系。通过与多家知名企业和研究机构的合作,ETI Systems不仅获得了宝贵的技术支持,还拓展了市场渠道和客户资源。这种合作与共赢的伙伴关系,为ETI Systems的快速发展奠定了坚实的基础。

Cretex Companies Inc公司的发展小趣事

在电子行业的早期,Cretex Companies Inc.凭借对半导体技术的深入研究和创新,迅速崭露头角。公司研发出一款具有高效能、低功耗特点的芯片,这一技术突破使得电子设备的性能大幅提升,同时降低了能耗。凭借这一优势,Cretex的产品在市场上获得了广泛认可,公司规模逐渐扩大。

B&F Fastener Supply公司的发展小趣事

随着全球电子市场的不断扩大,B&F Fastener Supply公司开始将目光投向海外市场。公司积极开拓国际市场,与多个国家和地区的电子企业建立合作关系。同时,B&F还加大了对海外市场的投入力度,通过设立海外分支机构、参加国际展会等方式提升品牌知名度和市场份额。

这些故事虽然基于假设和推测,但试图展现了B&F Fastener Supply公司在电子行业中的可能发展历程。请注意,这些故事并非真实事件,仅用于说明公司在电子行业发展的可能性和方向。

Chiefdom Electronic Co Ltd公司的发展小趣事

随着全球化的深入发展,Chiefdom Electronic Co Ltd意识到国际化布局对于提升竞争力的重要性。公司开始积极拓展海外市场,设立海外研发中心和销售网络,以便更好地了解当地市场需求和文化特点。通过本地化运营和定制化服务,公司成功打入多个国际市场,并获得了良好的业绩回报。这些国际化布局不仅提升了公司的整体竞争力,还为其在全球电子行业中占据了更加重要的地位。

问答坊 | AI 解惑

二层交换机最小系统开发板v1.0

本开发板命名为Landbcm 2008 下面开始介绍介绍Landbcm 2008 1.Landbcm 2008系统框图 1.Landbcm 2008学习板提供了 硬件: 1个WAN口, 1个100M以太网口, 4M Flash,16M SDRAM , 主控芯片为BCM47XX , 交换芯片为BCM5XXX 软件: 全套开发 ...…

查看全部问答>

请教在vs2005中编译Iperf?

小弟准备测试下网络,下了Iperf源代码。用在ARMV4I  wince 6.0上。 但是不知道怎么在VS2005下面编译 目前SDK已经导出 哪位老大有成功的经验,分享下,多谢了!…

查看全部问答>

AT88SC0104CIIC通信怎么操作?

哪位大吓操作过AT88SC0104CIIC?它的通信是和普通EEPROM一样操作吗?…

查看全部问答>

有没有人会在FC6下共享WINDOWS2003下的HP Deskjet1180c打印机呢?

各们FC6的高手们,大家谁会在FC6下共享WINDOWS2003下的HP Deskjet1180c打印机呢?共享一下经验吧,我每天的工作都无法正常进行了,打了很多地方都没有找到相关的资料,在 www.linuxsir.org里发贴好几天竟然没有人会贴,看来没有人会了,eeworld里有 ...…

查看全部问答>

黑夜自动点亮的过道灯电路

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 时间:2009-09-18 13:19:01 …

查看全部问答>

STM32FSMC驱动9325,出现不同程度的数据丢失现象?

                                 我用STM32驱动9325,出现不同程度的数据丢失想象。主要表现为,刷整屏一个颜色的时候,有类似于暗点的情况。且每次 ...…

查看全部问答>

ucosII我要弄到中断中断程序放在什么地方呢

                                  …

查看全部问答>

程序进不了TIMER0中断

在startup.c中已注册Timer0AIntHandler中断,但调试时进不了中断 #include \"C:/StellarisWare/inc/hw_ints.h\" #include \"C:/StellarisWare/inc/hw_memmap.h\" #include \"C:/StellarisWare/inc/hw_types.h\" // #include \"C:/StellarisWare ...…

查看全部问答>

ADC10 在5110上显示

下面是我程序的主函数,我用g2553调试AD并在5110上显示; 这里面寄存器相对于149啥的变化真不少,麻烦大家前来指正,不吝赐教! void main(void) {         WDTCTL = WDTPW + WDTHOLD;         syscl ...…

查看全部问答>

C2000建个工程太复杂了

在网上找一个案例,建了一下工程,实在是太复杂了,现在都不太明白建的原理,不知有谁有快速建工程的方案没…

查看全部问答>