目录
基本准备
主要利用LCD驱动中的画点和画连线函数,驱动为正点原子的lcd.h
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color); //点的坐标x、y和点的颜色 void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2); //起始点x1、y1和终点x2、y2
更换画笔的颜色可以用更改全局变量的方式
POINT_COLOR=WHITE; //可设置颜色为WHITE、RED、BLACK、BLUE等等
刷屏时将屏幕刷为白色
LCD_Clear(WHITE);
画波形图(适合时域波形绘制)
参数说明:
Num为传入数据的点数; xis波形的中心轴(0轴); data传入的数据
以下参数在需要时可以作为函数参数传入:
pix波形x方向的拉伸,pix越大往外侧拉伸,但对于固定点数据而言会降低采样率
reduce,y方向拉伸,y方向不能大于屏幕的分辨率否则不能正常显示,以此处取纵向显示为例,以120为中心0轴,那y取值不超过±120,若对于±10V的信号采样,则可取单位为0.1V
blac_spacey,为了方便在波形区域显示一些信息,可以预留一部分屏幕不被刷新,减少显示的闪烁
绘制过程:
LCD_DrawWave_c(x,y);
该函数作用是绘制先后调用传入两个坐标轴之间画直线,例如第一次调用传入(1,5),第二次(3,8),就会在这两点之间画出连线,这个函数用起来比较方便,但开始和结束的时候需要特殊处理一下,我个人是画完一帧完整波形后将点固定在0轴尾端,下次开始调用在0轴开始位置,刚好顺带画出了0轴的位置
绘制过程大概是先将该列清屏,也就是在该列画一个跟底色相同的线即可,然后换回正常颜色,开始调用LCD_DrawWave_c函数画波形,依次循环。比起画完一帧完整图像后清屏再画下一帧的方式相比,这种方法不会闪屏,波形看起来比较流畅。
代码如下(说明:该lcd分辨率240x320)
void LCD_DrawWave_wave(uint16_t Num,uint16_t xis,float data[]){ uint16_t i; uint16_t pix=8; //波形拉伸(时间轴) uint16_t reduce=100; 波形拉伸(幅值轴) uint16_t blac_spacey=16; //y(竖直方向)的预留空白区域 //LCD_Clear(WHITE); POINT_COLOR=WHITE; //设置字体为WHITE LCD_DrawWave_c(xis,blac_spacey); POINT_COLOR=BLUE; //设置字体为蓝色 for (i=blac_spacey;i*pix<Num;i++){ POINT_COLOR=WHITE; //设置字体为WHITE LCD_DrawLine(0,i,240,i); POINT_COLOR=BLUE; //设置字体为蓝色 LCD_DrawWave_c(xis-(int)(data[i*pix]/reduce),i); }//将x、y的位置全部分别交换可以更改竖屏or横屏显示 POINT_COLOR=WHITE; //设置字体为RED LCD_DrawWave_c(xis,320); POINT_COLOR=BLUE; //设置字体为蓝色 }
画柱状图(画频谱图)
参数说明:
Num传入数据的点数; show_line需要参考展示的频率,在对应频率(HZ)处标记一根红色线; data传入的数据
以下参数在需要时可以作为函数参数传入:
pix 这里柱状图主要是改变柱的密度,值越大越稀疏
xis 是其底轴的位置,默认设置为0;
reduce,y方向拉伸,y方向不能大于屏幕的分辨率否则不能正常显示,以此处取横向显示为例,从底处0开始,有320个像素点,所以y应该取值0到320,否则不能正常显示,根据实际测量波形的特点,对拉伸参数调整即可,或者利用按键人机交互调参
绘制过程:
这里仅用画直线即可,先画与底色相同的一条线清空一下,再画需要的幅值线段,x轴一致,从底轴向幅值画
代码如下(说明:该lcd分辨率240x320)
void LCD_DrawWave_bar(uint16_t Num,uint16_t show_line,float data[]){ uint16_t i; uint16_t pix=2; //柱的密度 uint16_t xis=0; //底轴的位置 uint16_t reduce=5000; 波形拉伸(幅值轴) show_line = show_line*pix/2; //LCD_Clear(WHITE); POINT_COLOR=RED; //设置字体为RED LCD_DrawWave_c(show_line,0); LCD_DrawWave_c(show_line,320); POINT_COLOR=BLUE; //设置字体为蓝色 for (i=0;i<Num;i+=pix){ POINT_COLOR=WHITE; //设置字体为蓝色 LCD_DrawLine(i,0,i,320); POINT_COLOR=BLUE; //设置字体为蓝色 LCD_DrawLine(i,xis+320,i,xis+320-(int)(data[i*pix]/reduce)); } }
效果展示
波形图
频谱图(红线处为23HZ)