加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

STM32学习记录-如何屏幕画取折线图(函数代码)

06/13 08:58
1394
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
  • 相关文件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

实验效果图

本次实验运用到的函数

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

画直线的函数

/**
* @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)范围内随机数:nn");
	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<i;q++){	
				ILI9341_DrawLine(Num[q].start_x,Num[q].start_y,Num[q].end_x,Num[q].end_y)	;
				sprintf((char*)str,"%d",Num[q].num);	
				ILI9341_DispString_EN(Num[q].end_x,Num[q].end_y,str);
			
			}		
			}
			for(q=0;q<i;q++){	
			ILI9341_DrawLine(Num[q].start_x,Num[q].start_y,Num[q].end_x,Num[q].end_y)	;
			sprintf((char*)str,"%d",Num[q].num);	
			ILI9341_DispString_EN(Num[q].end_x,Num[q].end_y,str);
			
			}
			if(xl_avge<100){
				sprintf((char*)string,"heart- rate: %d",xl_avge);
			}else{
				sprintf((char*)string,"heart rate: %d",xl_avge);
			}
		  
	
	
			ILI9341_DispString_EN(60,210,string);	

					
		}
			
		
		
		//触摸检测函数,本函数至少10ms调用一次
		//	XPT2046_TouchEvenHandler();
	}

联系方式 微信号:13648103287

  • 联系方式.docx

相关推荐

电子产业图谱

方案定制,程序设计方案、单片机程序设计与讲解、APP定制开发。本公众号致力于向读者传递关于程序设计和开发的相关知识,并分享一些关于软件开发的最佳实践。如果您有什么问题或建议,请随时联系我们。我们将竭诚为您服务