加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入

STM32學(xué)習(xí)記錄-如何屏幕畫取折線圖(函數(shù)代碼)

06/13 08:58
1610
服務(wù)支持:
技術(shù)交流群

完成交易后在“購(gòu)買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長(zhǎng)和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購(gòu)買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

實(shí)驗(yàn)效果圖

本次實(shí)驗(yàn)運(yùn)用到的函數(shù)

因?yàn)榇蠹疫\(yùn)用到的屏幕可能不同,所以這里我只貼了功能函數(shù),大家可以根據(jù)具體的修改

畫直線的函數(shù)

/**
* @brief ?在 ILI9341 顯示器上使用 Bresenham 算法畫線段
* @param ?usX1 :在特定掃描方向下線段的一個(gè)端點(diǎn)X坐標(biāo)
* @param ?usY1 :在特定掃描方向下線段的一個(gè)端點(diǎn)Y坐標(biāo)
* @param ?usX2 :在特定掃描方向下線段的另一個(gè)端點(diǎn)X坐標(biāo)
* @param ?usY2 :在特定掃描方向下線段的另一個(gè)端點(diǎn)Y坐標(biāo)
* @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函數(shù)設(shè)置顏色
* @retval 無
*/
void ILI9341_DrawLine ( uint16_t usX1, uint16_t usY1, uint16_t usX2, uint16_t usY2 );

局部清屏函數(shù)

/**
* @brief ?對(duì)ILI9341顯示器的某一窗口以某種顏色進(jìn)行清屏
* @param ?usX :在特定掃描方向下窗口的起點(diǎn)X坐標(biāo)
* @param ?usY :在特定掃描方向下窗口的起點(diǎn)Y坐標(biāo)
* @param ?usWidth :窗口的寬度
* @param ?usHeight :窗口的高度
* @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函數(shù)設(shè)置顏色
* @retval 無
*/
void ILI9341_Clear ( uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight )

如何畫

第一步

首先是X軸和Y軸,先確定屏幕的字模方向,在屏幕中畫出X與Y軸

第二步

建立一個(gè)數(shù)值來儲(chǔ)存數(shù)據(jù)

這個(gè)數(shù)組會(huì)保存數(shù)據(jù)的起始坐標(biāo)與結(jié)束坐標(biāo),實(shí)現(xiàn)畫出一條連接的直線

#define NUM 8

typedef struct 
{
  uint16_t start_x;   //按鍵的x起始坐標(biāo)  
  uint16_t start_y;   //按鍵的y起始坐標(biāo)
  uint16_t end_x;     //按鍵的x結(jié)束坐標(biāo) 
  uint16_t end_y;     //按鍵的y結(jié)束坐標(biāo)
  uint32_t num;      //數(shù)值

}XL_Num;

第三步

實(shí)現(xiàn)數(shù)據(jù)的保存,以及實(shí)現(xiàn)坐標(biāo)的自動(dòng)演算保證與上一個(gè)點(diǎn)連接,這里有個(gè)判斷是不是第一個(gè)數(shù)據(jù)點(diǎn),如何是的化就是從起始點(diǎn)來,如果不是就直接按照方位遞增(這里我是保存到flash里面之后再?gòu)睦锩婺脭?shù)據(jù),可以省去這一步)

/*圖像結(jié)構(gòu)體數(shù)組*/
XL_Num Num[NUM];

void draw_X_Y(u8 i){
	
	u8 j;
	//生成數(shù)據(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數(shù)據(jù)
			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數(shù)據(jù)
			Num[i].num = Read_flash(0X00) ;	
	
	
	}

}

RandNum()函數(shù)是產(chǎn)生隨機(jī)數(shù)據(jù)的一個(gè)功能函數(shù)

int b;
 /**
  * @brief  生成隨機(jī)數(shù)據(jù)
  * @param  None
  * @retval int a=m+rand()%(n-m+1);
  */
int RandNum(void){
	int a;
	
	b = 0+rand()%1500;
	printf("隨機(jī)產(chǎn)生1個(gè)[50,150)范圍內(nèi)隨機(jī)數(shù):nn");
	srand(b);   //用時(shí)間作種子
	b++;
	if(b>100)
		b=0;
	//srand(time(0));
	a = 50+rand()%100;
	printf("隨機(jī)數(shù)為:%d",a);
	return a;
	   
}	

第四步

只是主要程序,因?yàn)閿?shù)組大小是8,所以當(dāng)保存了第八數(shù)一個(gè)圖就會(huì)自動(dòng)清除之后又進(jìn)行一個(gè)循環(huán)的顯示

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);	

					
		}
			
		
		
		//觸摸檢測(cè)函數(shù),本函數(shù)至少10ms調(diào)用一次
		//	XPT2046_TouchEvenHandler();
	}

聯(lián)系方式 微信號(hào):13648103287

  • 聯(lián)系方式.docx

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
MK70FX512VMJ15 1 Freescale Semiconductor Kinetis K 32-bit MCU, ARM Cortex-M4 core, 512KB Flash, 150MHz, Graphics LCD, MAPBGA 256

ECAD模型

下載ECAD模型
$17.99 查看
STM32F429VIT6 1 STMicroelectronics High-performance advanced line, Arm Cortex-M4 core with DSP and FPU, 2 Mbytes of Flash memory, 180 MHz CPU, ART Accelerator, Chrom-ART Accelerator, FSMC, TFT

ECAD模型

下載ECAD模型
$34.08 查看
STM32F405RGT6W 1 STMicroelectronics High-performance foundation line, Arm Cortex-M4 core with DSP and FPU, 1 Mbyte of Flash memory, 168 MHz CPU, ART Accelerator

ECAD模型

下載ECAD模型
$14.1 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

方案定制,程序設(shè)計(jì)方案、單片機(jī)程序設(shè)計(jì)與講解、APP定制開發(fā)。本公眾號(hào)致力于向讀者傳遞關(guān)于程序設(shè)計(jì)和開發(fā)的相關(guān)知識(shí),并分享一些關(guān)于軟件開發(fā)的最佳實(shí)踐。如果您有什么問題或建議,請(qǐng)隨時(shí)聯(lián)系我們。我們將竭誠(chéng)為您服務(wù)