OpenEdv-开源电子网

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

StemWi使用横屏显示时出错,各种尝试无果,请大神搭救。。。

[复制链接]

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2014-2-25
在线时间
230 小时
发表于 2016-1-5 17:38:07 | 显示全部楼层 |阅读模式
5金钱
   前一阵子移植好emWin到stm32之后移植没有使用,今天把程序拿出来使用,然后改成横屏试试看效果,擦,这是怎么回事。看下图:

显示不全,右下角很奇怪

显示不全,右下角很奇怪
       IMG_20160105_171846.jpg
使用竖屏时候没有任何问题,看图:
IMG_20160105_172310.jpg



情况说明:液晶驱动拿出来单独测试过,横屏竖屏时显示数字,字符串,画线画圆一点问题没有。按理说只要液晶显示正常,那么留给StemWin的函数接口没问题就可以跑起来了,现在遇到了这样子的问题,真是奇怪。希望知道的朋友提点建议,不然就只能使用竖屏了。


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

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2014-2-25
在线时间
230 小时
 楼主| 发表于 2016-1-5 18:47:01 | 显示全部楼层
yklstudent 发表于 2016-1-5 17:47
好高级,膜拜楼主,还没开始接触ucGUI/EMWIN呢

不行啊,现在遇到问题还没解决呢
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-1-5 20:25:00 | 显示全部楼层
我记得STemWin里面官方例程有个改横竖显示的地方,改完后还要修改相应分辨率。不需要修改屏幕本身的扫描方向
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2014-2-25
在线时间
230 小时
 楼主| 发表于 2016-1-5 20:52:15 | 显示全部楼层
ricefat 发表于 2016-1-5 20:25
我记得STemWin里面官方例程有个改横竖显示的地方,改完后还要修改相应分辨率。不需要修改屏幕本身的扫描方 ...

指的是这里吗?

//屏幕大小
#define XSIZE_PHYS  480 //X轴
#define YSIZE_PHYS  320 //Y轴
#define VXSIZE_PHYS        480
#define VYSIZE_PHYS 320
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-1-5 22:20:58 | 显示全部楼层
1201yuge 发表于 2016-1-5 20:52
指的是这里吗?

//屏幕大小

是的
回复

使用道具 举报

13

主题

276

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2014-6-20
在线时间
146 小时
发表于 2016-1-5 22:57:35 | 显示全部楼层
我也是使用横屏,但没有遇到你的问题
回复

使用道具 举报

9

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1134
金钱
1134
注册时间
2014-7-25
在线时间
176 小时
发表于 2016-1-6 09:01:15 | 显示全部楼层
感觉像是块填充的时候出问题,建议楼主检测一下块填充,以及设置XY的坐标是否有误,横竖屏切换时XY走的坐标设置需要对换。
回复

使用道具 举报

69

主题

495

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2193
金钱
2193
注册时间
2015-11-14
在线时间
541 小时
发表于 2016-1-6 09:03:19 | 显示全部楼层
x和y互换了没?
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2014-2-25
在线时间
230 小时
 楼主| 发表于 2016-1-6 11:16:43 | 显示全部楼层
孤心寒 发表于 2016-1-6 09:01
感觉像是块填充的时候出问题,建议楼主检测一下块填充,以及设置XY的坐标是否有误,横竖屏切换时XY走的坐标 ...

换了,你说的就是这里吧
if(dir==0)                        //竖屏
        {
                lcddev.dir=0;        //竖屏

                        lcddev.wramcmd=0X2C;
                         lcddev.setxcmd=0X2A;
                        lcddev.setycmd=0X2B;           

                        lcddev.width=320;
                        lcddev.height=480;
                       
        }else                                 //横屏
        {                                         
                lcddev.dir=1;        //横屏

                lcddev.wramcmd=0X2C;
                lcddev.setxcmd=0X2B;
                lcddev.setycmd=0X2A;

                lcddev.width=480;
                lcddev.height=320;                        
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2014-2-25
在线时间
230 小时
 楼主| 发表于 2016-1-6 11:17:28 | 显示全部楼层

换了的,在不加入DEMO的时候是没有问题的。
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2014-2-25
在线时间
230 小时
 楼主| 发表于 2016-1-6 11:20:06 | 显示全部楼层

试过了,不可以的。
回复

使用道具 举报

9

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1134
金钱
1134
注册时间
2014-7-25
在线时间
176 小时
发表于 2016-1-6 17:05:56 | 显示全部楼层
1201yuge 发表于 2016-1-6 11:16
换了,你说的就是这里吧
if(dir==0)                        //竖屏
        {

读点函数发上来看一下,还有LCDConf_FlexColor_Template.c文件。
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2014-2-25
在线时间
230 小时
 楼主| 发表于 2016-1-6 18:08:08 | 显示全部楼层
孤心寒 发表于 2016-1-6 17:05
读点函数发上来看一下,还有LCDConf_FlexColor_Template.c文件。

u16 LCD_BGR2RGB(u16 c)
{
        u16  r,g,b,rgb;   
        b=(c>>0)&0x1f;
        g=(c>>5)&0x3f;
        r=(c>>11)&0x1f;         
        rgb=(b<<11)+(g<<5)+(r<<0);                 
        return(rgb);
}
//当mdk -O1时间优化时需要设置
//延时i
void opt_delay(u8 i)
{
        while(i--);
}
//读取个某点的颜色值         
//x,y:坐标
//返回值:此点的颜色
u16 LCD_ReadPoint(u16 x,u16 y)
{
        vu16 r=0,g=0,b=0;
        if(x>=lcddev.width||y>=lcddev.height)return 0;        //超过了范围,直接返回                  
        LCD_SetCursor(x,y);            
        LCD_WR_REG(0X2E);//发送读GRAM指令

        LCD_RD_DATA();                                                                        //dummy Read          
        opt_delay(2);          
        r=LCD_RD_DATA();                                                                    //实际坐标颜色
  return LCD_BGR2RGB(r);                                               
}                         



回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2014-2-25
在线时间
230 小时
 楼主| 发表于 2016-1-6 18:10:18 | 显示全部楼层
孤心寒 发表于 2016-1-6 17:05
读点函数发上来看一下,还有LCDConf_FlexColor_Template.c文件。



我的液晶型号是:9841



#include "GUI.h"
#include "ILI94xx.h"
#include "touch.h"
#include "GUIDRV_Template.h"
#include "GUIDRV_FlexColor.h"

//与触摸屏有关定义,根据实际情况填写
#define TOUCH_AD_TOP                  3940          //按下触摸屏的顶部,写下 Y 轴模拟输入值。
#define TOUCH_AD_BOTTOM                488         //按下触摸屏的底部,写下 Y 轴模拟输入值。
#define TOUCH_AD_LEFT                 3883                //按下触摸屏的左侧,写下 X 轴模拟输入值。
#define TOUCH_AD_RIGHT                150        //按下触摸屏的右侧,写下 X 轴模拟输入值。


//屏幕大小
#define XSIZE_PHYS  320 //X轴
#define YSIZE_PHYS  480 //Y轴
#define VXSIZE_PHYS        480
#define VYSIZE_PHYS 320


//配置检查
#ifndef   VXSIZE_PHYS
  #define VXSIZE_PHYS XSIZE_PHYS
#endif
#ifndef   VYSIZE_PHYS
  #define VYSIZE_PHYS YSIZE_PHYS
#endif
#ifndef   XSIZE_PHYS
  #error Physical X size of display is not defined!
#endif
#ifndef   YSIZE_PHYS
  #error Physical Y size of display is not defined!
#endif
#ifndef   GUICC_565
  #error Color conversion not defined!
#endif
#ifndef   GUIDRV_FLEXCOLOR
  #error No display driver defined!
#endif



//配置程序,用于创建显示驱动器件,设置颜色转换程序和显示尺寸
void LCD_X_Config(void) {
        GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_M565, 0, 0); //创建显示驱动器件
        LCD_SetSizeEx    (0, lcddev.width, lcddev.height);
        LCD_SetVSizeEx   (0, lcddev.width, lcddev.height);
        if(lcddev.id == 0X5510) //0X5510为4.3寸 800x480的屏
        {
                if(lcddev.dir == 0) //竖屏  // 2001:3520 6352
                        {                                            // 9147:3832 6288
                        GUI_TOUCH_Calibrate(GUI_COORD_X,0,480,0,479);
                        GUI_TOUCH_Calibrate(GUI_COORD_Y,0,800,0,799);
                }else //横屏
                {
                        //GUI_TOUCH_SetOrientation(GUI_SWAP_XY|GUI_MIRROR_Y);
                        GUI_TOUCH_Calibrate(GUI_COORD_X,0,480,0,479);                
                        GUI_TOUCH_Calibrate(GUI_COORD_Y,0,800,0,799);
                }
        }else if(lcddev.id == 0X1963)//1963为7寸屏 800*480
        {
                if(lcddev.dir == 0) //竖屏
                {                                        // 6368 3816
                        //GUI_TOUCH_SetOrientation(GUI_SWAP_XY|GUI_MIRROR_Y);
                        GUI_TOUCH_Calibrate(GUI_COORD_X,0,800,0,799);                
                        GUI_TOUCH_Calibrate(GUI_COORD_Y,0,480,0,479);
                }else //横屏
                {
                        GUI_TOUCH_Calibrate(GUI_COORD_X,0,800,0,799);                
                        GUI_TOUCH_Calibrate(GUI_COORD_Y,0,480,0,479);
                }
        }else if(lcddev.id == 0X5310 || lcddev.id == 0X6804 || lcddev.id == 0X9481) //0X5510 0X6804为3.5寸 320x480
        {
    if(lcddev.dir == 0) //竖屏        
                {                                                       
                        GUI_TOUCH_Calibrate(GUI_COORD_X,0,320,TOUCH_AD_LEFT,TOUCH_AD_RIGHT);
                        GUI_TOUCH_Calibrate(GUI_COORD_Y,0,480,TOUCH_AD_TOP,TOUCH_AD_BOTTOM);
                }else //横屏
                {
                        GUI_TOUCH_SetOrientation(GUI_SWAP_XY|GUI_MIRROR_Y);
                        GUI_TOUCH_Calibrate(GUI_COORD_X,0,480,TOUCH_AD_LEFT,TOUCH_AD_RIGHT);
                        GUI_TOUCH_Calibrate(GUI_COORD_Y,0,320,TOUCH_AD_TOP,TOUCH_AD_BOTTOM);        
                }
        }
        else             //其他屏幕全部默认为2.8寸 320X240
        {
                if(lcddev.dir == 0) //竖屏
                {                                       
                        GUI_TOUCH_Calibrate(GUI_COORD_X,0,lcddev.width,155,3903);
                        GUI_TOUCH_Calibrate(GUI_COORD_Y,0,lcddev.height,188,3935);
                }else //横屏
                {
                        GUI_TOUCH_SetOrientation(GUI_SWAP_XY|GUI_MIRROR_Y);
                        GUI_TOUCH_Calibrate(GUI_COORD_X,0,240,155,3903);        
                        GUI_TOUCH_Calibrate(GUI_COORD_Y,0,320,188,3935);
                }
        }
}

//显示器驱动的回调函数
int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
  int r;
  (void) LayerIndex;
  (void) pData;

  switch (Cmd) {
  case LCD_X_INITCONTROLLER: {
        //当初始化的时候被调用,主要是设置显示控制器,如果显示控制器在外部初始化则需要用户初始化
               
        //        TFTLCD_Init(); //初始化LCD 已经在开始初始化了,所以此处不需要初始化。
    return 0;
  }
                default:
    r = -1;
        }
  return r;
}


回复

使用道具 举报

9

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1134
金钱
1134
注册时间
2014-7-25
在线时间
176 小时
发表于 2016-1-7 16:56:43 | 显示全部楼层
1201yuge 发表于 2016-1-6 18:10
我的液晶型号是:9841

看着都没错,那估计是横竖屏切换的时候命令的问题了
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2014-2-25
在线时间
230 小时
 楼主| 发表于 2016-1-7 18:04:52 | 显示全部楼层
孤心寒 发表于 2016-1-7 16:56
看着都没错,那估计是横竖屏切换的时候命令的问题了

具体一点,是指那8种扫描方式吗?还是指哪里呢?
回复

使用道具 举报

9

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1134
金钱
1134
注册时间
2014-7-25
在线时间
176 小时
发表于 2016-1-7 20:11:03 | 显示全部楼层
1201yuge 发表于 2016-1-7 18:04
具体一点,是指那8种扫描方式吗?还是指哪里呢?

估计是吧,你在仔细看看吧
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2014-2-25
在线时间
230 小时
 楼主| 发表于 2016-1-7 20:16:24 | 显示全部楼层
孤心寒 发表于 2016-1-7 20:11
估计是吧,你在仔细看看吧

好吧,那8种扫描方式我都试过了,没有一种可以的。只有竖屏的时候可以。
回复

使用道具 举报

14

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2014-5-25
在线时间
21 小时
发表于 2016-8-10 15:14:46 | 显示全部楼层
我遇到和你一样的问题,屏的型号不一样,加入demo就不正常,不加就正常,现在你的问题解决了没?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-5-25
在线时间
11 小时
发表于 2016-9-26 14:50:43 | 显示全部楼层
我和你遇到的问题一样,是_DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize);这个函数出了问题,比较笨的办法是,在这边先设置竖屏,再设回横屏。
回复

使用道具 举报

15

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2014-1-2
在线时间
62 小时
发表于 2016-12-18 21:39:45 | 显示全部楼层
同遇到问题,竖屏正常,横屏不正常,调试发现,是GUI_Init 这个函数之后就不正常了,所以窃以为是移植时的写点和填块出问题了,继续研究。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 05:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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