迪文串口屏T5L STM32 51驱动程序分享

迪文串口屏T5L STM32 51驱动程序分享

最近在研究迪文的串口屏,网络上好像没有找到迪文的串口驱动程序。虽然这个东西不难,就是发送几个命令的事,但是仍然踩了不少坑。我用的型号是DMG48270C043_03WTC,不过应该和型号没关系。使用前需要用DGUS工具做好界面并设置好变量地址和描述地址,具体可以看迪文官方在bilibili发布的教程迪文智能屏T5L_DGUSII教程1_开发步骤_哔哩哔哩_bilibili和 原子哥上的教程T5L迪文屏C51开发教程 - 原子哥,专注电子技术教学 (yuanzige.com)

这个驱动只实现了极少一部分功能,可供快速调试时使用。移植时只需要实现DWin_SendDat函数即可。

1
2
3
4
5
void DWin_SendDat(unsigned char* dat, unsigned int length)
{
USART2_SendData(dat, length);
HAL_Delay(20);
}

DWIN.c:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
/******************************************
*******************************************
文件:DWIN.c
功能:DWIN串口屏驱动
适用型号:DMG48270C043
创建时间:2021-07-15 宋宏昊
最后修改:2021-07-26 宋宏昊
参考:1、T5L DGUSII 应用开发指南20210607.pdf
*******************************************
******************************************/
#include "DWIN.h"
/******************************************
名称:DWin_SendDat
功能:向串口屏发送数据
参数:数据指针,长度
返回值:无
说明:移植需要实现此函数
******************************************/
void DWin_SendDat(uint8_t* dat, uint16_t length)
{
USART3_SendData(dat, length);
HAL_Delay(20);
}

/******************************************
名称:DWin_RecieveStatus
功能:串口屏响应Ack
参数:串口缓冲区指针
返回值:有效返回1,无效返回0
说明:无
******************************************/
uint8_t DWin_RecieveAck(uint8_t* DatBuf)
{
return (DatBuf[3] == 0x82 && DatBuf[4] == 0x4f && DatBuf[5] == 0x4b);
}


/******************************************
名称:DWin_RecieveStatus
功能:判断帧头是否有效
参数:串口缓冲区指针
返回值:有效返回1,无效返回0
说明:无
******************************************/
uint8_t DWin_RecieveStatus(uint8_t* DatBuf)
{
return (DatBuf[0] == 0x5a && DatBuf[1] == 0xa5);
}
/******************************************
名称:DWin_RecieveAddr
功能:提取变量地址
参数:串口缓冲区指针
返回值:变量地址
返回值:无
说明:无
******************************************/
uint16_t DWin_RecieveAddr(uint8_t* DatBuf)
{
uint16_t addr;
addr = (DatBuf[4] << 8) | DatBuf[5];
return addr;
}
/******************************************
名称:DWin_RecieveLength
功能:提取数据包长度
参数:串口缓冲区指针
返回值:数据包字节数
说明:无
******************************************/
uint16_t DWin_RecieveLength(uint8_t* DatBuf)
{
uint16_t length;
length = DatBuf[6] * 2;
return length;
}
/******************************************
名称:DWin_Recieve2ByteNum
功能:接收串口屏发送来的2字节整数
参数:串口缓冲区指针
返回值:2字节整数
说明:无
******************************************/
int DWin_Recieve2ByteNum(uint8_t* DatBuf)
{
uint8_t tmp[2];
memcpy(&tmp, DatBuf + 7, 2);
return (tmp[0] << 8) | tmp[1];
}
/******************************************
名称:DWin_Recieve2UByteNum
功能:接收串口屏发送来的2字节无符号整数
参数:串口缓冲区指针
返回值:2字节无符号整数
说明:无
******************************************/
uint16_t DWin_Recieve2UByteNum(uint8_t* DatBuf)
{
uint8_t tmp[2];
memcpy(&tmp, DatBuf + 7, 2);
return (tmp[0] << 8) | tmp[1];
}
/******************************************
名称:DWin_Recieve4ByteNum
功能:接收串口屏发送来的4字节整数
参数:串口缓冲区指针
返回值:4字节整数
说明:无
******************************************/
long DWin_Recieve4ByteNum(uint8_t* DatBuf)
{
uint8_t tmp[4];
memcpy(&tmp, DatBuf + 7, 4);
return (tmp[0] << 24) | (tmp[1] << 16) | (tmp[2] << 8) |tmp[3] ;
}
/******************************************
名称:DWin_Recieve4UByteNum
功能:接收串口屏发送来的4字节无符号整数
参数:串口缓冲区指针
返回值:4字节无符号整数
说明:无
******************************************/
uint32_t DWin_Recieve4UByteNum(uint8_t* DatBuf)
{
uint8_t tmp[4];
memcpy(&tmp, DatBuf + 7, 4);
return (tmp[0] << 24) | (tmp[1] << 16) | (tmp[2] << 8) |tmp[3] ;
}
/******************************************
名称:DWin_RecieveAscii
功能:接收串口屏发送来Ascii字符串
参数:串口缓冲区指针,字符串指针(输出)
返回值:无
说明:无
******************************************/
void DWin_RecieveAscii(uint8_t* DatBuf, char* pData)
{
uint16_t i;
memcpy(pData, DatBuf + 7, DatBuf[6]*2);
i = DatBuf[6]*2;
while(*(pData + i - 2) == 0xff)
{
*(pData + i - 2) = 0x00;
i--;
}
}
/******************************************
名称:DWin_UpdateFloatNumDisplay
功能:更新串口屏float变量的值
参数:变量地址,数值
返回值:无
说明:无
******************************************/
void DWin_UpdateFloatNumDisplay(uint16_t addr, float num)
{
uint8_t buf[BUF_SIZE];

memset(buf, 0, sizeof(buf));
buf[0] = 0x5a;
buf[1] = 0xa5;

buf[3] = 0x82;

buf[4] = addr >> 8;
buf[5] = addr & 0xff;

memcpy(buf + 6, &num, sizeof(num));

buf[2] = 7;
DWin_SendDat(buf, buf[2] + 3);
}
/******************************************
名称:DWin_UpdateIntNumDisplay
功能:更新串口屏2字节整数变量的值
参数:变量地址,数值
返回值:无
说明:无
******************************************/
void DWin_UpdateIntNumDisplay(uint16_t addr, int num)
{
uint8_t buf[BUF_SIZE];

memset(buf, 0, sizeof(buf));
buf[0] = 0x5a;
buf[1] = 0xa5;

buf[3] = 0x82;

buf[4] = addr >> 8;
buf[5] = addr & 0xff;

buf[6] = num >> 8;
buf[7] = num & 0xff;

buf[2] = 5;
DWin_SendDat(buf, buf[2] + 3);
}
/******************************************
名称:DWin_UpdateLongNumDisplay
功能:更新串口屏4字节整数变量的值
参数:变量地址,数值
返回值:无
说明:无
******************************************/
void DWin_UpdateLongNumDisplay(uint16_t addr, long num)
{
uint8_t buf[BUF_SIZE];

memset(buf, 0, sizeof(buf));
buf[0] = 0x5a;
buf[1] = 0xa5;

buf[3] = 0x82;

buf[4] = addr >> 8;
buf[5] = addr & 0xff;

buf[6] = (num >> 24) & 0xff;
buf[7] = (num >> 16) & 0xff;
buf[8] = (num >> 8) & 0xff;
buf[9] = num & 0xff;

buf[2] = 7;
DWin_SendDat(buf, buf[2] + 3);
}
/******************************************
名称:DWin_ChangeTextColor
功能:改变文本颜色
参数:变量描述地址,颜色值
返回值:无
说明:无
******************************************/
void DWin_ChangeTextColor(uint16_t spaddr, uint16_t color)
{
DWin_UpdateIntNumDisplay(spaddr + 0x03, color);
}

/******************************************
名称:DWin_ChangeTextPosition
功能:改变文本位置
参数:变量描述地址,X坐标,Y坐标
返回值:无
说明:无
******************************************/
void DWin_ChangeTextPosition(uint16_t spaddr, uint16_t x, uint16_t y)
{
uint8_t buf[BUF_SIZE];

memset(buf, 0, sizeof(buf));
buf[0] = 0x5a;
buf[1] = 0xa5;

buf[3] = 0x82;

spaddr += 0x01; //描述指针偏移量
buf[4] = spaddr >> 8;
buf[5] = spaddr & 0xff;

buf[6] = (x >> 8) & 0xff;
buf[7] = x & 0xff;
buf[8] = (y >> 8) & 0xff;
buf[9] = y & 0xff;

buf[2] = 7;
DWin_SendDat(buf, buf[2] + 3);
}
/******************************************
名称:DWin_UpdateCurvePoint
功能:新增一个曲线数据点
参数:通道号,值
返回值:无
说明:无
******************************************/
void DWin_DrawCurvePoint(uint8_t channel, unsigned short y)
{
uint8_t buf[BUF_SIZE] = {0x5a, 0xa5, 0x0b, 0x82, 0x03, 0x10, 0x5a, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
buf[10] = channel; //通道号
buf[11] = 1; //曲线点数
buf[12] = y >> 8;
buf[13] = y & 0xff;
DWin_SendDat(buf, buf[2] + 3);
}
/******************************************
名称:DWin_UpdateMultiCurvePoint
功能:新增多个曲线数据点
参数:通道号,值数组地址,点数(注意!!!)
返回值:无
说明:无
******************************************/
void DWin_DrawMultiCurvePoint(uint8_t channel, unsigned short* pData, uint16_t length)
{
uint8_t buf[BUF_SIZE] = {0x5a, 0xa5, 0x0b, 0x82, 0x03, 0x10, 0x5a, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
buf[10] = channel; //通道号
buf[11] = length & 0xff; //曲线点数
uint16_t j = 12;
for(uint16_t i = 0; i < length; i++)
{
buf[j++] = pData[i] >> 8;
buf[j++] = pData[i] & 0xff;
}
buf[2] = length * 2 + 9;
DWin_SendDat(buf, buf[2] + 3);
}
/******************************************
名称:DWin_ClearCurvePoint
功能:清除曲线
参数:通道号
返回值:无
说明:无
******************************************/
void DWin_ClearCurvePoint(uint8_t channel)
{
uint8_t buf[BUF_SIZE] = {0x5A, 0xA5, 0x05, 0x82, 0x03, 0x01, 0x00, 0x00};
switch(channel)
{
case 0: buf[5] = 0x01; break;
case 1: buf[5] = 0x03; break;
case 2: buf[5] = 0x05; break;
case 3: buf[5] = 0x07; break;
case 4: buf[5] = 0x09; break;
case 5: buf[5] = 0x0b; break;
case 6: buf[5] = 0x0d; break;
case 7: buf[5] = 0x0f; break;
default: break;
}
DWin_SendDat(buf, buf[2] + 3);
}
/******************************************
名称:DWin_ChangeCurveColor
功能:改变曲线颜色
参数:曲线描述地址,颜色值
返回值:无
说明:无
******************************************/
void DWin_ChangeCurveColor(uint16_t spaddr, uint16_t color)
{
DWin_UpdateIntNumDisplay(spaddr + 7, color);
}
/********************************废弃代码***********************************/

//void DWin_RecieveNumKey(uint8_t* DatBuf, uint16_t* length, uint16_t* addr, uint8_t* pData)
//{
// if(DatBuf[3] == 0x83)
// {
// *length = DatBuf[6] * 2;
// *addr = (DatBuf[4] << 8) | DatBuf[5];
// memcpy(pData, DatBuf + 7, *length);
// }
//}

DWIN.h:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/******************************************
*******************************************
文件:DWIN.h
功能:DWIN串口屏驱动
适用型号:DMG48270C043
创建时间:2021-07-15 宋宏昊
最后修改:2021-07-20 宋宏昊
*******************************************
******************************************/


#ifndef __DWIN_H
#define __DWIN_H

#include "main.h"
#include "MY_USART.h"
#include "string.h"

#ifdef __cplusplus //C++检查
extern "C" {
#endif

#define BUF_SIZE 255 //DWIN串口发送缓冲区大小

#define BLACK 0x0000 //黑色
#define NAVY 0x000F //深蓝色
#define DGREEN 0x03E0 //深绿色
#define DCYAN 0x03EF //深青色
#define MAROON 0x7800 //深红色
#define PURPLE 0x780F //紫色
#define OLIVE 0x7BE0 //橄榄绿
#define LGRAY 0xC618 //灰白色
#define DGRAY 0x7BEF //深灰色
#define BLUE 0x001F //蓝色
#define GREEN 0x07E0 //绿色
#define CYAN 0x07FF //青色
#define RED 0xF800 //红色
#define MAGENTA 0xF81F //品红
#define YELLOW 0xFFE0 //黄色
#define WHITE 0xFFFF //白色

uint8_t DWin_RecieveStatus(uint8_t* DatBuf);
uint8_t DWin_RecieveAck(uint8_t* DatBuf);
uint16_t DWin_RecieveAddr(uint8_t* DatBuf);
uint16_t DWin_RecieveLength(uint8_t* DatBuf);
int DWin_Recieve2ByteNum(uint8_t* DatBuf);
uint16_t DWin_Recieve2UByteNum(uint8_t* DatBuf);
long DWin_Recieve4ByteNum(uint8_t* DatBuf);
uint32_t DWin_Recieve4UByteNum(uint8_t* DatBuf);
void DWin_RecieveAscii(uint8_t* DatBuf, char* pData);

void DWin_UpdateFloatNumDisplay(uint16_t addr, float num);
void DWin_UpdateIntNumDisplay(uint16_t addr, int num);
void DWin_UpdateLongNumDisplay(uint16_t addr, long num);
void DWin_ChangeTextColor(uint16_t spaddr, uint16_t color);
void DWin_ChangeTextPosition(uint16_t spaddr, uint16_t x, uint16_t y);
void DWin_DrawCurvePoint(uint8_t channel, unsigned short y);
void DWin_DrawMultiCurvePoint(uint8_t channel, unsigned short* pData, uint16_t length);
void DWin_ClearCurvePoint(uint8_t channel);
void DWin_ChangeCurveColor(uint16_t spaddr, uint16_t color);

#ifdef __cplusplus //C++检查
}
#endif

#endif

测试demo.c:

1
2
3
4
DWin_UpdateIntNumDisplay(0x1000, -15);
DWin_UpdateLongNumDisplay(0x2000, -26);
DWin_ChangeTextColor(0x5000,0xf800);
DWin_ChangeTextPosition(0x5000,20,100);

坚持原创技术分享,您的支持是我前进的动力!