祝大家端午和六一快乐!原本今天是想歇息歇息的,可是实在无奈没什么事干.所以就来学习学习LCD显示图片的函数

函数是照搬奋斗的样例,算是些笔记吧.只是奋斗的样例凝视的不是非常具体.今天去看了正点原子的论坛,唉..瞬间感觉正点原子做得真的非常好

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

好,进入主题:

开发板:奋斗V5

LCD:3寸 400X240

直接上代码吧

void lcd_DrawPicture(u16 StartX,u16 StartY,u8 Dir,u8 *pic)
{
u32 i=8, len;
u16 temp,x,y; /**************************************/
/*a1 长:240 宽:400*/
/*a2 长:400 宽:240*/ x=((uint16_t)(pic[2]<<8)+pic[3])-1; //从图像数组里取出图像的长度
y=((uint16_t)(pic[4]<<8)+pic[5])-1; //从图像数组里取出图像的高度 if(Dir==0){
LCD_WR_CMD(0x0003,0x1030); //图像显示方向为左下起 行递增 列递增
LCD_WR_CMD(0x0210, StartX); //水平显示区起始地址 0-239
LCD_WR_CMD(0x0211, StartX+x); //水平显示区结束地址 0-239
LCD_WR_CMD(0x0212, StartY); //垂直显示区起始地址 0-399
LCD_WR_CMD(0x0213, StartY+y); //垂直显示区结束地址 0-399 LCD_WR_CMD(0x0200, StartX); //水平显示区地址
LCD_WR_CMD(0x0201, StartY); //垂直显示区地址
}
else if(Dir==1){
LCD_WR_CMD(0x0003,0x1018); //图像显示方向为左下起 行递增 列递减
LCD_WR_CMD(0x0210, StartY); //水平显示区起始地址 0-239
LCD_WR_CMD(0x0211, StartY+y); //水平显示区结束地址 0-239
LCD_WR_CMD(0x0212, 399-(x+StartX)); //垂直显示区起始地址 0-399
LCD_WR_CMD(0x0213, 399-StartX); //垂直显示区结束地址 0-399 LCD_WR_CMD(0x200, StartY); //水平显示区地址
LCD_WR_CMD(0x201, 399-StartX); //垂直显示区地址
}
LCD_WR_REG(0x0202); //写数据到显示区 len=2*((uint16_t)(pic[2]<<8)+pic[3])*((uint16_t)(pic[4]<<8)+pic[5]); //计算出图像所占的字节数 while(i<(len+8)) { //从图像数组的第9位開始递增
temp=(uint16_t)( pic[i]<<8)+pic[i+1]; //16位总线, 须要一次发送2个字节的数据
LCD_WR_Data(temp); //将取出的16位像素数据送入显示区
i=i+2; //取模位置加2,以为获取下一个像素数据
}
}

这是奋斗给的原版样例,当中的凝视都给出了各行待会的功能,让我们来看看他们详细是怎么实现的

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宽,这个easy懂,

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

接下来是

 while(i<(len+8)) {					  //从图像数组的第9位開始递增
temp=(uint16_t)( pic[i]<<8)+pic[i+1]; //16位总线, 须要一次发送2个字节的数据
LCD_WR_Data(temp);<span style="white-space:pre"> </span>//将取出的16位像素数据送入显示区
i=i+2; //取模位置加2,以为获取下一个像素数据

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

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

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

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

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

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

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

STM32学习之路-LCD(3)&lt;显示图片&gt;的更多相关文章

  1. STM32学习之路-LCD(4)&lt;显示字符&gt;

    昨晚疯狂的打了一夜的LOL,感觉L多了,今天一天精神萎靡.还是继续把显示字符给看了,可是在犹豫要不要写这篇文章 事实上写的东西也就是copy别人家的代码,不想写那么多,就记录下自己困惑的地方吧.也许改 ...

  2. STM32学习之路-LCD(2)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011791262/article/details/27711881 这些天一直在研究LCD的初始化 ...

  3. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

  4. (stm32学习总结)—LCD—液晶显示

    显示器简介 显示器属于计算机的 I/O 设备,即输入输出设备.它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具.常见的有 CRT 显示器.液晶显示器.LED 点阵显示器及OLED 显示器 本章 ...

  5. AntDesign vue学习笔记(六)Table 显示图片

    AntDeign官网上没有table动态绑定显示图片的示例,baidu上搜索出来的大部分都是React语法,无法使用. 经过摸索,实现方法如下:以显示一个图片,一个按钮为例(picurl是返回的jso ...

  6. STM32学习之路之入门篇

    2006年ARM公司推出了基于ARMV7架构的cortex系列的标准体系结构,以满足各种技术得不同性能要求,包含了A,R,M三个分工明确的系列 其中A系列面向复杂的尖端应用程序,用于运行开放式的复杂操 ...

  7. STM32学习之路-感觉自己走到了一个天大的坑里了!

    先前兴致勃勃的来弄16位并口驱动LCD.本以为就须要改下LCD IC的初始化即可了,没想到弄了这么多天最终发现自己走进了一个深坑了 T T 原因是我的开发板是奋斗V5的, 它确实有MCU外扩IO口, ...

  8. STM32学习之路-SysTick的应用(时间延迟)

    开发板:奋斗V5 好~ 菜B要来搞实验了.. 前面已经说了SysTick的工作原理什么的了,这里就不说了.. 先来做第一个实验: 盗自奋斗的样例,嘿嘿, 用SysTick产生1ms的基准时间,产生中断 ...

  9. STM32学习之路之MDK安装篇

随机推荐

  1. win32 api Windows窗口的创建

    windows窗口的创建有以下几个步骤: 1.创建注册窗口类 2.创建窗口句柄 3.显示更新窗口 4.消息循环 1.创建注册窗口类 所谓创建窗口类就是定义一个WNDCLASS类对象,并将该对象进行初始 ...

  2. ssh连接Linux自动断开后再也无法连上的问题

    近期公司测试机有点抓狂,情况是这样的:用SSH登录后正常使用,但另外一部电脑也在登录,这时候会发生全部断开的情况,再也无法连接,连IP都PING不通. 今天尝试在/etc/hosts.deny 加入如 ...

  3. QT 入门 -QApplication QPushButton QDialog Ui类型的手工使用

    QT 1.工具 assistant  帮助文档 qtconfig  QT配置工具 qmake     QT的make与项目文件智能创建工具 uic          UI界面的设计文件的编译工具 mo ...

  4. 判断圆和矩形是否相交C - Rectangle and Circle

    Description Given a rectangle and a circle in the coordinate system(two edges of the rectangle are p ...

  5. BestCoder Round #50 (div.1) 1002 Run (HDU OJ 5365) 暴力枚举+正多边形判定

    题目:Click here 题意:给你n个点,有多少个正多边形(3,4,5,6). 分析:整点是不能构成正五边形和正三边形和正六边形的,所以只需暴力枚举四个点判断是否是正四边形即可. #include ...

  6. BZOJ 1458: 士兵占领( 网络流 )

    先判无解 把整个棋盘都放上士兵, 只需求最多可以拿走多少个士兵即可.每一行看做一个点r(i), 每一列看做一个点c(i) S->r(i), c(i)->T 连边, 容量为可以拿走的最大士兵 ...

  7. eclipse the user operation is waiting for building workspace" to complete

    "the user operation is waiting for building workspace" to complete", 解决办法: 1.选择菜单栏的“P ...

  8. 网站开启gzip的方法

    .如果空间支持Zlib压缩文件,可用php.ini方法 这个方法比较简单,压缩率也较高,可达75%左右.新建一个名为 php.ini 的文件,添加以下代码,保存后上传至网站根目录即可. output_ ...

  9. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  10. include与jsp:include区别

    jsp 中include有两种形式,分别是 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 前者是指令元 ...