-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdgus.c
333 lines (306 loc) · 9.62 KB
/
dgus.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
/**
******************************************************************************
* @file dgus.c
* @author liang
* @version V1.0
* @date 2023.12.01
* @brief DWIN串口屏驱动代码
* @license Copyright (c) 2020-2032
******************************************************************************
* @attention
* DGUS屏采用异步、全双工串口(UART),串口模式为8n1,
* 即每个数据传送采用十个位,包括1个起始位,8个数据位,1个停止位。
* 串口的所有指令或数据都是16进制(HEX)格式。
* 对于字型(2字节)数据,总是采用高字节先传送(MSB)方式,如0x1234先传送0x12。
* 数据帧中最大包含249字节数据。
*
* 修改说明
* V1.0 2023.12.01
* 第一次发布
* V1.1 2024.03.25
* 重构
*
******************************************************************************
*/
#include "dgus.h"
/*********************************用户接口*************************************/
#include "main.h"
extern UART_HandleTypeDef huart2;
void DGUS_SerialSend(uint8_t *pdata, size_t Size)
{
if (HAL_UART_Transmit(&huart2, pdata, Size, HAL_MAX_DELAY) != HAL_OK) {
/* 发送失败 */
}
}
void DGUS_SerialReceive(uint8_t *pdata, size_t Size)
{
}
DGUS_Display_t default_dgus = {
.picid = 0,
.DGUS_SerialSend = DGUS_SerialSend,
.DGUS_SerialReceive = DGUS_SerialReceive,
.DGUS_DelyMs = HAL_Delay
};
/*****************************END 用户接口 END*********************************/
/******************************** 基础功能 ************************************/
/**
* @brief 拼接数据帧
* @note 根据数据长度的大小按照右对齐放置
* @param int16_t addr:数据地址
* @param uint64_t data:数据
* @param uint8_t size:数据帧大小
* @param uint8_t* tx_data:发送的数据帧
* @retval void
*/
static inline void _JoinDataFrames(uint8_t *tx_data, uint16_t addr, void *data, uint8_t size)
{
tx_data[0] = 0x5A; /* 帧头 */
tx_data[1] = 0xA5;
tx_data[2] = size - 3; /* 数据长度 */
tx_data[3] = 0x82; /* 写指令 */
tx_data[4] = (addr >> 8) & 0xFF; /* 变量地址 */
tx_data[5] = addr & 0xFF;
for (int i = 0; i < size - 6; i++) {
tx_data[i + 6] = *((uint8_t *)data + ((size - 7) - i)); /* 小端 MSB*/
/* tx_data[i + 6] = *((uint8_t *)data + i)); 大端 LSB */
}
}
/**
* @brief 发送二个字节数据
* @note
* @param
* @retval void
*/
static inline void _Send2Bytes(DGUS_Display_t *dgus, uint16_t addr, uint16_t data)
{
uint8_t tx_data[8];
_JoinDataFrames(tx_data, addr, &data, sizeof(tx_data));
dgus->DGUS_SerialSend(tx_data, sizeof(tx_data));
}
/**
* @brief 发送四个字节数据
* @note
* @param
* @retval void
*/
static inline void _Send4Bytes(DGUS_Display_t *dgus, uint16_t addr, uint32_t data)
{
uint8_t tx_data[10];
_JoinDataFrames(tx_data, addr, &data, sizeof(tx_data));
dgus->DGUS_SerialSend(tx_data, sizeof(tx_data));
}
/**
* @brief 发送八个字节数据
* @note
* @param
* @retval void
*/
static inline void _Send8Bytes(DGUS_Display_t *dgus, uint16_t addr, uint64_t data)
{
uint8_t tx_data[14];
_JoinDataFrames(tx_data, addr, &data, sizeof(tx_data));
dgus->DGUS_SerialSend(tx_data, sizeof(tx_data));
}
/**
* @brief 发送单精度浮点数(4字节,float)
* @note
* @param
* @retval void
*/
static inline void _SendFloat(DGUS_Display_t *dgus, uint16_t addr, float data)
{
uint8_t tx_data[10];
_JoinDataFrames(tx_data, addr, &data, sizeof(tx_data));
dgus->DGUS_SerialSend(tx_data, sizeof(tx_data));
}
/**
* @brief 发送双精度浮点数(8字节,double)
* @note
* @param
* @retval void
*/
static inline void _SendDouble(DGUS_Display_t *dgus, uint16_t addr, double data)
{
uint8_t tx_data[14];
_JoinDataFrames(tx_data, addr, &data, sizeof(tx_data));
dgus->DGUS_SerialSend(tx_data, sizeof(tx_data));
}
/*****************************END 基础功能 END*********************************/
/******************************* 系统变量接口 *********************************/
/**
* @brief 系统复位 System_Reset 0x04
* @note 重置T5芯片,数据清0,相当于掉电重启
* @param void
* @retval void
*/
void DGUS_Reset(DGUS_Display_t *dgus)
{
/* 定义复位数据帧 */
uint8_t Reset[] = {0x5A, 0xA5, 0x07, 0x82, 0x00, 0x04, 0x55, 0xAA, 0x5A, 0xA5};
dgus->DGUS_SerialSend(Reset, 10);
dgus->DGUS_DelyMs(3000);
}
/**
* @brief 切换页面 0x84
* @note D3:0x5A 表示启动一次页面处理,CPU 处理完清零。
D2:处理模式。0x01=页面切换(把图片存储区指定的图片显示到当前背景页面)。
D1:D0:图片 ID。
* @param void
* @retval void
*/
void DGUS_PicSet(DGUS_Display_t *dgus, uint16_t picid)
{
/* 定义数据帧 */
uint8_t tx_data[] = {0x5A, 0xA5, 0x07, 0x82, 0x00, 0x84, 0x5A, 0x01, ((picid >> 8) & 0xFF), (picid & 0xFF)};
dgus->picid = picid;
dgus->DGUS_SerialSend(tx_data, 10);
}
/****************************END 系统变量接口 END******************************/
/*************************变量图标显示 VAR Icon(0x00)************************/
/**
* @brief 变量图标修改图片
* @note
* @param
* @retval void
*/
void VarIconSetID(DGUS_Display_t *dgus, uint16_t vp_addr, uint16_t id)
{
_Send2Bytes(dgus, vp_addr, id);
}
/*********************END 变量图标显示 VAR Icon(0x00)END*********************/
/*******************艺术字变量显示 Artistic variable(0x03)*******************/
/**
* @brief 艺术字变量修改整数数值
* @note 2字节
* @param
* @retval void
*/
void ArtVarSetInt16(DGUS_Display_t *dgus, uint16_t vp_addr, int16_t data)
{
_Send2Bytes(dgus, vp_addr, data);
}
/**
* @brief 艺术字变量修改字库ICON0
* @note 通过描述指针修改艺术字变量0对应的ICON_ID
* @param uint16_t addr : 描述指针地址
* @param uint16_t icon_id : 0对应的ICON_ID
* @retval void
*/
void ArtVarSetICON0(DGUS_Display_t *dgus, uint16_t sp_addr, uint16_t icon_id)
{
/* SP描述指针偏移量 0x03 */
_Send2Bytes(dgus, sp_addr + 0x03, icon_id);
}
/***************END 艺术字变量显示 Artistic variable(0x03)END****************/
/*********************图标旋转指示显示 Icon Rotation(0x05)*******************/
/**
* @brief 旋转图标修改角度
* @note
* @param
* @retval void
*/
void RatIconSetAngle(DGUS_Display_t *dgus, uint16_t vp_addr, uint16_t angle)
{
_Send2Bytes(dgus, vp_addr, angle);
}
/*****************END 图标旋转指示显示 Icon Rotation(0x05)END****************/
/******************** 数据变量显示 data variables(0x10)**********************/
/**
* @brief 显示整数数据(2字节)
* @note
* @param
* @retval void
*/
void DataVarSetInt16(DGUS_Display_t *dgus, uint16_t vp_addr, int16_t data)
{
_Send2Bytes(dgus, vp_addr, data);
}
/**
* @brief 显示整数数据(4字节)
* @note
* @param
* @retval void
*/
void DataVarSetInt32(DGUS_Display_t *dgus, uint16_t vp_addr, int32_t data)
{
_Send4Bytes(dgus, vp_addr, data);
}
/**
* @brief 显示整数数据(8字节)
* @note
* @param
* @retval void
*/
void DataVarSetInt64(DGUS_Display_t *dgus, uint16_t vp_addr, int64_t data)
{
_Send8Bytes(dgus, vp_addr, data);
}
/**
* @brief 显示单精度浮点数(4字节)
* @note
* @param
* @retval void
*/
void DataVarSetFloat(DGUS_Display_t *dgus, uint16_t vp_addr, float data)
{
_SendFloat(dgus, vp_addr, data);
}
/**
* @brief 显示双精度浮点数(8字节)
* @note
* @param
* @retval void
*/
void DataVarSetDouble(DGUS_Display_t *dgus, uint16_t vp_addr, double data)
{
_SendDouble(dgus, vp_addr, data);
}
/********************END 数据变量显示 data variables(0x10)END****************/
/************************ 文本显示 Text Display(0x11)***********************/
/**
* @brief GB2312文本显示
* @note 最大显示512字节长度
* @param
* @retval void
*/
void TextDisplaySetGB2312(DGUS_Display_t *dgus, uint16_t vp_addr, char *textcode, uint16_t len)
{
uint8_t tx_data[6] = {0x5A, 0xA5, len + 3, 0x82,
(uint8_t)((vp_addr >> 8) & 0xFF), (uint8_t)(vp_addr & 0xFF)
};
dgus->DGUS_SerialSend(tx_data, sizeof(tx_data));
dgus->DGUS_SerialSend((uint8_t *)textcode, len);
}
/**
* @brief 文本显示颜色修改
* @note
* @param
* @retval void
*/
void TextDisplaySetColor(DGUS_Display_t *dgus, uint16_t sp_addr, uint16_t color)
{
_Send2Bytes(dgus, sp_addr + 0x03, color);
}
/**
* @brief 文本显示字体大小修改
* @note
* @param
* @retval void
*/
void TextDisplaySetFontDots(DGUS_Display_t *dgus, uint16_t sp_addr, uint16_t FontDots)
{
_Send2Bytes(dgus, sp_addr + 0x0A, FontDots);
}
/*************************END 文本显示 Text Display(0x11)END******************/
/***************************** 蜂鸣器 Buzzer **********************************/
/**
* @brief 蜂鸣器鸣叫
* @note 一个单位8ms
* @param uint16_t mstime : 鸣叫ms时间
* @retval void
*/
void BuzzerSet(DGUS_Display_t *dgus, uint16_t mstime)
{
_Send2Bytes(dgus, 0x00A0, mstime >> 3);
}
/**************************END 蜂鸣器 Buzzer END*******************************/