STM32学习记录--如何屏幕画取折线图

目录

实验效果图

本次实验运用到的函数

画直线的函数

局部清屏函数

如何画

第一步

第二步

第三步

第四步


实验效果图

STM32学习记录--如何屏幕画取折线图_第1张图片

本次实验运用到的函数

因为大家运用到的屏幕可能不同,所以这里我只贴了功能函数,大家可以根据具体的修改

画直线的函数

/**
 * @brief  在 ILI9341 显示器上使用 Bresenham 算法画线段 
 * @param  usX1 :在特定扫描方向下线段的一个端点X坐标
 * @param  usY1 :在特定扫描方向下线段的一个端点Y坐标
 * @param  usX2 :在特定扫描方向下线段的另一个端点X坐标
 * @param  usY2 :在特定扫描方向下线段的另一个端点Y坐标
 * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
 * @retval 无
 */
void ILI9341_DrawLine ( uint16_t usX1, uint16_t usY1, uint16_t usX2, uint16_t usY2 );

局部清屏函数

/**
 * @brief  对ILI9341显示器的某一窗口以某种颜色进行清屏
 * @param  usX :在特定扫描方向下窗口的起点X坐标
 * @param  usY :在特定扫描方向下窗口的起点Y坐标
 * @param  usWidth :窗口的宽度
 * @param  usHeight :窗口的高度
 * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
 * @retval 无
 */
void ILI9341_Clear ( uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight ) 

如何画

第一步

首先是X轴和Y轴,先确定屏幕的字模方向,在屏幕中画出X与Y轴

第二步

建立一个数值来储存数据

这个数组会保存数据的起始坐标与结束坐标,实现画出一条连接的直线

#define NUM 8

typedef struct 
{
  uint16_t start_x;   //按键的x起始坐标  
  uint16_t start_y;   //按键的y起始坐标
  uint16_t end_x;     //按键的x结束坐标 
  uint16_t end_y;     //按键的y结束坐标
  uint32_t num;      //数值

}XL_Num;

第三步

实现数据的保存,以及实现坐标的自动演算保证与上一个点连接,这里有个判断是不是第一个数据点,如何是的化就是从起始点来,如果不是就直接按照方位递增(这里我是保存到flash里面之后再从里面拿数据,可以省去这一步)

/*图像结构体数组*/
XL_Num Num[NUM];

void draw_X_Y(u8 i){
	
	u8 j;
	//生成数据保存到flash
	InternalFlash(0X00 ,RandNum());
	if(i>0){
				
	   Num[i].start_x = Num[i-1].end_x;
			Num[i].start_y = Num[i-1].end_y ;
			Num[i].end_x = 30+i*30;
			Num[i].end_y = 210-Read_flash(0X00);
			//读取flash数据
			Num[i].num = Read_flash(0X00) ;
	

	}else{
	   Num[i].start_x = 30;
			Num[i].start_y = 205;
			Num[i].end_x = 30;
			Num[i].end_y = 210-Read_flash(0X00);
			//读取flash数据
			Num[i].num = Read_flash(0X00) ;	
	
	
	}

}

RandNum()函数是产生随机数据的一个功能函数

int b;
 /**
  * @brief  生成随机数据
  * @param  None
  * @retval int a=m+rand()%(n-m+1);
  */
int RandNum(void){
	int a;
	
	b = 0+rand()%1500;
	printf("随机产生1个[50,150)范围内随机数:\n\n");
	srand(b);   //用时间作种子
	b++;
	if(b>100)
		b=0;
	//srand(time(0));
	a = 50+rand()%100;
	printf("随机数为:%d",a);
	return a;
	   
}	

第四步

只是主要程序,因为数组大小是8,所以当保存了第八数一个图就会自动清除之后又进行一个循环的显示

while ( 1 )
	{
		delay_ms(10);
		time++;
		if(time == 10){
			
			draw_X_Y(i);
			
			//ILI9341_Clear(40,0,LCD_X_LENGTH,190);	
			i++;
			time=0;
			xl_avge=0;
			xl_avge= (Num[0].num+Num[1].num+Num[2].num+Num[3].num+Num[4].num+Num[5].num+Num[6].num+Num[7].num)/8 ;
			if(i>7){
				i=0;
				ILI9341_Clear(33,0,LCD_X_LENGTH,190);
				//xl_avge= (Num[0].num+Num[1].num+Num[2].num+Num[3].num+Num[4].num+Num[5].num+Num[6].num+Num[7].num)/8 ;
				for(q=0;q

你可能感兴趣的:(学习心得,嵌入式,嵌入式硬件,stm32,单片机)