實(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