STM32学习之路-LCD(3)

发布者:花海鱼最新更新时间:2018-04-17 来源: eefocus关键字:STM32  LCD  显示图片 手机看文章 扫描二维码
随时随地手机看文章

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

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

好,进入主题:

开发板:奋斗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位真彩色

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


关键字:STM32  LCD  显示图片 引用地址:STM32学习之路-LCD(3)

上一篇:STM32F4——TFT-LCD原理及FSMC
下一篇:STM32-FSMC-NOR FLASH

推荐阅读最新更新时间:2024-03-16 16:00

STM32程序中使用printf打印中文字符乱码
前言: 相信同我一样,有一部分同学在写单片机程序的时候喜欢用printf打印相关信息到串口,然后在串口调试助手看数据变化。 但是我之前在使用printf去打印中文字符的时候,出现了乱码,这种问题以前也碰到过,只是没去深究为什么,往往都是重新建工程,写代码。 但是时隔很久,又再次碰到这个问题,就想好好把这个问题修改完, 我是使用的IAR平台,使用的keil的小伙伴也可以用这个方法解决,都是一样的。 1、首先看一下错误。串口打印中文,串口助手出现乱码。经检查不是波特率的问题 因为每次用CubeMX配置完之后生成代码,IAR都是以默认编码UTF-8编码的,所以导致了中文乱码,如果设置成系统设置,也会乱码,错误设置如下(同
[单片机]
<font color='red'>STM32</font>程序中使用printf打印中文字符乱码
cjson移植到stm32遇到问题
1、创建的cJSON对象root,没有cJSON_Delete(root);执行一次就死机了 2、cJSON解析的root得到的字符串char *str,free(str),执行n次后就返回信息错误了。改成myfree(str)后运行正常了。
[单片机]
STM32—ADC单通道采集模拟量
前言: 最近在调试STM32L152芯片ADC单通道采集数据程序,总结下STM32L152芯片ADC单通道采集模拟量的使用方法。 硬件平台:STM32L152 软件平台:keil v5+cubeMX 函数库:HAL库 ADC配置过程: 1.先初始化ADC的管脚,本例中ADC对应PA1管脚。 ADC_HandleTypeDef hadc; void ADC_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; /*Configure GPIO pin : PA1 */ GPIO_InitStructure.Pin = GPIO_PIN_1;
[单片机]
stm32NVIC与外部中断
实现功能:外部中断线0(PA0)与线15(PA15)分别连接到两个按钮,一个按钮用于产生上升沿,另一个用于产生下降沿,两个中断函数里均对PA8口连接的led灯取反,同时PD2连接的led灯随意延时取反指示程序运行。 这次我用了官方提供的例程来构建自己的工程,这样可以省下不少时间,而且减少了出错率,调试起来容易多了。 首先是stm32中断与外部中断的概念。 ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。 STM32可支持
[单片机]
stm32NVIC与外部中断
STM32 字节对齐 #pragma pack
1、对齐原则 min(sizeof(word ), 4) = 2,因此是 2 字节对齐,而不是我们认为的 4 字节对齐。 1)每个成员分别按自己的方式对齐,并能最小化长度; 2)复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度; 3)对齐后的结构体整体长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。 对于数组,比如 char a : 它的对齐方式和分别写 3 个 char 是一样的,也就是说它还是按 1 个字节对齐; 如果是 typedef char Array3 : Array3 这种类型的对齐方式还是按 1 个字节
[单片机]
刷新LCD投影仪行业里程碑 BOE(京东方)携手小明投影正式开启LCD投影仪4K时代
近日,BOE(京东方)携手LCD投影仪行业领导者小明投影在北京恒通国际创新园(UCP)召开2023年投影仪旗舰新品发布会,联合推出两款划时代新品:搭载BOE(京东方)4K LCD显示屏的小明V1 Ultra超高清投影仪及搭载BOE(京东方)璨光S60光机的小明V1高亮投影仪。单片式LCD 4K投影仪、“璨光”系列高亮光机两款新品发布是BOE(京东方)在投影仪行业树立的技术产品里程碑,不仅彰显了BOE(京东方)创立三十年来在LCD领域的技术创新实力,也是BOE(京东方)在“屏之物联”战略指导下开拓全新应用场景的最新成果之一。 根据洛图数据显示,2017年以来中国智能投影市场销量持续增长,2022年已超600万台。从不同投影
[家用电子]
刷新<font color='red'>LCD</font>投影仪行业里程碑  BOE(京东方)携手小明投影正式开启<font color='red'>LCD</font>投影仪4K时代
更快、更灵活的探针问市——STM8 和STM32微控制器
意法半导体推出了 STLINK-V3 下一代 STM8 和 STM32微控制器 代码烧写及调试探针,进一步改进代码烧写及调试灵活性,提高效率。STLINK-V3支持大容量存储,具有虚拟COM端口和多路桥接功能,烧写性能是上一代探针的三倍,产品价格具市场竞争力,节省应用开发时间,简化设备现场重新编程流程。 除提供典型的JTAG /串行线调试(SWD)和单线接口模块(SWIM)连接外,STLINK-V3的虚拟COM端口(VCP)和多路桥接器还可以通过UART、I2C、SPI或CAN接口或GPIO引脚与微控制器通信,方便开发人员使用自定义控制命令自动执行测试,并在PC主机上观察运行时数据,或者使用STLINK-V3配合引导加载
[测试测量]
更快、更灵活的探针问市——STM8 和<font color='red'>STM32</font>微控制器
基于STM32的步进电机速度控制
项目需求 在制作一个使用全向轮的机器人底盘,对于全向轮,电机的精度是影响效果的重要因素。所以使用了步进电机,使用步进电机的优点是可以不使用编码器,开环控制即可达到高精度的效果。 调整占空比或者调整周期 众所周知,PWM有两个重要参数,周期与占空比。 步进电机的运动方式是,每收到一个脉冲,就旋转指定的角度。因此影响电机速度的唯一参数就是PWM的频率。以下附图两张来说明调整占空比与调整周期的区别。 周期固定,调整占空比 上图中有4个PWM,它们的周期是一样的,不同之处是拥有从80%至20%的占空比。可以看出,无论占空比为多少,在1s内,它们产生的高电平的数量是一样的,即无论占空比为多少,PWM的频率都一致。因此也就无法调整步进
[单片机]
基于<font color='red'>STM32</font>的步进电机速度控制
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved