快速画点函数和绘制直线函数可以根据自己屏幕来编写,文章来源:https://www.toymoban.com/news/detail-614589.html
void Port_DrawCurve(u8 x ,u16 value)
1、绘制曲线函数中的形参x,相当于时间轴,每一次进入函数,x就会++;
2、在绘制曲线之前需要先清除3列,这样绘制曲线就不用到最后了再整屏幕擦除。文章来源地址https://www.toymoban.com/news/detail-614589.html
//允许绘制曲线的区域
#define LCD_DRAW_CURVE_X_MIN 0 //屏幕X轴的起始值,
#define LCD_DRAW_CURVE_y_MIN 26 //屏幕Y轴的起始值,
#define LCD_DRAW_CURVE_X_MAX 128 //屏幕X轴的终点值,
#define LCD_DRAW_CURVE_y_MAX 128 //屏幕Y轴的终点值,
//通过上面宏定义可知,屏幕可以绘制曲线的区域为(0,26)~(128,128)的矩形区域
/*
* 描述: 快速画点函数
* 参数: 无
* 返回: 无*/
void LCD_Drive_DrawPoint(u16 x,u16 y, u16 color)
{
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(x>>8);
LCD_WR_DATA(x&0XFF);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(y>>8);
LCD_WR_DATA(y&0XFF);
LCD_WriteRAM_Prepare(); //
LCD_WR_DATA_16Bit(color);
LCD_WriteRAM_Prepare(); //
}
/*
* 描述: 绘制直线
* 参数: x1,y1:起点坐标
* x2,y2:终点坐标
* 返回: 无*/
void Port_LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x2-x1; //计算坐标增量
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x>0)incx=1; //设置单步方向
else if(delta_x==0)incx=0;//垂直线
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;//水平线
else{incy=-1;delta_y=-delta_y;}
if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for(t=0;t<=distance+1;t++ )//画线输出
{
LCD_Drive_DrawPoint(uRow,uCol,POINT_COLOR);//画点
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
/*
* 描述: 绘制曲线
* 参数: x:X轴坐标值,相当于时间轴
* value:Y轴坐标值,Y轴上的数值大小,就是实际数值的大小
* 返回: 无*/
void Port_DrawCurve(u8 x ,u16 value)
{
static u8 last_x,last_y = 0;
u16 temp_y = 0;
//这里由于数值较大,屏幕放不下,所以整体缩小了10倍
//使用的时候由于屏幕是倒置使用的,所以需要用128-value的值
temp_y = LCD_DRAW_CURVE_y_MAX - value/10;
POINT_COLOR = BLACK;
Port_LCD_DrawLine(x,LCD_DRAW_CURVE_y_MIN,x,LCD_DRAW_CURVE_y_MAX);
if(x+1 <= LCD_DRAW_CURVE_X_MAX)
{
Port_LCD_DrawLine(x+1,LCD_DRAW_CURVE_y_MIN,x+1,LCD_DRAW_CURVE_y_MAX);
}
if(x+2 <= LCD_DRAW_CURVE_X_MAX)
{
Port_LCD_DrawLine(x+2,LCD_DRAW_CURVE_y_MIN,x+2,LCD_DRAW_CURVE_y_MAX);
}
POINT_COLOR = GREEN;
//从第0列开始画
if(x == 0)
{
LCD_Drive_DrawPoint(x,temp_y,POINT_COLOR);
last_x = 0;
last_y = temp_y;
}
else
{
Port_LCD_DrawLine(last_x,last_y,x,temp_y);
last_x = x;
last_y = temp_y;
}
}
u8 temp_x = 0;
int mian()
{
temp_x++;
if(temp_x >= 128)
{
temp_x = 0;
}
Port_DrawCurve(temp_x,temperature);
HAL_Delay(100);
}
到了这里,关于STM32直接驱动TFT LCD,在LCD上根据数据绘制曲线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!