外观
十五、波形显示实验
波形显示基础知识
波形显示原理
波形是连续的,仔细观察波形发现,它也是一个个的点,假设手里此时有十个点,想要形成波形。就需要对相邻两点画直线,依次往后推,最后十个点会连接成线,这就是最简单的波形。
波形显示驱动
现在屏幕是128160的大小,也就是有128160=20480个像素点,如果我们希望以刷图片的方式,一帧一帧显示,就需要定义20480*2个字节,因为颜色显示是uint16_t;单片机仅有8KRAM,显然不现实。
这里提供两个思路:
第一个:以时间为X轴,电压为Y轴建立平面直角坐标系,将电压转换为平面直角坐标系上的点,画一个点,使其与前面的点连接成线,然后将时间轴往后推一格,清除后一列的屏幕,这样循环往复。
第二个:还是以刷图片的方式,不过对图片进行缩放,不占据整个屏幕,就像手机小窗显示一样,这样定义一个大数组,同样是平面直角坐标系,对电压数据进行转换,将对应的点填充成波形颜色,其余点填充为背景色,实现一帧一帧刷屏。
显示一个方波
项目介绍
通过本次实验,实现1.8寸TFT屏幕显示方波信号,这里采用第一个思路进行显示。
配置流程
上一节课已经将屏幕显示的相关驱动程序都移植好了,但其中并没有绘制波形的函数,这节课需要将绘制波形的函数实现即可。
波形图类似于曲线图,曲线图又可以由非常多个折线图形成。这里介绍一下实现绘制折线函数的思路:
详情请参考:csdn
采用横屏显示的方式,屏幕大小是128*160,有128个像素点可以用来表示输入的数值,这里为了提升速度,适当对其进行缩放,变成90个像素点(yoffset)可以用来表示输入的数值。
rawValue是对应转换的电压值,对电压值进行放大,放大越多,波形越高,但清除一列的数据量越大,这个需要依据实际情况调整。
x是时间轴,输入一个点,时间轴往后推,然后使其与前面一个点连接成线。随后清除后一点的列数据,确保数据的实时更新,这里是确保数据不会放大超过50,所以可以从40后开始刷新,提示速度。
C
static uint16_t lastX=0,lastY=0;
static uint8_t firstPoint = 1;
/*
* 函数内容:画折线
* 函数参数:short int rawValue--Y轴参数值
* 返回值: 无
*/
void drawCurve(uint8_t yOffset,short int rawValue)
{
uint16_t i=0,j=0;
uint16_t x=0,y=0;
y = yOffset - rawValue; //data processing code
if(firstPoint)//如果是第一次画点,则无需连线,直接描点即可
{
TFT_DrawPoint(0,y,GREEN);
lastX=0;
lastY=y;
firstPoint=0;
}
else
{
x=lastX+1;
if(x<160) //不超过屏幕宽度
{
TFT_DrawLine(lastX,lastY,x,y,GREEN);
for(i=40;i<90;i++)
{
TFT_DrawPoint(x+1,i,BLACK);//画点
}
lastX=x;
lastY=y;
}
else //超出屏幕宽度,清屏,从第一个点开始绘制,实现动态更新效果
{
TFT_DrawPoint(0,y,GREEN);
lastX=0;
lastY=y;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
自此,折线图函数编写完成
想要实现显示方波,除了折线图,还需要对应的电压数据,这里定义一个120个字节的数组,用于存放波形显示数据。随后依次输入折线函数中,让其根据前后两点绘制折线,逐渐形成波形。
注意输入参数的值需要在清除范围内(80-33=47,在范围内),否则波形清除不了导致显示有误。
C
#include "gd32e23x.h"
#include "systick.h"
#include <stdio.h>
#include "led.h"
#include "main.h"
#include "tft_init.h"
#include "tft.h"
int main(void)
{
uint8_t i=0;
uint8_t data[120]={0};
// 初始化滴答定时器
systick_config();
//初始化LED引脚
Init_LED_GPIO();
//初始化TFT屏幕引脚及默认配置
TFT_Init();
//TFT屏幕显示UI
TFT_ShowUI();
while(1)
{
//模拟ADC采集数据
for(i=0;i<30;i++)
{
data[i]=0;
}
for(i=30;i<60;i++)
{
data[i]=33;
}
for(i=60;i<90;i++)
{
data[i]=0;
}
for(i=90;i<120;i++)
{
data[i]=33;
}
//显示波形
for(i=0;i<120;i++)
{
drawCurve(80,data[i]);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
资料下载
工程代码可前往gitee下载资料包,简易数字示波器资料包