OpenEdv-开源电子网

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

TFTLCD开窗口写数据问题

[复制链接]

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2012-2-11
在线时间
9 小时
发表于 2013-1-8 11:25:40 | 显示全部楼层 |阅读模式

原子哥,我遇到一个困惑,情况如下:
就是在TFTLCD开窗口显示数据时,我按照你的方式写的程序,要完成的功能是: 
1.在指定区域内填充指定颜色
2.写字符
因为你说过开窗写数据可以提高写入速度,可是这样问题就来了。

问题一:在指定区域内填充指定颜色时竖屏时一切正常,但是,横屏时就出问题了。(因为填充要么方向不对,要么坐标不对。。)
分析:我想了好久,也找了好久,还是没想出来,最后在论坛的http://www.openedv.com/posts/list/7477.htm#38275找到了答案,原来我的问题出在坐标设置上,分析如下


 









就改了我的程序如下:

/***********************************************************
* 函数名称:LCD_SetCursor
* 函数功能:LCD设置坐标函数
*           入口参数: x( 水平坐标 )、y( 垂直坐标 )    
*   出口参数:无
***********************************************************/

__inline void LCD_SetCursor( u16 x, u16 y )
{
#if USE_HORIZONTAL==1 // 使用横屏
 LCD_WriteREG(R32, y);   // 设置GRAM的x坐标
 LCD_WriteREG(R33, 319-x); // 设置GRAM的y坐标       
#else
 LCD_WriteREG( R32, x );   // 设置GRAM的x坐标
 LCD_WriteREG( R33, y );   // 设置GRAM的y坐标         
#endif
}

/**********************************************************
* 函数名称:LCD_SetWindowSize
* 函数功能:设置窗口大小(edx-stx)*(edy-sty)
*           入口参数: stx: 开始x坐标
*          edx: 结束x坐标
*                     sty: 开始y坐标
*       edy: 结束y坐标
*   出口参数:无
***********************************************************/

void LCD_SetWindowSize( u16 stx, u16 edx, u16 sty, u16 edy )
{
#if USE_HORIZONTAL==1  // 横屏
 LCD_WriteREG( R80, sty ); // LCD写寄存器函数
 LCD_WriteREG( R81, edy ); // LCD写寄存器函数
 LCD_WriteREG( R82, 319-edx ); // LCD写寄存器函数
 LCD_WriteREG( R83, 319-stx ); // LCD写寄存器函数
#else
 LCD_WriteREG( R80, stx ); // LCD写寄存器函数
 LCD_WriteREG( R81, edx ); // LCD写寄存器函数
 LCD_WriteREG( R82, sty ); // LCD写寄存器函数
 LCD_WriteREG( R83, edy ); // LCD写寄存器函数
#endif
}
/***********************************************************
* 函数名称:LCD_Fill
* 函数功能:在指定区域内填充指定颜色
*           入口参数: 区域大小xend-xsta)*(yend-ysta)、c(颜色)    
*   出口参数:无
***********************************************************/

void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
{         
 u16 i,j;
 LCD_SetWindowSize(  xsta, xend, ysta, yend );// 设置窗口大小
    LCD_SetCursor(xsta,ysta); //设置光标位置
 LCD_WriteCom(R34);        //开始写入GRAM
#if USE_HORIZONTAL==1  // 使用横屏    
 for(i=0;i<(xend-xsta)+1;i++)
 {  
  for(j=0;j<(yend-ysta)+1;j++)LCD_WriteData(color);//填充颜色   
 }
#else   
 for(i=0;i<(yend-ysta)+1;i++)
 {  
  for(j=0;j<(xend-xsta)+1;j++)LCD_WriteData(color);////填充颜色    
 }
#endif
 LCD_SetWindowSize( 0x0000, LCD_W, 0x0000, LCD_H );//恢复窗体大小
}

把在指定区域内填充指定颜色的问题解决。可是还有问题。

问题二: 开窗口 写字符时竖屏一切OK,问题还是出在横屏显示,横屏显示时叠加方式显示字符正常,可是不叠加方式就出问题了,
还是老办法去想、去找,最后还是没解决(不叠加方式显示要么是乱码、要么是显示字符方向不对),急啊!后来没办法只能重取模来解决。


就重取模:
// ------------------  常用ASCII表字模的数据表 ------------------ //
// 码表从0x20~0x7e 
// 取模软件:PCtoLCD2002                                          //
// 取模方式:阴码,逐列式,逆向,文字垂直翻转
// 大小:16*8
// -------------------------------------------------------------- //
。。。。。。。数据

改写程序如下:

/**********************************************************
* 函数名称:LCD_ShowChar
* 函数功能:在指定位置显示一个字符
*           入口参数:  x   : 0~234
*         y   : 0~308
*        Char: 要显示的字符:" "--->"~"
*         mode: 叠加方式(1)还是非叠加方式(0)
*                      c   : 字体颜色
*   出口参数:无
***********************************************************/

void LCD_ShowChar(u16 x,u16 y,u8 Char,u8 mode, u16 c )
{    
    u8 temp;
    u8 pos,t;    
    if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return; 
    LCD_SetWindowSize( x, (x+LCD_FONT_W-1), y, (y+LCD_FONT_H-1) );// 开辟窗口写数据
    LCD_SetCursor(x,y); // 设置光标位置       
    LCD_WriteCom( R34 );// RAMdata 寄存器             
    Char=Char-' ';//得到偏移后的值
#if USE_HORIZONTAL==1 // 横屏
 if(!mode)//非叠加方式
 {
  for(pos=0;pos<(LCD_FONT_H);pos++)
  {
      temp=asc1_1608[Char][15-pos];    //调用1608字体
   for(t=0;t<(LCD_FONT_W);t++)
      {                
          if(temp&0x80)
    {
                    LCD_WriteData( c );
    }else LCD_WriteData( BACK_COLOR );        
          temp<<=1;
      }
  } 
 }
#else
 if(!mode)//非叠加方式
 {
  for(pos=0;pos<(LCD_FONT_H);pos++)
  {
   temp=asc2_1608[Char][pos];    //调用1608字体
   for(t=0;t<(LCD_FONT_W);t++)
      {                
          if(temp&0x01)
    {
                    LCD_WriteData( c );
    }else LCD_WriteData( BACK_COLOR );        
          temp>>=1;
      }
  }
 }
#endif
 else//叠加方式  叠加方式显示多用于在显示的图片上再显示字符
 {
  for(pos=0;pos<LCD_FONT_H;pos++)
  {
   temp=asc2_1608[Char][pos];   //调用1608字体
   for(t=0;t<LCD_FONT_W;t++)
      {                
          if(temp&0x01)LCD_DrawPoint(x+t,y+pos,c);//画一个点    
          temp>>=1;
      }
  }
 } 
 LCD_SetWindowSize( 0x0000, LCD_W, 0x0000, LCD_H );//恢复窗体大小    
}

上面在处理不叠加方式显示时横竖屏问题上用不同的取模数据和不同的扫描方式,但是叠加方式我还是没解决,只能共用一个取模数据和同种画点方法;

这样虽然解决了开窗显示字符问题,但是总感觉这样好浪费资源,不好,所以原子哥或者各位高手能给小弟指引一条明路,运用其他方法,在下不胜感激




多努力一点点,少遗憾一点点!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-8 13:30:46 | 显示全部楼层
回复【楼主位】JZHG1992:
---------------------------------
显示个字符什么的,直接画点都很快了。
开窗方式,在画图片的时候很有效果。大大提高速度,但是弊端就是,兼容性差,不同屏幕之间的指令区别,导致兼容性不好。如果能确定长期大量的使用一个屏,那可以考虑,但是如果考虑要兼容性好,就不用折腾了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2012-8-27
在线时间
21 小时
发表于 2013-1-8 13:39:36 | 显示全部楼层
给你2个我在用的函数,应对4个方向的
#define LCD_WIDTH    320
#define LCD_HEIGHT    240
void LCD_CreatWindows(u16 sx,u16 sy,u16 width,u16 height)
{
u16 ex = sx + width-1;
u16 ey = sy + height-1;

#ifdef vertical
    #ifdef __h1__
        LCD_WriteReg(R80,sx);
        LCD_WriteReg(R81,ex);
        LCD_WriteReg(R82,sy);
        LCD_WriteReg(R83,ey);
        LCD_WriteReg(R32,sx);
        LCD_WriteReg(R33,sy);
    #else
        LCD_WriteReg(R80,LCD_HEIGHT-1-ex);
        LCD_WriteReg(R81,LCD_HEIGHT-1-sx);
        LCD_WriteReg(R82,LCD_WIDTH-1-ey);
        LCD_WriteReg(R83,LCD_WIDTH-1-sy);
        LCD_WriteReg(R32,LCD_HEIGHT-1-sx);
        LCD_WriteReg(R33,LCD_WIDTH-1-sy);
    #endif
#else
    #ifdef __h1__
        LCD_WriteReg(R80,LCD_HEIGHT-1 - ey); //横屏也有2种方式,方式1
        LCD_WriteReg(R81,LCD_HEIGHT-1 - sy);
        LCD_WriteReg(R82,sx);
        LCD_WriteReg(R83,ex);
        LCD_WriteReg(R32,LCD_HEIGHT-1 - sy);
        LCD_WriteReg(R33,sx);
    #else
        LCD_WriteReg(R80,sy); //横屏也有2种方式,方式2,在方式1的基础上旋转180度
        LCD_WriteReg(R81,ey);
        LCD_WriteReg(R82,LCD_WIDTH-1-ex);
        LCD_WriteReg(R83,LCD_WIDTH-1-sx);
        LCD_WriteReg(R32,sy);
        LCD_WriteReg(R33,LCD_WIDTH-1-sx);
    #endif
#endif
    LCD_WR_REG(R34);//开始写入GRAM
}
在LCD初始化时,把寄存器3修改为这个,
#ifdef vertical
    #ifdef __h1__
        LCD_WriteReg(0x003,0x1030);
    #else
        LCD_WriteReg(0x003,0x1000);
    #endif
#else
    #ifdef __h1__
        LCD_WriteReg(0x003,0x10a8);    //控制扫描方向
    #else
        LCD_WriteReg(0x003,0x1098);    //控制扫描方向
    #endif
#endif

其他的就按照你之前写的来做就行了,希望能帮到你
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2012-2-11
在线时间
9 小时
 楼主| 发表于 2013-1-8 14:57:20 | 显示全部楼层
回复【3楼】etkl:
给你2个我在用的函数,应对4个方向的#define LCD_WIDTH    320#define LCD_HEIGHT    240void LCD_CreatWindows(u16 sx,u16 sy,u16 width,u16 height){u16 ex = sx + width-1;u16 ey = sy + height-1;#ifdef vertical    #ifdef __h1__        LCD_WriteReg(R80,sx);        LCD_WriteReg(R81,ex);        LCD_WriteReg(R82,sy);        LCD_WriteReg(R83,ey);        LCD_WriteReg(R32,sx);        LCD_WriteReg(R33,sy);    #else        LCD_Wri
......
---------------------------------
呵呵! 谢谢啊,原子哥说的对,没必要花时间去研究这个了~~
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

8

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-12-17
在线时间
0 小时
发表于 2013-6-14 12:37:52 | 显示全部楼层
楼主你好。我最近也在搞TFTLCD开窗口显示。
我做出来的和你的效果一样。我也移植了你的代码。在指定的窗口显示指定的颜色,达不到效果。所以你的开窗口显示貌似也有问题。不知道你实际达到效果没有。
个人博客:http://blog.sina.com.cn/u/2539869495
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2012-2-11
在线时间
9 小时
 楼主| 发表于 2013-6-14 21:29:55 | 显示全部楼层
回复【5楼】Stone_up:
---------------------------------
呵呵!我的是重新取模的,用了两种字模数据,一种是原子哥的方式,另一种是下面方式,扫描方式自己看看楼上吧。。

就重取模:
// ------------------  常用ASCII表字模的数据表 ------------------ //
// 码表从0x20~0x7e  
// 取模软件:PCtoLCD2002                                          //
// 取模方式:阴码,逐列式,逆向,文字垂直翻转
// 大小:16*8 
// -------------------------------------------------------------- //
。。。。。。。数据
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

19

主题

199

帖子

0

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2012-11-18
在线时间
73 小时
发表于 2015-2-8 17:54:27 | 显示全部楼层
我也发现  void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)   函数横屏的时候有问题。

图片横屏显示也有问题。宏定义也改了。

各位大大们,怎么解决?
回复 支持 反对

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
发表于 2015-3-12 16:08:26 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
弱弱的问一句,什么叫TFTLCD开窗口显示数据?
Good good study , day day up...
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-12 22:40:58 | 显示全部楼层
回复【8楼】Just Beat It:
---------------------------------
就是开一个窗口,然后填充数据即可,不需要频繁设置坐标.
估计你还是不懂,慢慢学习吧,别想着一步登天.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-12 22:41:43 | 显示全部楼层
回复【8楼】Just Beat It:
---------------------------------
建议你没事可以去看看LCD的驱动IC数据手册,全英文的,慢慢啃.
但是可以学会很多基础概念.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
发表于 2015-3-13 08:19:09 | 显示全部楼层
好的,谢谢原子哥
Good good study , day day up...
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-3-31
在线时间
1 小时
发表于 2015-3-31 17:50:57 | 显示全部楼层
大家好,接触TFT有一个多月了,可我现在只会一页页刷满屏的画面,但是写窗口要怎么写?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-5-5
在线时间
0 小时
发表于 2015-6-7 14:40:52 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
原子哥可不可以给一个 用开窗法显示字符 的例程,我的毕业设计要用到开窗法和普通描点法在显示效率上的比较。我用了楼主的方法,可是根本显示不出字符(不论横屏还是竖屏)
学生
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-8 00:31:49 | 显示全部楼层
回复【13楼】IVY:
---------------------------------
没有哦
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-5-5
在线时间
0 小时
发表于 2015-6-8 22:01:02 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
哦哦
学生
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2017-3-8
在线时间
5 小时
发表于 2017-3-9 16:52:22 | 显示全部楼层
我想请问一下,TFTLCD屏,开窗后如何关窗。我只能重新扫描整个屏幕,7寸屏,挺慢的。想知道是不是自己方法错了。
回复 支持 反对

使用道具 举报

34

主题

174

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1103
金钱
1103
注册时间
2017-3-10
在线时间
173 小时
发表于 2017-3-30 11:17:31 | 显示全部楼层
652461466 发表于 2017-3-9 16:52
我想请问一下,TFTLCD屏,开窗后如何关窗。我只能重新扫描整个屏幕,7寸屏,挺慢的。想知道是不是自己方法 ...

对啊,我用的也是七寸的,刷屏慢。。。。用的RA8875,后面再探究探究吧。
回复 支持 反对

使用道具 举报

30

主题

72

帖子

0

精华

高级会员

Rank: 4

积分
661
金钱
661
注册时间
2013-7-23
在线时间
91 小时
发表于 2017-3-30 15:18:59 | 显示全部楼层
RA8875的问题,可以找我们,专业技术支持
瑞佑科技分公司:深圳市瑞福科技有限公司 微信&手机:13760238805 瑞佑系列RA8875L3N, RA8876L4N, RA8877L4N,RA8889ML3N、RA8835AP3N...
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-22 15:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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