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

目录

实验效果图

本次实验运用到的函数

画直线的函数

局部清屏函数

如何画

第一步

第二步

第三步

第四步


实验效果图

本次实验运用到的函数

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

画直线的函数

/**
 * @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<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();
	}

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
STM32是一款非常流行的嵌入式微控制器系列,它具有强大的性能和丰富的外设资源。在学习STM32时,掌握如何进行Flash读写是非常重要的。 Flash是一种非易失性存储器,可以用来存储程序代码和数据。在STM32中,Flash存储器通常用来存储应用程序代码。下面是一个简单的Flash读写程序的示例: 1.首先,我们需要包含适用于所使用的STM32型号的头文件。例如,对于STM32F4系列,我们需要包含"stm32f4xx.h"。 2.然后,我们需要定义一个指向Flash存储器的指针变量。例如,可以使用如下代码:`uint32_t* flash_address = (uint32_t*)0x08000000;`其中0x08000000是Flash存储器的起始地址。 3.要读取Flash存储器中的数据,我们可以通过以下代码实现:`data = *flash_address;`其中data是一个变量,用于存储读取到的数据。 4.要写入数据到Flash存储器中,我们可以通过以下代码实现:`*flash_address = data;`其中data是要写入的数据。 需要注意的是,STM32的Flash存储器是有写保护机制的,因此在写入数据之前,我们需要禁用写保护。可以使用以下代码禁用写保护:`FLASH->KEYR = 0x45670123; FLASH->KEYR = 0xCDEF89AB;`然后才能进行数据写入。 另外,为了确保数据的完整性,我们可以使用CRC校验来验证Flash存储器中的程序代码的正确性。可以使用库函数来计算校验和,然后将其与预期的校验和进行比较以进行验证。 综上所述,掌握STM32的Flash读写操作对于嵌入式系统的开发非常重要。上述示例代码可以帮助我们快速进行Flash读写操作,同时注意写保护和数据校验可以提高数据的安全性和可靠性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿柒学起来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值