OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8348|回复: 13

如何将我的7寸屏程序入移植EMWIN

[复制链接]

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-5-27
在线时间
11 小时
发表于 2015-9-7 22:25:48 | 显示全部楼层 |阅读模式
5金钱
我上传的代码是我的程序,程序的功能就是从SD卡中读取图片到7寸屏中,屏幕的型号MD070SD,我想把EMWIN移植进入我的程序,我有UCGUI移植好的程序,但是UCGUI貌似不支持从SD卡中直接读取位图,而EMWIM却有GUI_BMP_DrawEx()这个函数可以从SD卡中直接读取位图显示到7寸屏上,移植中我参考了八度空间老师的帖子http://www.openedv.com/posts/list/28316.htm ,但是我还是没学会,感觉这种移植很费劲,很茫然,希望得到大神的帮助,我上传的程序功能就是从SD卡根目录下读取图片,谢谢了

SD卡7寸屏程序.rar

2.85 MB, 下载次数: 190

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-9-7 22:34:32 | 显示全部楼层
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-5-27
在线时间
11 小时
 楼主| 发表于 2015-9-8 08:22:43 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
能得到原子哥帮顶,真是增加了我学习的动力啊,其实我的最终目的就是利用显示的位图来做成一个个按钮,或者说是纯位图用按键控制也行,当我用左右按键操作时,屏幕上的小位图能相应的左右切换,然后按下确定键,我就能进入小位图对应的二级子菜单,其实就是做个二级菜单,用位图当按钮,但是我还没外接RAM,所以我想都从SD卡中把位图读出来,有一个函数是UCGUI中的,GUI_DrawStreamedBirmap,该函数从一个位图数据流的数据绘制一副位图,如果这个函数好使,那我也可以不必非得移植EMWIN了,但是我也不会使用这个函数,利用BmpCVT将一个位图软换成“C”stream(*.dta)格式以后,我也不知道接下来应该继续怎么用,我还是没有认真看看咱们开源电子网,可能这个问题早就解决了,接着研究吧
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-9-8 10:15:13 | 显示全部楼层
回复【3楼】liliang129129:
---------------------------------
关于EMWIN的移植,我们有详细的教程,你既然会ucgui的移植那么肯定就能完成emwin的移植,还有你说的就是EMWIN的绘制位图流文件功能,我们的教程虽然没有绘制位图流文件的例程,但是有绘制位图的例程,两者用法几乎无差异你可以参考一下。
开往春天的手扶拖拉机
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-5-27
在线时间
11 小时
 楼主| 发表于 2015-9-8 10:29:19 | 显示全部楼层
回复【4楼】zuozhongkai:
---------------------------------
我就是看见您的教程,你在教程里面也是这么说的两者基本无差异,但是我还是不会,普通显示一张位图的话,把位图转化成C数组放在程序中,这在您的教程中都讲了,我自己用我的板子也实现了,但是您视频中没有绘制位图流文件的例程,我真是教点会点,不教就不会啊,您的视频非常好,谢谢您带我入门EMWIN
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-9-8 10:50:31 | 显示全部楼层
回复【5楼】liliang129129:
---------------------------------
绘制绘图流文件和绘制绘图文件最大的一个区别就是从SD卡获取位图文件,这是一个函数。你可以看我们的JPEG,BMP等图片显示实验,那个里面也有个从SD卡读取JPEG文件的函数,基本上可以用到绘制位图流文件中。
开往春天的手扶拖拉机
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-5-27
在线时间
11 小时
 楼主| 发表于 2015-9-8 11:04:11 | 显示全部楼层
回复【6楼】zuozhongkai:
---------------------------------
现在我最大的疑惑就是利用BmpCVT将一个位图软换成“C”stream(*.dta)格式以后,我也不知道接下来应该怎么办,这个格式的文件应该是放在SD卡里吧,我再研究研究再有了深刻一些的理解以后再向您提问吧,谢谢您
回复

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2015-9-8 11:10:05 | 显示全部楼层
两种方式:

1、动态加载至内存,直接绘制;
2、提供pfGetData回调函数,由emWin调用。

前者速度较快、高效,后者节省空间。
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-5-27
在线时间
11 小时
 楼主| 发表于 2015-9-9 09:02:16 | 显示全部楼层
回复【6楼】zuozhongkai:
---------------------------------
左老师您好,我是用的芯片是STM32F103VET6,我没有外接SRAM,我使用内部RAM做内存控制管理,我在malloc.h中

#define SRAMIN 0  //内部内存池  ??? 1.  请问这个定义,在不用外部内存池的情况下,是否要做这样的修改#define SRAMIN 1
#define SRAMEX 1  //外部内存池

#define MEM1_BLOCK_SIZE  32 //内存块大小为 32 字节
#define MEM1_MAX_SIZE 25*1024 //最大管理内存 40K    ??? 2.  我这里调到25*1024的情况下编译不出错

#define GUI_NUMBYTES  (16*1024)  //   ???  3. 在GUIConf.h中我这个定义为16K
#define GUI_BLOCKSIZE 0X80  //   

关于内存管理方面的知识我不是特别懂,我这样修改程序在我的板子上是不是能直接用呢,或者说我怎么能验证一下关于内存管理这部分的移植成不成功呢?有我没认真看的地方请老师见谅我还在继续学习
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-5-27
在线时间
11 小时
 楼主| 发表于 2015-9-9 09:17:28 | 显示全部楼层
回复【9楼】liliang129129:
---------------------------------
/*********************************************************************
打点函数
*/
static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int ixelIndex) 

//void lcd_SetPoint(int x,int y,int point);  函数原型,经过调试好使
lcd_SetPoint( x, y,PixelIndex);
}


/*********************************************************************
*
读点函数
*/
static unsigned int _GetPixelIndex(GUI_DEVICE * pDevice, int x, int y) {
unsigned int ixelIndex;
    #if (LCD_MIRROR_X == 1) || (LCD_MIRROR_Y == 1) || (LCD_SWAP_XY == 1)
      int xPhys, yPhys;

      xPhys = LOG2PHYS_X(x, y);
      yPhys = LOG2PHYS_Y(x, y);
    #else
      #define xPhys x
      #define yPhys y
    #endif
    GUI_USE_PARA(pDevice);
    GUI_USE_PARA(x);
    GUI_USE_PARA(y);
    {
//int lcd_GetPoint(int x,int y)   读点函数原型,经过调试好使
PixelIndex = lcd_GetPoint(x,y);
    }
    #if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)
      #undef xPhys
      #undef yPhys
    #endif
  return ixelIndex;

}

static void _FillRect(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1) 
{
// void LCD_Fill(int sx,int sy,int ex,int ey,int color)   填充矩形区域颜色函数,经过调试好使
LCD_Fill(x0,y0,x1,y1,LCD_COLORINDEX);

}

/*********************************************************************
*
*       Draw Bitmap 16 BPP, not optimized
*
urpose:
*   Drawing of 16bpp high color bitmaps.
*   Only required for 16bpp color depth of target. Should be removed otherwise.
*/
static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {

LCD_PIXELINDEX pixel;
lcd_SetCursor(x,y);
*(__IO uint16_t *)(UCGUI_LCD_CMD)  = lcddev.wramcmd;  //  u32 UCGUI_LCD_CMD  = 0X60000000; 
for (;xsize > 0; xsize--, x++, p++) 
{
pixel = *p;
        *(__IO uint16_t *)(UCGUI_LCD_DATA) =pixel;  //u32 UCGUI_LCD_DATA = 0X60020000;  我使用的是FSMC_NE1可以成功
                                                                                //将七寸初始化,应该好使,
    }
}

左老师我按您出的教程在GUIDRV_Template.c中修改了这四个函数,您看看有没有什么问题,现在我还是没有一直成功,还在继续寻找问题
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-9-9 10:07:53 | 显示全部楼层
回复【9楼】liliang129129:
---------------------------------
1、内存管理这里,宏:SRAMIN定义为1,MEM1_MAX_SIZE调整到编译不出错就可以了, 内存管理是可以直接用的VET6上的
2、16bpp优化这里你先不要改,使用默认的,其他的基本没什么问题
开往春天的手扶拖拉机
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-5-27
在线时间
11 小时
 楼主| 发表于 2015-9-16 14:12:16 | 显示全部楼层
回复【11楼】zuozhongkai:
---------------------------------
#include "GUI.h"
#include "ff.h"

#include "ffconf.h"
#include "diskio.h"
#include "lcd.h"

// #define DISP_XS 480
// #define DISP_YS 272 

#define DISP_XS 800
#define DISP_YS 480 

FATFS fs3;                     

#define BMPMEMORYSIZE 500*1024


#define BMPPERLINESIZE 2*1024


#define u8  unsigned char
#define u16 unsigned short
#define u32 unsigned long






static FIL BMPFile;
static char bmpBuffer[BMPPERLINESIZE];
/*******************************************************************
*
*       Static functions
*
********************************************************************
*/
/*********************************************************************
*
*       BmpGetData
*
* Function description
*   This routine is called by GUI_BMP_DrawEx(). The routine is responsible
*   for setting the data pointer to a valid data location with at least
*   one valid byte.
*
arameters:
*   p           - ointer to application defined data.
*   NumBytesReq - Number of bytes requested.
*   ppData      - ointer to data pointer. This pointer should be set to
*                 a valid location.
*   StartOfFile - If this flag is 1, the data pointer should be set to the
*                 beginning of the data stream.
*
* Return value:
*   Number of data bytes available.
*/
static int BmpGetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off) 
{
static int readaddress=0;
FIL * phFile;
UINT NumBytesRead;
#if SYSTEM_SUPPORT_UCOS
OS_CPU_SR cpu_sr;
#endif

phFile = (FIL *)p;

if (NumBytesReq > sizeof(bmpBuffer)) 
{
NumBytesReq = sizeof(bmpBuffer);
}


if(Off == 1) readaddress = 0;
else readaddress=Off;
#if SYSTEM_SUPPORT_UCOS
OS_ENTER_CRITICAL();
#endif
f_lseek(phFile,readaddress); 


f_read(phFile,bmpBuffer,NumBytesReq,&NumBytesRead);
#if SYSTEM_SUPPORT_UCOS
OS_EXIT_CRITICAL();
#endif
*ppData = (U8 *)bmpBuffer;
return NumBytesRead;
}


int dispbmpex(u8 *BMPFileName,u8 mode,u32 x,u32 y,int member,int denom)
{
char result;
int XSize,YSize;
float Xflag,Yflag;
//  GUI_COLOR forecolor,bkcolor;
//  forecolor=GUI_GetColor();
//  bkcolor=GUI_GetBkColor();
disk_initialize(0);    
  Disp_Mask(0, DISP_XS-1, 0, DISP_YS-1 );  
  f_mount(0, &fs3);     

result = f_open(&BMPFile,(const TCHAR*)BMPFileName,FA_OPEN_EXISTING | FA_READ);

  if(result != FR_OK)  return 1;

switch(mode)
{
case 0:
if((member == 1) && (denom == 1)) 
{
GUI_BMP_DrawEx(BmpGetData,&BMPFile,x,y);
}else
{
GUI_BMP_DrawScaledEx(BmpGetData,&BMPFile,x,y,member,denom);
}
break;
case 1:
XSize = GUI_BMP_GetXSizeEx(BmpGetData,&BMPFile);
YSize = GUI_BMP_GetYSizeEx(BmpGetData,&BMPFile);
if((member == 1) && (denom == 1))
{

//  GUI_BMP_DrawEx(BmpGetData,&BMPFile,(lcddev.width-XSize)/2-1,(lcddev.height-YSize)/2-1);
GUI_BMP_DrawEx(BmpGetData,&BMPFile,(800-XSize)/2-1,(480-YSize)/2-1);
}else
{
Xflag = (float)XSize*((float)member/(float)denom);
Yflag = (float)YSize*((float)member/(float)denom);
//  XSize = (lcddev.width-(int)Xflag)/2-1; 
//  YSize = (lcddev.height-(int)Yflag)/2-1;


XSize = (800-(int)Xflag)/2-1;
   YSize = (480-(int)Yflag)/2-1;
GUI_BMP_DrawScaledEx(BmpGetData,&BMPFile,XSize,YSize,member,denom);
}
break;
}
f_close(&BMPFile); //??±?BMPFile????
//  GUI_SetColor(forecolor); //?????°?°??
//  GUI_SetBkColor(bkcolor); //????±??°??
return 0;
}
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-5-27
在线时间
11 小时
 楼主| 发表于 2015-9-16 14:14:40 | 显示全部楼层
回复【12楼】liliang129129:
---------------------------------
#include "jpegdisplay.h"
#include "GUI.h"
#include "ff.h"

#include "ffconf.h"
#include "diskio.h"
#include "lcd.h"


#define DISP_XS 800
#define DISP_YS 480 

FATFS fs4;                      // ?????????÷??±ê??

static FIL JPEGFile;
static unsigned char jpegBuffer[JPEGPERLINESIZE] __attribute__ ((aligned(4)));


extern void Disp_Mask (
int left, /* Left end of active window (0 to DISP_XS-1) */
int right, /* Right end of active window (0 to DISP_XS-1, >=left) */
int top, /* Top end of active window (0 to DISP_YS-1) */
int bottom /* Bottom end of active window (0 to DISP_YS-1, >=top) */
);

extern void Delay(volatile unsigned int nCount);


/*******************************************************************
*
*       Static functions
*
********************************************************************
*/
/*********************************************************************
*
*       _GetData
*
* Function description
*   This routine is called by GUI_JPEG_DrawEx(). The routine is responsible
*   for setting the data pointer to a valid data location with at least
*   one valid byte.
*
arameters:
*   p           - ointer to application defined data.
*   NumBytesReq - Number of bytes requested.
*   ppData      - ointer to data pointer. This pointer should be set to
*                 a valid location.
*   StartOfFile - If this flag is 1, the data pointer should be set to the
*                 beginning of the data stream.
*
* Return value:
*   Number of data bytes available.
*/
static int JpegGetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off) 
{
static int readaddress=0;
FIL * phFile;
UINT NumBytesRead;
#if SYSTEM_SUPPORT_UCOS
OS_CPU_SR cpu_sr;
#endif

phFile = (FIL *)p;

if (NumBytesReq > sizeof(jpegBuffer)) 
{
NumBytesReq = sizeof(jpegBuffer);
}


if(Off == 1) readaddress = 0;
else readaddress=Off;

#if SYSTEM_SUPPORT_UCOS
OS_ENTER_CRITICAL();
#endif

f_lseek(phFile,readaddress); 


f_read(phFile,jpegBuffer,NumBytesReq,&NumBytesRead);

#if SYSTEM_SUPPORT_UCOS
OS_EXIT_CRITICAL();
#endif

*ppData = (U8 *)jpegBuffer;
return NumBytesRead;
}



int displayjpegex(u8 *JPEGFileName,u8 mode,u32 x,u32 y,int member,int denom)
{
char result;
int xSize,ySize;
float Xflag,Yflag;
GUI_JPEG_INFO JpegInfo;
DIR dirs;
char path1[50]={""};      

disk_initialize(0);    
  Disp_Mask(0, 800-1, 0, 480-1 );
  f_mount(0, &fs4);   


if (f_opendir(&dirs, path1) == FR_OK)            
  {

result = f_open(&JPEGFile,(const TCHAR*)JPEGFileName,FA_OPEN_EXISTING | FA_READ);

if(result != FR_OK)  return 1;

GUI_JPEG_GetInfoEx(JpegGetData,&JPEGFile,&JpegInfo);

xSize = JpegInfo.XSize; //JPEG????X?ó??

ySize = JpegInfo.YSize; //JPEG????Y?ó??


switch(mode)
{
case 0:
if((member == 1) && (denom == 1)) 
{
GUI_JPEG_DrawEx(JpegGetData,&JPEGFile,x,y);
}else
{
GUI_JPEG_DrawScaledEx(JpegGetData,&JPEGFile,x,y,member,denom);
}
break;
case 1:
if((member == 1) && (denom == 1)) //???è??·????±??????
{

//  GUI_JPEG_DrawEx(JpegGetData,&JPEGFile,(lcddev.width-XSize)/2-1,(lcddev.height-YSize)/2-1);
GUI_JPEG_DrawEx(JpegGetData,&JPEGFile,(800-xSize)/2-1,(480-ySize)/2-1);
}else
{
Xflag = (float)xSize*((float)member/(float)denom);
Yflag = (float)ySize*((float)member/(float)denom);
xSize = (800-(int)Xflag)/2-1;
ySize = (480-(int)Yflag)/2-1;
GUI_JPEG_DrawScaledEx(JpegGetData,&JPEGFile,xSize,ySize,member,denom);
}
break;
}
f_close(&JPEGFile);
}
return 0;
}
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-5-27
在线时间
11 小时
 楼主| 发表于 2015-9-16 14:18:57 | 显示全部楼层
回复【13楼】liliang129129:
---------------------------------
左老师,麻烦您帮我看一下,第一个程序是存在SD卡中的BMP格式图片,显示没错,第二个程序是存在SD卡中的JPG格式图片,就显示不出来,我都是利用emWIN的函数直接调用的,这两个代码我也核对了半天,找不出原因来,网上有说是将#define SDIO_TRANSFER_CLK_DIV              ((uint8_t)0x04)这样设置,并且Status_1 = SD_SetDeviceMode(SD_POLLING_MODE);再这样设置可以显示JPG文件,我都试了,麻烦您指点迷津
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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