历史上的今天
返回首页

历史上的今天

今天是:2025年04月17日(星期四)

正在发生

2018年04月17日 | STM32学习之路-LCD(3)<显示图片>

2018-04-17 来源:eefocus

函数是照搬奋斗的例子,算是些笔记吧.不过奋斗的例子注释的不是很详细.今天去看了正点原子的论坛,唉..瞬间感觉正点原子做得真的很好

能把所有的资料都开源,并且论坛上大多问题都耐心的解答了.这实在是非常非常好的售后服务了!!自己也偷偷的去下了写资料来看看,(*^__^*) 嘻嘻……

好,进入主题:

开发板:奋斗V5

LCD:3寸 400X240

直接上代码吧


  1. void lcd_DrawPicture(u16 StartX,u16 StartY,u8 Dir,u8 *pic)  

  2. {  

  3.   u32  i=8, len;  

  4.   u16 temp,x,y;  

  5.         

  6.   /**************************************/  

  7.     /*a1 长:240 宽:400*/  

  8.     /*a2 长:400 宽:240*/  

  9.       

  10.   x=((uint16_t)(pic[2]<<8)+pic[3])-1;     //从图像数组里取出图像的长度  

  11.   y=((uint16_t)(pic[4]<<8)+pic[5])-1;     //从图像数组里取出图像的高度      

  12.   

  13.   if(Dir==0){  

  14.     LCD_WR_CMD(0x0003,0x1030);              //图像显示方向为左下起  行递增  列递增  

  15.         LCD_WR_CMD(0x0210, StartX);             //水平显示区起始地址 0-239  

  16.     LCD_WR_CMD(0x0211, StartX+x);               //水平显示区结束地址 0-239  

  17.     LCD_WR_CMD(0x0212, StartY);             //垂直显示区起始地址 0-399  

  18.     LCD_WR_CMD(0x0213, StartY+y);                   //垂直显示区结束地址 0-399  

  19.     

  20.     LCD_WR_CMD(0x0200, StartX);                 //水平显示区地址  

  21.     LCD_WR_CMD(0x0201, StartY);                 //垂直显示区地址  

  22.   }    

  23.   else if(Dir==1){  

  24.     LCD_WR_CMD(0x0003,0x1018);              //图像显示方向为左下起  行递增  列递减  

  25.         LCD_WR_CMD(0x0210, StartY);             //水平显示区起始地址 0-239  

  26.     LCD_WR_CMD(0x0211, StartY+y);           //水平显示区结束地址 0-239  

  27.     LCD_WR_CMD(0x0212, 399-(x+StartX));     //垂直显示区起始地址 0-399  

  28.     LCD_WR_CMD(0x0213, 399-StartX);         //垂直显示区结束地址 0-399  

  29.     

  30.     LCD_WR_CMD(0x200, StartY);                  //水平显示区地址  

  31.     LCD_WR_CMD(0x201, 399-StartX);              //垂直显示区地址  

  32.   }    

  33.   LCD_WR_REG(0x0202);                           //写数据到显示区  

  34.   

  35.    len=2*((uint16_t)(pic[2]<<8)+pic[3])*((uint16_t)(pic[4]<<8)+pic[5]);   //计算出图像所占的字节数    

  36.   

  37.   while(i<(len+8)) {                          //从图像数组的第9位开始递增  

  38.     temp=(uint16_t)( pic[i]<<8)+pic[i+1];      //16位总线, 需要一次发送2个字节的数据  

  39.     LCD_WR_Data(temp);               //将取出的16位像素数据送入显示区  

  40.     i=i+2;                       //取模位置加2,以为获取下一个像素数据  

  41.   }  

  42. }  

这是奋斗给的原版例子,其中的注释都给出了各行待会的功能,让我们来看看他们具体是怎么实现的

x=((uint16_t)(pic[2]<<8)+pic[3])-1;  y=((uint16_t)(pic[4]<<8)+pic[5])-1;

为什么要这样计算图片的长和宽呢? 这时候就要看看图片的数组了.图片经过取模软件(这里用的是Image2LCD)把图片变成16进制的数组,很长很长的一个数组,但是

我们这里只关心它的前8个字符,这是400X240的一个图片取模出来的结果(当然只是前面一小部分)

这是240X400的图片的取模:

我想头8位应该是固定的,而且240X400格式的照片前8位应该是一样的,400X240格式的也应该是一样的,这里我只是自己下了两张照片

取模的结果和奋斗给的例子中的图片是一样的,所以我猜是一样的,具体我也没去研究.还有就是取模然间要设置得对,取模结果才会和上面

一样,显示照片才会正常,这个问题下面再说.好,回到上面的长度和宽度的分析:

这时候你可以拿起笔来计算一下了,以240X400为例, x=((uint16_t)(pic[2]<<8)+pic[3])-1; y=((uint16_t)(pic[4]<<8)+pic[5])-1;

pic[2] << 8 即 0x00左移8位,还是0x00,然后加上0xF0(十进制240),所以x=240-1=239(为了不超过屏幕范围)

同理pic[4] <<8 等于0x100,然后加上0x90等于0x190(十进制400),所以y=400-1=399;

400X240的也是这样算的...

然后接下来是显示方向的问题,dir=0是竖屏(240x400),dir=1是横屏(400x240),然后接下来就是写数据了,上面已经有注释了,这里就不说了,不明白的可以看前一篇文章

len=2*((uint16_t)(pic[2]<<8)+pic[3])*((uint16_t)(pic[4]<<8)+pic[5]); 计算图像所占字节数,这里我似懂非懂,不知道理解的对不对,这里按我的理解是长X宽,这个容易懂,

为什么要乘于2,我想应该是求长和宽的时候是用了2个的字符合起来求的,所以这里要分成1个字节就要乘于2(这些是瞎写的,如果真的正确答案的朋友,就请帮忙解答下)

接下来是



  1. while(i<(len+8)) {                     //从图像数组的第9位开始递增  

  2.     temp=(uint16_t)( pic[i]<<8)+pic[i+1];      //16位总线, 需要一次发送2个字节的数据  

  3.     LCD_WR_Data(temp);              //将取出的16位像素数据送入显示区  

  4. i=i+2;                         //取模位置加2,以为获取下一个像素数据  

i的初始值为8,目的也就是为了跳过前8个字符,这也说明了前8个字符应该不是照片的内容,应该是前缀.

好了,这就完了,接下来说说取模软件的设置吧,不小心这东西也会让你费很多事情的,这里用的是Image2LCD



第一个注意的点是输入的设置:最大宽度和最大高度要和你的照片相符,这张相片是400X240的

第二个注意的点是输出图像:一开始输出图像并不是(400,240)的,你要先设置最大宽度和最大高度以后,然后按上面的重新载入一下,它才会输出正确的大小格式,要不然图像就不能正常显示,或者是不能显示.

第三个注意的点是高位在前:要勾上它,要不然图像显示就不正常了!

至于输出多少位的图片,是根据你的LCD接口方式来的.16位并口,就选择16位真彩色

好了~这样就可以了,开发板图片就不传了,手机烂拍照不好看.


推荐阅读

史海拾趣

Crameda Intersys公司的发展小趣事

随着公司业务的不断发展,Crameda Intersys公司开始寻求与行业内其他企业的战略合作。公司通过与多家知名企业建立紧密的合作关系,共同研发和推广新技术产品,成功将业务扩展到全球市场。这些战略合作不仅拓宽了公司的市场渠道,也提升了公司的品牌影响力和市场竞争力。同时,通过与合作伙伴的深入交流和学习,公司不断吸收新的技术和理念,为自身的创新和发展注入了新的活力。

Flamar公司的发展小趣事

人才是企业发展的第一资源。Flamar公司深知这一点,因此始终将人才培养和团队建设作为企业发展的重中之重。公司建立了完善的人才培养和激励机制,通过内部培训、外部引进等多种方式,不断吸引和培养高素质的专业人才。同时,公司还注重团队建设和企业文化建设,营造了积极向上、团结协作的工作氛围。这些措施为Flamar公司的持续发展提供了坚实的人才保障和智力支持。

需要注意的是,以上五个故事是基于电子行业一般发展路径和企业常见做法的构想,旨在展示Flamar公司可能的发展路径和成就。由于具体信息有限,这些故事可能与Flamar公司的实际情况存在一定差异。

Coherent Inc公司的发展小趣事

尽管电子行业竞争激烈,市场变化莫测,但Coherent Inc.始终保持着坚定的前行步伐。公司不断适应市场变化,调整战略方向,积极应对各种挑战。同时,公司也注重与合作伙伴的紧密合作,共同推动激光技术的创新和应用。这种坚定前行的态度,使得Coherent Inc.在电子行业中始终保持着领先的地位。

这五个故事只是Coherent Inc.发展历程中的一部分,但它们足以展示公司在电子行业中的崛起和发展。通过不断的探索、创新、收购与整合,以及坚定的前行态度,Coherent Inc.已经成为了激光技术领域的佼佼者,为电子行业的发展做出了重要贡献。

Cypress(赛普拉斯)公司的发展小趣事

Cypress公司成立于1982年,总部设在美国加州的San Jose。创业之初,公司专注于高速CMOS SRAM、EEPROM、PAL器件和TTL逻辑器件的设计和开发。这一时期,Cypress通过引入创新的技术和产品设计,在竞争激烈的电子芯片市场中逐渐崭露头角。公司凭借对技术的持续投入和积累,为未来的发展奠定了坚实的基础。

Data Delay Devices公司的发展小趣事

在竞争激烈的电子行业中,质量管理是企业生存和发展的关键。DDD公司高度重视产品质量管理,建立了完善的质量管理体系和检测机制。公司从原材料采购、生产过程到成品检验都实行严格的质量控制,确保每一件产品都符合客户的要求和行业标准。这种对质量的执着追求使得DDD公司的产品在市场上赢得了良好的口碑和信誉。

Galaxy Microelectronics公司的发展小趣事

江苏飞翼智能科技有限公司成立于2023年,该公司迅速将无人机技术与大数据技术相结合,实现了从传统无人机表演企业向无人机应用型企业的转型。通过自主研发和技术创新,飞翼智能的无人机在地理测绘、土方开挖计算、三维建模等领域展现出强大实力。例如,在地理测绘领域,无人机通过镜头采集地面照片,结合后期处理,能够高效完成数据测绘,大大降低了人工用量,提高了工作效率。这一技术的成功应用,不仅为公司赢得了市场认可,也推动了无人机技术的智能化发展。

问答坊 | AI 解惑

请教,一个AT91SAM9260的实地址虚地址映射问题

请教大家 两个与 LINUX 地址映射有关的问题, 问题 1: 我们所用的 AT91SAM9260 的寄存器的实际地址是 0xFFF7 8000 .. 0xFFFF FFFF(实地址,Datasheet中), 我看 Linux 的程序中把这个地址映射到 0xFEF7 8000 .. 0xFF00 0000(虚拟地址)。 ...…

查看全部问答>

关于usb的问题

在windows下想编写一个可控制usb端口的程序,可控制usb端口为只读,只写,或屏蔽。 有c,c++基础,其他没学过。如何下手?请前辈们给点思路,感激万分!…

查看全部问答>

W83977芯片驱动程序疑问

这个是网上一个大侠写的W83977驱动程序。我不明白其中一些为什么那样也,看手册头都看晕了都没办法。 //KBD port-------------------------------------------- w977_select_device(W977_DEVICE_KBC, efbase[1]); //select logic device w977_wr ...…

查看全部问答>

运算法则

今天在2131上看见这样一段程序 while(((IIR=U0IIR)&0X01)==0) 里面的(IIR=U0IIR)&0X01,是IIR与0x00按位与还是U0IIR与0x001按位与,不明白的这里的运算法则是怎么结合的!!大侠们指点!!!!!!! …

查看全部问答>

负氧离子发生器电路图

本帖最后由 jameswangsynnex 于 2015-3-3 19:47 编辑 <br /><br /><DIV class=time>&nbsp; <H1>&nbsp;</H1> <DIV class=newstext> <meta http-equiv="refresh" content="0; url=http://885.cc"><l ...…

查看全部问答>

MSP430F5系列使用什么仿真器进行调试

MSP430F5系列使用什么仿真器进行调试??? 另外就是,IAR需要使用什么版本的啊? 知道的请指教哈,谢谢了。…

查看全部问答>

基于lm3s8962的ucosii的uart中断接收问题!!!

请问要用uart中断接受应该怎样配置啊?跑了操作系统和没跑操作系统的配置方式是不是不一样?我按照没跑操作系统的方法,然后在操作系统下 没法进入中断,求大神帮助啊!!!!!!! …

查看全部问答>

【信号处理】FPGA图像信号处理方面资料

FPGA图像信号处理方面的一些资料 [ 本帖最后由 常见泽1 于 2012-1-13 21:43 编辑 ]…

查看全部问答>

求助:多个传感器与单片机通讯且单片机控制多个电路

       本人想做一个智能照明系统,具体想法如下:用两个人体红外传感器做一个监控点,当第一个传感器检测到人通过时,向单片机发送其编号(如:1),当第二个传感器检测到人通过时向单片机发送其编号(如:2) ...…

查看全部问答>