- 打卡等级:以坛为家III
- 打卡总天数:780
- 最近打卡:2026-03-07 08:12:52
荣誉版主
- 积分
- 4861
|
发表于 2026-2-24 10:02:41
|
显示全部楼层
这位朋友好! 好的,再来交流讨论一下:
上面的LCD_LineV()函数是一个画垂直线的函数,比较简单,一共三行:
第一行 LCD_SetWindow(X,Y,X,Y+H);
这是设置显示窗口区域. 这个区域水平方向只有一个点像素,垂直方向有H点像素,所以后继写入的数据只能沿垂直方向落点,因此只能画一条垂直线.
第二行 for(i=0;i<H;i++)LCD_WR_DAT_16Bit(COLOR[Color]); //连续画色点
这就是当显示窗口区域设定后,连续写入数据,画出H个点的.
第三行 这是将显示区域恢复到全屏,确保后续语句执行不限于此前的设置区域.(如果后续语句有重新设置显示区域的话,那么本句可省略)
如果说,你的移植后只能显示画水平线,可能是方向的设置问题了.
再来看看下面你修改后的函数:
第一行 TFT_SET_ADD(X,Y,X,Y+H);
顾名思义,是设置地址, 好像是在设置一个坐标点,但是参数好像是设置一个区域.(不知TFT_SET_ADD()函数是如何写的)
第二行,LCD_MoveTo(X,Y+i);是定坐标点, 如果你确定要每写入一个点时,都要先确定一下坐标点,那么第一行语句就是多余的了.
第三行,TFT_SEND_DATA16(COLOR[Color]);写入点数据, 这没问题.
总体看, 因为Y+i变化点是在垂直方向的,这也是一个画垂直线的函数,只是效率可能低了一点点.
最后一句话,"我什么可以画垂直线?", 大概是"我怎么可以画垂直线?"吧,
估计你遇到的问题是用垂直线函数仅画出了水平线,而没有真正画出垂直线. 注意一下有关屏幕初始化.
建议理解一下SetDIR()函数,结合实际使用屏的资料,弄清楚设置显示方向(实际是地址自动递增的方向)的具体数据(屏可能有差异).
另外,本贴给出的源码:有画水平线函数和垂直线函数两种, 都可以实验比较一下.
注意水平线函数是X+W, 垂直线函数是Y+H,方向有所不同.
/*****************************************************************************
* 函数:void LCD_LineH(u16 X, u16 Y,u16 W,u8 Color) 画水平线
* 参数: X,Y 起始坐标点. W 水平宽度, Color 点颜色号
******************************************************************************/
void LCD_LineH(u16 X, u16 Y,u16 W,u8 Color)
{ u16 i;
LCD_SetWindow(X,Y,X+W,Y);
for(i=0;i<W;i++)LCD_WR_DAT_16Bit(COLOR[Color]); //连续画色点
LCD_SetWindow(X,Y,LCD_W,LCD_H);
}
/*****************************************************************************
* 函数:void LCD_LineV(u16 X, u16 Y,u16 H,u8 Color) 画垂直线
* 参数: X,Y 起始坐标点. H 垂直高度, Color 点颜色号
******************************************************************************/
void LCD_LineV(u16 X, u16 Y,u16 H,u8 Color)
{ u16 i;
LCD_SetWindow(X,Y,X,Y+H);
for(i=0;i<H;i++)LCD_WR_DAT_16Bit(COLOR[Color]); //连续画色点
LCD_SetWindow(X,Y,LCD_W,LCD_H);
}
祝你实验顺利愉快!
|
|