使用STM32直接驱动TFT LCD,在LCD上绘制数据曲线详解

快速画点函数和绘制直线函数可以根据自己屏幕来编写,

void Port_DrawCurve(u8 x ,u16 value)
1、绘制曲线函数中的形参x,相当于时间轴,每一次进入函数,x就会++;
2、在绘制曲线之前需要先清除3列,这样绘制曲线就不用到最后了再整屏幕擦除。


//允许绘制曲线的区域
#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);
}

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32直接驱动TFT LCD,在LCD上绘制数据曲线详解

发表评论