OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 25828|回复: 86

ALIENTEK MINISTM32 扩展实验13 内部FLASH图片显示实验_AN1103(告诉你如何用LCD显示image2lcd生成的图像数据)

  [复制链接]

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
发表于 2011-10-9 15:18:00 | 显示全部楼层 |阅读模式
 

AN1103 内部FLASH图片显示

本应用文档(AN1103)将向大家展示,如何将直接存放在STM32内部FLASH的图片数据(解码后的数据)显示到LCD.以及介绍图片数据生成工具image2lcd V2.9的一些用法。本实验以ALIENTEK MiniSTM32开发板为实验对象。

本文档分为如下几部分:

1,              图片显示原理。

2,              Image2lcd简介。

3,              软件实现。

 

一,图片显示原理。

LCD上显示图片无非就是画点。原理就这么简单。画点需要2个要素:1,坐标。2,颜色。知道了这两个要素,画图就简单了,一副图片在LCD上显示出来,我们只需要在正确的位置写入正确的颜色即可。就像你用铅笔在本子上画图一样,本子就是LCD,铅笔就是你的画点函数。

图片显示另外一个重要的特点就是他的数据量很大,比如画一幅320*240的图像,以16位色计算,那么光颜色的数据量就有:320*240*2=153600字节。这其中还不包括设置坐标的过程,如果加上坐标设置,数据量就是颜色数据量的5倍(每次坐标设置需要发送5次命令/数据)以上。所以尽量优化画点过程,才能使你的图片显示得流畅。

单纯的画点,显然无法做太多优化,因为坐标设置是必须的。幸好,我们ALIENTEK所使用的液晶都是支持开窗显示以及坐标自增显示的。这样,我们只需要设置一次窗口,然后设置一次坐标,就可以不停的往LCD写颜色数据,而不需要再做地址设置了。这样可以使得速度比单纯的画点显示要快至少5倍以上。

开窗也有几个条件:1,窗大小。2GRAM自增方向(就是扫描方向)。

开窗的概念:如图1所示:



1

我们本来的液晶是分辨率是240*320.对图10X00~0XEFx坐标),0X00~0X13Fy坐标)。图一中我们开辟了一个灰色区域的窗口,它的范围为XSTA~XENDYSTA~YEND。这样我们开辟窗口以后,再往LCD写数据,它就只会在这个窗口范围内地址按照设定的方向自增。比如从左到右,从上到下的扫描方式,规律为:从(XSTA,YSTA)开始,x坐标递增,每次遇到XEND地址则y坐标增1,同时x坐标重设为XSTA,直到y坐标递增到大于YEND,此时坐标又变为 (XSTA,YSTA)

所以,只要我们预先知道图片数据的生成格式,以及图片尺寸,那么我们就可以采用开窗方式来画图,从而提高效率。


 

二,Image2lcd简介。

Image2Lcd 是一款非常好的图像工具软件,它能把各种来源的图片转换成特定的数据格式以用来匹配单片机系统所需要的显示数据格式。Image2Lcd支持的输入图像格式包括: BMP, WBMP, JPG, GIF, WMF, EMF, ICO, 等等。Image2Lcd的输出数据类型包括定制的二进制类型、C语言数组类型和标准的BMP格式、WBMP格式。Image2Lcd能可视调节输入图象的数据扫描方式、灰度(颜色数)、图像数据排列方式、亮度、对比度、等等。对于包含了图像头数据保存的图像数据文件,Image2Lcd能重新打开作为输入图像。

因为image2lcd能生成带图像数据头的数据文件,使得我们处理起来方便很多,这里我们仅以16位真彩色为例进行说明。

在该软件的帮助文件查到对“4096/16位真彩色/18位真彩色/24位真彩色/32位真彩色”图片,其生成的图像数据头的结构为:

typedef struct _HEADCOLOR

{

unsigned char scan;

unsigned char gray;

unsigned short w;

unsigned short h;

unsigned char is565;

unsigned char rgb;

}HEADCOLOR;

各个成员的功能描述如下:

scan: 扫描模式         

Bit7: 0:自左至右扫描,1:自右至左扫描。

Bit6: 0:自顶至底扫描,1:自底至顶扫描。

Bit5: 0:字节内象素数据从高位到低位排列,1:字节内象素数据从低位到高位排列。

Bit4: 0:WORD类型高低位字节顺序与PC相同,1:WORD类型高低位字节顺序与PC相反。

Bit3~2: 保留。

Bit1~0: [00]水平扫描,[01]垂直扫描,[10]数据水平,字节垂直,[11]数据垂直,字节水平。

gray: 灰度值

   灰度值,1:单色,2:四灰,4:十六灰,8:256色,12:4096色,16:16位彩色,24:24位彩色,32:32位彩色。

w: 图像的宽度。 

h: 图像的高度。

is565: 4096色模式下为0表示使用[16bits(WORD)]格式,此时图像数据中每个WORD表示一个象素;为1表示使用[12bits(连续字节流)]格式,此时连续排列的每12Bits代表一个象素。

16位彩色模式下为0表示R G B颜色分量所占用的位数都为5Bits,为1表示R G B颜色分量所占用的位数分别为5Bits,6Bits,5Bits

18位彩色模式下为0表示"6Bits in Low Byte",为1表示"6Bits in High Byte"

24位彩色和32位彩色模式下is565无效。    

rgb: 描述R G B颜色分量的排列顺序,rgb中每2Bits表示一种颜色分量,[00]表示空白,[01]表示Red[10]表示Green[11]表示Blue

         HEADCOLOR中,scanwh这三个参数对我们的图片显示尤为有用。直到了wh,就可以直到开窗的大小。而scan的最高两位,则代表了图片数据生成时的扫描方向,也就是我们开窗后地址自增的方向。直到了这几个参数,我们就可以很方便的解析各种大小,各种扫描方式的图片数据了。

         下面我们以图2为例,按从左到右,从上到下的扫描方式,生成16位真彩(RGB:565)格式的图像数据。



2

该图片的尺寸为200*168。我们用image2lcd V2.9打开此图片,设置如图3所示:



3

3中,我们设置如上图。我们要生成的的图像数据为16位真彩,所以在2处选择16位真彩色,然后扫描方式为水平扫描,在3处选中包含头像数据头选项(注意:不能选择“高位在前(MSB First)”这个选项!!!)。在5处选中16位彩色选项卡,然后在颜色位数(4处)选择RGB565(因为我们的液晶刚好也是RGB565格式)。然后点击保存,命名为image1,可以得到图像数组如下:

const unsigned char gImage_image1[67208] = { 0X00,0X10,0XC8,0X00,0XA8,0X00,0X01,0X1B,

0X6B,0X6E,0XD1,0X9F,0XF5,0XB7,0XD3,0XAF,0XF3,0XAF,0X0F,0X8F,0XCE,0X86,0XF3,0XAF,

……

0X73,0XB7,0XF6,0XCF,0XF9,0XD7,0X98,0XCF,0X71,0XAE,0XD6,0XDF,0XFA,0XE7,0XF8,0XCF,

0XF6,0XC7,0X10,0X9F,0X53,0XB7,0XD5,0XC7,0XF6,0XCF,0X74,0XBF,0XD1,0XA6,0XF7,0XD7,

};

         其中红色数字为图像头数据,一共是8个字节,刚好是HEADCOLOR的大小。紧随其后的就是按设定的方向顺序存放的图像数据(颜色数据)。这样我们只需要在软件上对这个数组(gImage_image1)的数据进行解析,就可以还原图像了。

 


 

三,软件实现。

在第二节的介绍中,我们得到了一个数组(gImage_image1),而从第一节的介绍,我们需要一个开窗函数,以及一个扫描方向设置函数,这里提供这两个函数的代码如下:

//设置LCD的自动扫描方向

//0~7:代表8个方向(具体定义见lcd.h)

//9320/9325/9328/4531/1505/b505/8989IC已经实际测试     

void LCD_Scan_Dir(u8 dir)

{

         u16 regval=0;

         u8 dirreg=0;

#if USE_HORIZONTAL//使用横屏

         switch(dir)//方向转换

         {

                   case 0:dir=6;break;

                   case 1:dir=7;break;

                   case 2:dir=4;break;

                   case 3:dir=5;break;

                   case 4:dir=1;break;

                   case 5:dir=0;break;

                   case 6:dir=3;break;

                   case 7:dir=2;break;     

         }

#endif

       if(DeviceCode==0x8989)//8989 IC

         {

                   dirreg=0X11;

                   regval=0X6040;//65K  

         }else//其他驱动IC            

         {

                   dirreg=0X03;

                   regval=1<<12; 

         }

         switch(dir)

         {

                   case L2R_U2D://从左到右,从上到下

                            regval|=(1<<5)|(1<<4)|(0<<3);

                            break;

                   case L2R_D2U://从左到右,从下到上

                            regval|=(0<<5)|(1<<4)|(0<<3);

                            break;

                   case R2L_U2D://从右到左,从上到下

                            regval|=(1<<5)|(0<<4)|(0<<3);

                            break;

                   case R2L_D2U://从右到左,从下到上

                            regval|=(0<<5)|(0<<4)|(0<<3);

                            break;      

                   case U2D_L2R://从上到下,从左到右

                            regval|=(1<<5)|(1<<4)|(1<<3);

                            break;

                   case U2D_R2L://从上到下,从右到左

                            regval|=(1<<5)|(0<<4)|(1<<3);

                            break;

                   case D2U_L2R://从下到上,从左到右

                            regval|=(0<<5)|(1<<4)|(1<<3);

                            break;

                   case D2U_R2L://从下到上,从右到左

                            regval|=(0<<5)|(0<<4)|(1<<3);

                            break;      

         }       

         LCD_WriteReg(dirreg,regval);

} 

//设置窗口

//sx,sy,ex,ey窗口坐标

//窗口大小ex-sx+1)*(ey-ex+1)

//注意,确保ex>=sx;ey>=sy!!!!

//9320/9325/9328/4531/1505/b505/8989IC已经实际测试     

void LCD_Set_Window(u16 sx,u16 sy,u16 ex,u16 ey)       

{

         u8 hsareg,heareg,vsareg,veareg;

         u16 hsaval,heaval,vsaval,veaval; 

#if USE_HORIZONTAL  //使用横屏       

         //窗口值

         hsaval=sy;                                   

         heaval=ey;

         vsaval=319-ex;

         veaval=319-sx;        

#else                                     //竖屏

         //窗口值

         hsaval=sx;                                   

         heaval=ex;

         vsaval=sy;

         veaval=ey;       

#endif

        if(DeviceCode==0X8989)//8989 IC

         {

                   hsareg=0X44;heareg=0X44;//水平方向窗口寄存器 (1289的由一个寄存器控制)

                   hsaval|=(heaval<<8);       //得到寄存器值.

                   heaval=hsaval;

                   vsareg=0X45;veareg=0X46;//垂直方向窗口寄存器       

         }else  //其他驱动IC

         {

                   hsareg=0X50;heareg=0X51;//水平方向窗口寄存器

                   vsareg=0X52;veareg=0X53;//垂直方向窗口寄存器       

         }                                                                          

         //设置寄存器值

         LCD_WriteReg(hsareg,hsaval);

         LCD_WriteReg(heareg,heaval);

         LCD_WriteReg(vsareg,vsaval);

         LCD_WriteReg(veareg,veaval);

}

         这两个函数已经添加到ILI93xx.c的源码中,具体请看本应用文档的对应扩展实验(ALIENTEK MINISTM32 扩展实验13 内部FLASH图片显示实验)。更新后的ILI93xx.c版本为V1.6。同时该实验的USMART部分也有了更新,最新版本的USMART V2.6

         扩展实验13的源码是在标准实验10的基础上修改而来的,加入了usmart组建以及新建了IMAG2LCD的组。见图4



4

         有了LCD_Set_WindowLCD_Scan_Dir这两个函数,做起来就方便多了(通过画点的方式也可以实现),根据第一节的原理,编写出的flash->lcd函数部分即image2lcd.c的内容如下:

//8位数据获得16位颜色

//mode:0,低位在前,高位在后.

//     1,高位在前,低位在后.

//str:数据

u16 image_getcolor(u8 mode,u8 *str)

{

         u16 color;

         if(mode)

         {

                   color=((u16)*str++)<<8;

                   color|=*str;

         }else

         {

                   color=*str++;

                   color|=((u16)*str)<<8;

         }

         return color;   

}

//在液晶上画图

//xsta,ysta,xend,yend:画图区域

//scan:image2lcd V2.9的说明.

//*p:图像数据

void image_show(u16 xsta,u16 ysta,u16 xend,u16 yend,u8 scan,u8 *p)

{ 

         u32 i;

         u32 len=0;

         LCD_Set_Window(xsta,ysta,xend,yend);

         if((scan&0x03)==0)//水平扫描

         {

                   switch(scan>>6)//设置扫描方式

                   {

                            case 0:

                                     LCD_Scan_Dir(L2R_U2D);//从左到右,从上到下

                                     LCD_SetCursor(xsta,ysta);//设置光标位置

                                     break;

                            case 1:

                                     LCD_Scan_Dir(L2R_D2U);//从左到右,从下到上

                                     LCD_SetCursor(xsta,yend);//设置光标位置

                                     break;

                            case 2:

                                     LCD_Scan_Dir(R2L_U2D);//从右到左,从上到下

                                     LCD_SetCursor(xend,ysta);//设置光标位置

                                     break;

                            case 3:

                                     LCD_Scan_Dir(R2L_D2U);//从右到左,从下到上

                                     LCD_SetCursor(xend,yend);//设置光标位置

                                     break;

                   }

         }else  //垂直扫描

         {

                   switch(scan>>6)//设置扫描方式

                   {

                            case 0:

                                     LCD_Scan_Dir(U2D_L2R);//从上到下,从左到右

                                     LCD_SetCursor(xsta,ysta);//设置光标位置

                                     break;

                            case 1:

                                     LCD_Scan_Dir(D2U_L2R);//从下到上从,左到右

                                     LCD_SetCursor(xsta,yend);//设置光标位置

                                     break;

                            case 2:

                                     LCD_Scan_Dir(U2D_R2L);//从上到下,从右到左

                                     LCD_SetCursor(xend,ysta);//设置光标位置

                                     break;

                            case 3:

                                     LCD_Scan_Dir(D2U_R2L);//从下到上,从右到左

                                     LCD_SetCursor(xend,yend);//设置光标位置

                                     break;

                   }

         }

         LCD_WriteRAM_Prepare();                 //开始写入GRAM

         len=(xend-xsta+1)*(yend-ysta+1);  //写入的数据长度

         for(i=0;i<len;i++)

         {

                   LCD_WR_DATA(image_getcolor(scan&(1<<4),p));

                   p+=2;

         }        

#if USE_HORIZONTAL  //使用横屏       

         LCD_Set_Window(0,0,319,239);

#else

         LCD_Set_Window(0,0,239,319);

#endif                                                                     

} 

 

//在指定的位置显示一个图片

//此函数可以显示image2lcd软件生成的任意16位真彩色图片.

//限制:1,尺寸不能超过屏幕的区域.

//     2,生成数据时不能勾选:高位在前(MSB First)

//     3,必须包含图片信息头数据

//x,y:指定位置

//imgx:图片数据(必须包含图片信息头,"4096/16位真彩色/18位真彩色/24位真彩色/32位真彩色”的图像数据头)

//注意:针对STM32,不能选择image2lcd"高位在前(MSB First)"选项,否则imginfo的数据将不正确!!

void image_display(u16 x,u16 y,u8 * imgx)

{

         HEADCOLOR *imginfo;

        u8 ifosize=sizeof(HEADCOLOR);//得到HEADCOLOR结构体的大小

         imginfo=(HEADCOLOR*)imgx;

        image_show(x,y,x+imginfo->w-1,y+imginfo->h-1,imginfo->scan,imgx+ifosize);            

}

         通过这三个函数即实现了对image2lcd软件生成的任意扫描方向、任意尺寸(不大于240*320)的图像数据的解码。

         用户直接通过调用image_display函数既可以实现对存在flash里面的图像数据进行显示了。Xy为图像要显示的位置,imgx,则为flash图像数据的首地址。

         main函数里面的实现代码如下:

//Mini STM32开发板扩展实验13

//内部FLASH图片显示 实验

//正点原子@ALIENTEK

//技术论坛:www.openedv.com              

int main(void)

{                

         u8 i=0;

       HEADCOLOR *imginfo;

         u16 x=0,y=0;

         u16 x0,y0;

        imginfo=(HEADCOLOR*)gImage_image1;      //得到文件信息

 

         Stm32_Clock_Init(9);//系统时钟设置

         delay_init(72);          //延时初始化

         uart_init(72,9600); //串口1初始化 

         usmart_dev.init(72);//初始化USMART

         LED_Init();

        LCD_Init();

         POINT_COLOR=RED;            

         LCD_ShowString(30,50,"Mini STM32 ^_^");  

         LCD_ShowString(30,70,"FLASH PICTURE TEST");  

         LCD_ShowString(30,90,"ATOM@ALIENTEK");

         LCD_ShowString(30,110,"2011/10/09");                                                

         delay_ms(1500);//等待1.5          

         srand(imginfo->h*imginfo->w);

         while(1)

         {                   

                   if(i==0)

                   {

                            LCD_Clear(0X0000);//黑屏 

                            if(imginfo->w>=240||imginfo->h>=320)

                            {

                                     POINT_COLOR=RED;            

                                     LCD_ShowString(10,70,"The Picture is too large");       

                                     continue;

                            }

                            x0=x;y0=y;

                            while((x+imginfo->w)>240||x==x0)//超过屏幕尺寸了

                            {

                                     x=rand();//获得随机的x

                            }

                            while((y+imginfo->h)>320||y==y0)//超过屏幕尺寸了

                            {

                                     y=rand();//获得随机的y

                            }

                            image_display(x,y,(u8*)gImage_image1);//在指定地址显示图片

                   }

                   i++;

                   if(i>10)i=0;

                   LED0=!LED0;                                        

                   delay_ms(200);       

         }                                                                                                        

}

         main函数里面,我们取得xy的随机坐标,实现一个图片在LCD屏幕上到处移动的效果。每2秒钟更新一次位置。大家可以下载该实验代码到ALIENTEK MiniSTM32开发板上感受下效果(速度还是很流畅的!)。

想简单一点的话,只需要调用image_display(x,y,(u8*)gImage_image1);函数即可。gImage_image1即为我们用image2lcd生成的图像数据。

 

 

 

 

 

 

 

                                                                                                                   正点原子@ALIENTEK

                                                                                                                             2011-10-9

 

内部FLASH图片显示_AN1103.pdf

326.31 KB, 下载次数: 4581

ALIENTEK MINISTM32 扩展实验13 内部FLASH图片显示实验.rar

221.31 KB, 下载次数: 5275

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

  离线 

6

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2011-10-8
在线时间
0 小时
发表于 2011-10-10 20:47:41 | 显示全部楼层
原子版主真给力,能授人以渔,非常感谢
小弟今天想把程序移植到OLED SSD1332上,但是有点难度,不过看了版主的程序,已经是大受鼓舞了。
回复 支持 0 反对 1

使用道具 举报

  离线 

5

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2011-2-1
在线时间
3 小时
发表于 2011-10-11 23:23:10 | 显示全部楼层
非常感谢 
回复 支持 反对

使用道具 举报

  离线 

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2011-1-13
在线时间
0 小时
发表于 2011-10-12 09:33:06 | 显示全部楼层
不错,顶一下
回复 支持 反对

使用道具 举报

  离线 

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2011-9-25
在线时间
0 小时
发表于 2011-10-18 01:08:26 | 显示全部楼层
1 int rand(void)函数与void srand(unsigned seed) 函数联合使用产生随机值。
2如果不调用srand初始化的话,rand返回的序列将失去“随机”的效果。
3 变量seed只是一个种子,不负责随机数的范围,最好不为定值。
4 rand函数每次返回一个非负的随机数。
把握好今天
回复 支持 反对

使用道具 举报

  离线 

9

主题

100

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2011-1-20
在线时间
1 小时
发表于 2011-10-18 11:24:10 | 显示全部楼层
 ALIENTEK MINISTM32 扩展实验11至12在哪下载?
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2011-10-18 11:51:32 | 显示全部楼层
回复【6楼】master001:
---------------------------------
应该在论坛都有的. 搜索最新例程.下载里面的代码看看吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

9

主题

100

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2011-1-20
在线时间
1 小时
发表于 2011-10-18 13:52:43 | 显示全部楼层
http://www.openedv.com/posts/list/1155.htm
ALIENTEK MiniSTM32开发板最新例程_20110730 ,好像只有“ALIENTEK MINISTM32 扩展实验10 MP3播放器实验”。
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2011-10-18 15:07:47 | 显示全部楼层
回复【8楼】master001:
---------------------------------
回家我看看.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

9

主题

100

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2011-1-20
在线时间
1 小时
发表于 2011-10-18 15:54:45 | 显示全部楼层
不急。
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2011-10-19 00:03:07 | 显示全部楼层
回复【10楼】master001:
---------------------------------
扩展实验11和扩展实验12见这里:http://www.openedv.com/posts/list/1167.htm
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

9

主题

100

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2011-1-20
在线时间
1 小时
发表于 2011-10-19 08:58:15 | 显示全部楼层
谢谢正点原子给予的回复。
回复 支持 反对

使用道具 举报

  离线 

18

主题

82

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2011-10-27
在线时间
0 小时
发表于 2011-10-27 17:03:17 | 显示全部楼层
原子哥,LCD的驱动芯片75页关于R7寄存器D【1:0】位的讨论貌似是说可以不显示GRAM,但是此时仍然可以向GRAM中写数据。你看我说的对不对?等我写好数据后,然后我再把D【1:0】全部置1显示,这样做不行吗?我试了一下,一直白屏,貌似有什么不对的地方。
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2011-10-27 17:24:37 | 显示全部楼层
回复【13楼】fengye1966:
---------------------------------
按手册说是可以的.但是我以前也试过,貌似也是不行的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

3

主题

7

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2011-3-25
在线时间
3 小时
发表于 2011-10-29 16:17:44 | 显示全部楼层
 好帖,学习了
回复 支持 反对

使用道具 举报

  离线 

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2011-12-4
在线时间
4 小时
发表于 2011-12-11 16:32:31 | 显示全部楼层
原子哥, 我把位图转成240×320的,目的是想让屏幕全屏显示, 但是编译提示下面这样。不知道改RAM行不,刚学不会改,还有有什么办法解决RAM问题不。这的图形数组信息为const unsigned char gImage_image1[153608] = { 0X00,0X10,0XF0,0X00,0X40,0X01,0X01,0X1B,...........

TEST.axf: Error: L6406E: No space in execution regions with .ANY selector matching image1.o(.constdata).
TEST.axf: Error: L6407E: Sections of aggregate size 0x25808 bytes could not fit into .ANY selector(s).
TEST.axf: Not enough information to list image symbols.
TEST.axf: Not enough information to list the image map.
TEST.axf: Finished: 2 information, 0 warning and 2 error messages.
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2011-12-11 17:22:45 | 显示全部楼层
回复【16楼】icgra:
---------------------------------
大哥,stm32f103rb才128Kflash,一张320*240的图片数据,有多大?153K!!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2011-12-4
在线时间
4 小时
发表于 2011-12-11 17:41:55 | 显示全部楼层
回复【17楼】正点原子:
--------------------------
哦哦, 明白了,我改程序好了
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-3-28
在线时间
0 小时
发表于 2012-3-28 21:55:57 | 显示全部楼层
写的非常好,我明天去试一下...今天显示图像的没弄出来...
回复 支持 反对

使用道具 举报

  离线 

13

主题

82

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2012-3-2
在线时间
5 小时
发表于 2012-4-1 15:09:34 | 显示全部楼层
给力的原子。。。
回复 支持 反对

使用道具 举报

  离线 

13

主题

82

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2012-3-2
在线时间
5 小时
发表于 2012-4-1 15:19:02 | 显示全部楼层
原子大叔:我这有两个地方不太明白
imginfo=(HEADCOLOR*)gImage_imagedata; // 这句也不大理解,
srand(imginfo->h*imginfo->w);//这个是干嘛的?应该是得到HEADCOLOR里面的h,W的值;但是我没有找到这个srand的函数的代码,对这个调用方式也不大理解【前面的没有星号,后面的又有星号】
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2012-4-1 16:32:45 | 显示全部楼层
回复【21楼】正在输入...:
---------------------------------
1,强制转换.
2,设置随机数种子.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

13

主题

82

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2012-3-2
在线时间
5 小时
发表于 2012-4-1 16:36:21 | 显示全部楼层
回复【22楼】正点原子:
回复【21楼】正在输入...:
---------------------------------
1,强制转换.
2,设置随机数种子.
---------------------------------
强制转换为结构体?
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2012-4-1 20:39:33 | 显示全部楼层
是的.
回复 支持 反对

使用道具 举报

  离线 

0

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-1-30
在线时间
1 小时
发表于 2013-3-23 10:58:59 | 显示全部楼层
很详细呀!谢谢楼主分享!
回复 支持 反对

使用道具 举报

  离线 

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2011-5-5
在线时间
0 小时
发表于 2013-4-19 21:13:48 | 显示全部楼层
回复【24楼】正点原子:

是的.

---------------------------------
原子大哥 ,这个image2LCD 软件打开ico图标文件,总是报错提示:无效的输入文件xxx.ico
这个能解决吗
毛毛虫好...
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2013-4-19 22:27:38 | 显示全部楼层
回复【26楼】王小毛:
---------------------------------
把ico文件,用别的软件,先存为.jpg/.BMP.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2011-5-5
在线时间
0 小时
发表于 2013-4-23 15:58:16 | 显示全部楼层
回复【27楼】正点原子:
---------------------------------
嗯 谢谢 弄好了
原来我还以为是我下载的image2lcd版本有问题呢
毛毛虫好...
回复 支持 反对

使用道具 举报

  离线 

31

主题

161

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2013-4-22
在线时间
7 小时
发表于 2013-4-25 09:04:06 | 显示全部楼层
原子哥,我把IMAGE2LCD这个直接移到战舰的开发板上,显示的图片怎么是个乱的啊
http://www.tudou.com/programs/view/h5G_H9Kpk04/?bid=03&pid=1&resourceId=375113802_03_05_01
回复 支持 反对

使用道具 举报

  离线 

31

主题

161

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2013-4-22
在线时间
7 小时
发表于 2013-4-25 09:22:20 | 显示全部楼层
回复【29楼】华夏小川:
---------------------------------
貌似就像是几张图片碟在了一起啊
http://www.tudou.com/programs/view/h5G_H9Kpk04/?bid=03&pid=1&resourceId=375113802_03_05_01
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2013-4-25 10:08:50 | 显示全部楼层
回复【30楼】华夏小川:
---------------------------------
八成是数据错位了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

31

主题

161

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2013-4-22
在线时间
7 小时
发表于 2013-4-25 10:51:04 | 显示全部楼层
回复【31楼】正点原子:
---------------------------------
我是直接把你的IMAGE2LCD复制过去的,让后把那个image1.c数据用Img2Lcd重新生成了一下,还是不行啊,老显示的是乱的
http://www.tudou.com/programs/view/h5G_H9Kpk04/?bid=03&pid=1&resourceId=375113802_03_05_01
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-9-24 09:40:35 | 显示全部楼层
不错,学习啦,谢谢楼主。
回复 支持 反对

使用道具 举报

  离线 

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-4-27
在线时间
14 小时
发表于 2013-10-12 11:14:42 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
原子哥您好,扩展实验13是在标准实验10的基础上改的,为什么我的板子能运行10,而不能运行13。液晶是白屏。谢谢
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2013-10-12 14:17:11 | 显示全部楼层
你的板子什么时候买的?
LCD型号是什么?
看看是不是型号的问题
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-4-27
在线时间
14 小时
发表于 2013-10-12 14:39:43 | 显示全部楼层
回复【35楼】正点原子:
---------------------------------
回复【35楼】正点原子:
---------------------------------
板子是今年4月份的。途中液晶坏了换过一次液晶,现在的驱动是ILI9341
回复 支持 反对

使用道具 举报

  离线 

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-4-27
在线时间
14 小时
发表于 2013-10-12 15:28:39 | 显示全部楼层

扩展里面LCD初始化没有9341,我把实验10LCD初始化复制进去编译通过还是没有显示。我用实验10移植实验13,显示是重叠的。望原子哥指点
                                        


 

回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2013-10-12 22:49:49 | 显示全部楼层
回复【37楼】xurids:
---------------------------------
你这个9341屏,是在我们这里买的么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-4-27
在线时间
14 小时
发表于 2013-10-13 19:17:04 | 显示全部楼层
回复【38楼】正点原子:
---------------------------------
是的 。问题已解决。用最新MINI扩展历程就可以用                                        
回复 支持 反对

使用道具 举报

  离线 

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-10-4
在线时间
2 小时
发表于 2014-5-16 20:45:46 | 显示全部楼层



为什么我的图片是斜的 而且重复了  求解
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2014-5-16 23:33:02 | 显示全部楼层
回复【40楼】hfeiii:
---------------------------------
你这是移植没搞好。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-10-4
在线时间
2 小时
发表于 2014-5-17 08:27:53 | 显示全部楼层
回复【41楼】正点原子:
---------------------------------
现在好了  ~_~     移植错了
回复 支持 反对

使用道具 举报

  离线 

7

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-4-18
在线时间
2 小时
发表于 2014-5-20 20:31:10 | 显示全部楼层
回复【42楼】hfeiii:
---------------------------------
兄弟能否共享下移植到战舰板上的代码,谢谢!
回复 支持 反对

使用道具 举报

  离线 

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-5-6
在线时间
0 小时
发表于 2014-5-21 16:10:51 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
 一维数组如何强制转换成结构体?数据怎么对应了?
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2014-5-21 22:31:10 | 显示全部楼层
回复【44楼】今夜雨寒:
---------------------------------
strx=(strx*)buf;

按内存分配原则对应.
结构体有时候需要加pack关键字,你自己测试下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

15

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2014-7-1
在线时间
24 小时
发表于 2014-7-18 15:04:13 | 显示全部楼层
回复【45楼】正点原子:
---------------------------------
原子哥,我的屏驱动芯片是NT35510的,480*320,刷这个程序之后白屏。这个程序只能用在320*240上么?
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2014-7-18 23:00:46 | 显示全部楼层
回复【46楼】zengan007:
---------------------------------
这个代码比较老了,你要用最新的例程才行.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

15

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2014-7-1
在线时间
24 小时
发表于 2014-7-19 13:42:21 | 显示全部楼层
回复【47楼】正点原子:
---------------------------------
我也想用最新的啊,不知道是哪个啊?
回复 支持 反对

使用道具 举报

  离线 

511

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
133718
金钱
133718
注册时间
2010-12-1
在线时间
1278 小时
 楼主| 发表于 2014-7-19 23:35:53 | 显示全部楼层
V3.0的例程,用在2.0上,也可以.

扩展实验6 内部FLASH图片显示实验.rar

371.16 KB, 下载次数: 1881

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

15

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2014-7-1
在线时间
24 小时
发表于 2014-7-20 17:00:34 | 显示全部楼层
回复【49楼】正点原子:
---------------------------------
大谢原子哥
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




关闭

报名原子哥新品发布会&粉丝见面会上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-10-18 09:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */