打印

TFT模块,数字IC,画点坐标不正确,请高手指点

[复制链接]
2914|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我是土匪|  楼主 | 2009-3-2 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
驱动IC :AMP506,4.3寸TFT,

因为是数字屏,不需要缓存,因此也不需要坐标转化。这样理解对吗?

我调用TFT厂商提供函数,画点位置不受控,但是我开辟一块区域,设置填充框,然后填充图片和文字是没有问题的;
但是想在TFT任意位置画点,画线,圆,发现是从TFT起点开始依次画点,经查找发现纵坐标受控,横坐标不受控。总线方式驱动。

厂商函数如下:

/***************************************************
函数名称:void LCD_Pixel(uint16 x , uint16 y , uint16 couleur)
函数功能:在指定位置上画点
**************************************************/
void LCD_Pixel(uint16 x , uint16 y , uint16 couleur)
{
    TftSendCom(0x00);
    TftSendDat((x)>>8);
    TftSendDat((x)>>8);
    TftSendDat((x)>>8);
    TftSendDat(x);
    TftSendDat(y>>8);
    TftSendDat(y);
    TftSendDat((y)>>8);
    TftSendDat(y);
 
    FD506_DisplayRAM_WriteEnable;
    TftSendDat(couleur);
    FD506_DisplayRAM_WriteDisable;
}

/*******************************************************
* 名称: TftSendCom
* 功能: 向TFT液晶模块发送命令字。
* 入口参数: com   命令字(uint16)
* 出口参数: 无
*******************************************************/
void  TftSendCom(uint16 com)
{  S6D0129_IR = com;
}

/*******************************************************
* 名称: TftSendDat
* 功能: 向TFT液晶模块发送数据。
* 入口参数: dat   待发送的数据(uint16)
* 出口参数: 无
*******************************************************/
void  TftSendDat(uint16 dat)
{  S6D0129_DR = dat;
}

请大家指点。

相关帖子

沙发
我是土匪|  楼主 | 2009-3-2 11:17 | 只看该作者

问题解决

实际我的要在现实之前设定一个窗口,这样数据依次在窗口填充,所以我在需要画点的坐标位置设置一个窗口,窗口起点就在要画点的地方,这样数据就可以填充了,虽然效率低,但是满足我应用完全没问题。

/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数:x        指定点所在列的位置
*           y        指定点所在行的位置
*           color    显示颜色
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
****************************************************************************/
uint8  GUI_Point(uint16 x, uint16 y, TCOLOR color)
{  // 参数过滤 
  /* if(x>=GUI_LCM_XMAX) return(0);
   if(y>=GUI_LCM_YMAX) return(0);
   
   // 刷新显示 
       TftSendDat(color);
   */
  // uint16 addr;
   
 //  addr = y * 480 + x;
 //  TftSendCom(addr);
   
    TftSendCom(0x00);
    TftSendDat((x)>>8);
    TftSendDat((x)>>8);
    TftSendDat((x)>>8);
    TftSendDat(x);
    TftSendDat(y>>8);
    TftSendDat(y);
    TftSendDat((y)>>8);
    TftSendDat(y);
   
    AMP506_WindowSet(x,y, x + 2, y + 2);   //窗口,新添加语句
    FD506_DisplayRAM_WriteEnable;
    TftSendDat(color);
    FD506_DisplayRAM_WriteDisable;
       
    return(1);
}

至于比较深层次理论我还不是很懂,请路过的兄弟姐妹老少爷们不吝赐教!

使用特权

评论回复
板凳
芯行天下| | 2009-3-3 08:45 | 只看该作者

这种情况首先要看数据手册

遇到这种情况首先要看数据手册和函数的相关说是有,看一下驱动芯片有什么特殊的要求,如果出现你说的不受控,看一下是否程序中设置有错误。
如果实在不行,可以找相关的厂家技术问一下,这个不应该是难题吧。
如果真的不受控,厂家肯定也会提出合理的解决方案的,不过一般行列坐标都是受控的。

使用特权

评论回复
地板
我是土匪|  楼主 | 2009-3-6 10:16 | 只看该作者

既然斑竹给我加精,我就的让帖子有点内容

根据斑竹提示:
在DataSHEET中有这样一段陈述
To simplify the address control of display RAM access, the window area address
function allows for writing data only within a window area of display RAM specified by
registers REG[00]~REG[07] .
After writing data to the display RAM, the Address counter will be increased within
setting window address-range which is specified by
MIN X address (REG[0] & REG[1])
MAX X address (REG[2] & REG[3])
MIN Y address (REG[4] & REG[5])
MAX Y address (REG[6] & REG[7])
Therefore, data can be written consecutively without thinking the data address.

使用特权

评论回复
5
我是土匪|  楼主 | 2009-3-6 10:18 | 只看该作者

继续

换句话,在TFT上显示任何信息都要首先划定一个显示窗口,这个窗口就对应TFT上的点,所以我在某个地方要显示汉字,如16 * 16 ,那么我的窗口大小也是16 * 16,显示一个点就要让窗口的起点坐标在点的坐标上,供应商说,画点的窗口起点和终点一样也可以,但是我没有操作成功,所以我画点的函数就这样:
   uint8  GUI_Point(uint16 x, uint16 y, TCOLOR color)
{
    AMP506_WindowSet(x -1,y - 1, x + 4, y + 4); /////自己添加的所谓窗口
    FD506_DisplayRAM_WriteEnable;
    TftSendDat(color);
    FD506_DisplayRAM_WriteDisable;
    return(1);
}
这样操作点成功了

使用特权

评论回复
6
我是土匪|  楼主 | 2009-3-6 10:39 | 只看该作者

画点函数正常了,但是画线函数出错了

画线函数水平、垂直都没有问题,但是任意两点直线(斜线)效果如下:

实际效果似乎略有不同,几乎就是这样,我没带相机无法把真实图片上传。

使用特权

评论回复
7
我是土匪|  楼主 | 2009-3-6 10:42 | 只看该作者

开始我觉得锯齿波是错误的

后来经过研究发现这样是正确的,因为我的函数使用Bresenham法进行画直线

void  GUI_Line(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
{  int32   dx;                        // 直线x轴差值变量
   int32   dy;                      // 直线y轴差值变量
   int8    dx_sym;                    // x轴增长方向,为-1时减值方向,为1时增值方向
   int8    dy_sym;                    // y轴增长方向,为-1时减值方向,为1时增值方向
   int32   dx_x2;                    // dx*2值变量,用于加快运算速度
   int32   dy_x2;                    // dy*2值变量,用于加快运算速度
   int32   di;                        // 决策变量
   
   
   dx = x1-x0;                        // 求取两点之间的差值
   dy = y1-y0;
   
   /* 判断增长方向,或是否为水平线、垂直线、点 */
   if(dx>0)                            // 判断x轴方向
   {  dx_sym = 1;                    // dx>0,设置dx_sym=1
   }
   else
   {  if(dx<0)
      {  dx_sym = -1;                // dx<0,设置dx_sym=-1
      }
      else
      {  // dx==0,画垂直线,或一点
         GUI_RLine(x0, y0, y1, color);
           return;
      }
   }
   
   if(dy>0)                            // 判断y轴方向
   {  dy_sym = 1;                    // dy>0,设置dy_sym=1
   }
   else
   {  if(dy<0)
      {  dy_sym = -1;                // dy<0,设置dy_sym=-1
      }
      else
      {  // dy==0,画水平线,或一点
         GUI_HLine(x0, y0, x1, color);
           return;
      }
   }
    
   /* 将dx、dy取绝对值 */
   dx = dx_sym * dx;
   dy = dy_sym * dy;
 
   /* 计算2倍的dx及dy值 */
   dx_x2 = dx*2;
   dy_x2 = dy*2;
   
   /* 使用Bresenham法进行画直线 */
   if(dx>=dy)                        // 对于dx>=dy,则使用x轴为基准
   {  di = dy_x2 - dx;
      while(x0!=x1)
      {  GUI_Point(x0, y0, color);
         x0 += dx_sym;
         if(di<0)
         {  di += dy_x2;            // 计算出下一步的决策值
         }
         else
         {  di += dy_x2 - dx_x2;
            y0 += dy_sym;
         }
      }
      GUI_Point(x0, y0, color);        // 显示最后一点
   }
   else                                // 对于dx<dy,则使用y轴为基准
   {  di = dx_x2 - dy;
      while(y0!=y1)
      {  GUI_Point(x0, y0, color);
         y0 += dy_sym;
         if(di<0)
         {  di += dx_x2;
         }
         else
         {  di += dx_x2 - dy_x2;
            x0 += dx_sym;
         }
      }
      GUI_Point(x0, y0, color);        // 显示最后一点
   } 
  
}
鉴于暂时对这里要求不是很高,所以没有继续研究

使用特权

评论回复
8
我是土匪|  楼主 | 2009-3-6 10:46 | 只看该作者

秀个图片

working!

使用特权

评论回复
9
xwj| | 2009-3-6 10:56 | 只看该作者

看不到图

使用特权

评论回复
10
我是土匪|  楼主 | 2009-3-6 11:33 | 只看该作者

我上传时候有图片看的

我的直线效果类似图:

使用特权

评论回复
11
xwj| | 2009-3-6 14:47 | 只看该作者

如果是这样的“锯齿波”是对的啊

使用特权

评论回复
12
我是土匪|  楼主 | 2009-3-6 15:31 | 只看该作者

那个是理论图

我的是这样的:

使用特权

评论回复
13
gruul| | 2009-3-11 14:04 | 只看该作者

学习一下

学习一下

使用特权

评论回复
14
JB_blog| | 2009-3-20 09:54 | 只看该作者

很好

支持  支持  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

226

主题

1761

帖子

30

粉丝