一 背景说明

拿到一款由ST7567驱动的128×64点阵液晶屏,准备连接STM32主控连接它并点亮屏幕。

二 驱动原理

​ 我用的这款LCD屏幕,驱动IC是ST7567。其原理是通过驱动芯片与128×64的液晶模组进行交互,结合背光板,就能指定哪些点阵被点亮,从而得到想要的图形。驱动芯片与屏幕、背光的原理图如下:

img

【1】驱动IC——ST7567

​ (i)驱动引脚:

​ 驱动引脚如下,其中主要用到了SDA/SCL/RS/RES/CS这5个引脚进行屏幕配置和数据交互:

img

​ (ii)驱动时序:

​ 驱动时序如下,其中:

​ CSB即引脚CS,片选引脚,为低电平的时候,才能写入数据或命令;
​ A0即引脚RS,数据或命令选择引脚;
​ SCL时钟引脚,为低电平期间,写入数据,
​ SDA数据引脚,数据低位在前,高位在后;

img

​ 复位时序如下,其中:

RSTB也就是RES,复位引脚,拉低即可复位,但是要注意拉低再拉高后要延时一段时间才能操作LCD。

img

​ (iii)驱动命令:

​ 驱动命令如下,通过RS脚来实现数据与命令的切换:

img

【2】128×64液晶模组

​ 一共128列,64行(其中每8行作为一页,共8页):

img

【3】BL背光模块

​ 由背光正极性端LED+(LEDA)和背光负极性端LED-(LEDK)控制背光亮灭。

三 LCD接线

​ 驱动芯片的引脚加上背光的引脚则形成了用户需要外接的所有引脚,其中主要关注CS0/RST/A0/SCK/SDA几个引脚,另外V0和XV0之间接1uf电容 VG和VSS之间接1uF电容:

img

四 屏幕初始化

【1】IO口初始化:

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
//12864点阵屏引脚定义



#define LDZ_CS_PORT (GPIOC)



#define LDZ_CS_PIN (GPIO_Pin_5)



#define LDZ_RE_PORT (GPIOB)



#define LDZ_RE_PIN (GPIO_Pin_0)



#define LDZ_DC_PORT (GPIOB)



#define LDZ_DC_PIN (GPIO_Pin_1)



#define LDZ_SCK_PORT (GPIOB)



#define LDZ_SCK_PIN (GPIO_Pin_2)



#define LDZ_SDA_PORT (GPIOC)



#define LDZ_SDA_PIN (GPIO_Pin_7)







#define LDZ_CS_L() GPIO_ResetBits(LDZ_CS_PORT, LDZ_CS_PIN)



#define LDZ_CS_H() GPIO_SetBits(LDZ_CS_PORT, LDZ_CS_PIN)



#define LDZ_RE_L() GPIO_ResetBits(LDZ_RE_PORT, LDZ_RE_PIN)



#define LDZ_RE_H() GPIO_SetBits(LDZ_RE_PORT, LDZ_RE_PIN)



#define LDZ_DC_L() GPIO_ResetBits(LDZ_DC_PORT, LDZ_DC_PIN)



#define LDZ_DC_H() GPIO_SetBits(LDZ_DC_PORT, LDZ_DC_PIN)



#define LDZ_SCK_L() GPIO_ResetBits(LDZ_SCK_PORT, LDZ_SCK_PIN)



#define LDZ_SCK_H() GPIO_SetBits(LDZ_SCK_PORT, LDZ_SCK_PIN)



#define LDZ_SDA_L() GPIO_ResetBits(LDZ_SDA_PORT, LDZ_SDA_PIN)



#define LDZ_SDA_H() GPIO_SetBits(LDZ_SDA_PORT, LDZ_SDA_PIN)











/**************************************************************************



* 函数名称: LDZ_Init



* 功能描述: LDZ初始化



**************************************************************************/



void LDZ_Init(void)



{



GPIO_InitTypeDef GPIO_InitStructure;







RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC, ENABLE);







GPIO_InitStructure.GPIO_Pin = LDZ_CS_PIN;



GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;



GPIO_Init(LDZ_CS_PORT, &GPIO_InitStructure);







GPIO_InitStructure.GPIO_Pin = LDZ_RE_PIN;



GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;



GPIO_Init(LDZ_RE_PORT, &GPIO_InitStructure);







GPIO_InitStructure.GPIO_Pin = LDZ_DC_PIN;



GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;



GPIO_Init(LDZ_DC_PORT, &GPIO_InitStructure);







GPIO_InitStructure.GPIO_Pin = LDZ_SCK_PIN;



GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;



GPIO_Init(LDZ_SCK_PORT, &GPIO_InitStructure);







GPIO_InitStructure.GPIO_Pin = LDZ_SDA_PIN;



GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;



GPIO_Init(LDZ_SDA_PORT, &GPIO_InitStructure);







LDZ_CS_H();



LDZ_SCK_H();



LDZ_SDA_H();







LDZ_RE_H(); Ddl_Delay1ms(10);



LDZ_RE_L(); Ddl_Delay1ms(10);



LDZ_RE_H(); Ddl_Delay1ms(50);



}

【2】写命令/写数据(通过DC口即上面的A0引脚来控制,其中高电平为写数据,低电平为写命令):

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
void LDZ_SendBit(u8 bit)



{



u8 i;



for(i = 0;i < 8;i ++)



{



LDZ_SCK_L();



if(bit & 0x80)



LDZ_SDA_H();



else



LDZ_SDA_L();



LDZ_SCK_H();



bit <<= 1;



}



}







/**************************************************************************



* 函数名称: LDZ_WriteCMD/LDZ_WriteDAT



* 功能描述: 写命令/写数据



**************************************************************************/



void LDZ_WriteCMD(u8 cmd)



{



LDZ_CS_L();



LDZ_DC_L();



LDZ_SendBit(cmd);



LDZ_CS_H();



}







void LDZ_WriteDAT(u8 dat)



{



LDZ_CS_L();



LDZ_DC_H();



LDZ_SendBit(dat);



LDZ_CS_H();



}

【3】配置屏幕

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
/**************************************************************************



* 函数名称: LDZ_Cfg



* 功能描述: 配置屏幕



**************************************************************************/



void LDZ_Cfg(void)



{



LDZ_WriteCMD(0xE2); //reset



Ddl_Delay1ms(10);



LDZ_WriteCMD(0xA2); //设置偏压比为1/9



LDZ_WriteCMD(0xA0); //设置seg扫描正向seg0~seg131



LDZ_WriteCMD(0xC8); //设置com扫描反向com63~com0



LDZ_WriteCMD(0x24); //对比度粗调



LDZ_WriteCMD(0x81); //对比度双指令



LDZ_WriteCMD(0x2B); //对比度微调



LDZ_WriteCMD(0x2F); //电源控制



LDZ_WriteCMD(0xB0); //设置页地址



LDZ_WriteCMD(0xAF); //显示打开



LDZ_WriteCMD(0xA6); //正常显示不反转



}

【4】几个功能接口,包括设置地址/清整屏/清整页:

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
/**************************************************************************



* 函数名称: LDZ_SetAddr/LDZ_ClearPage/LDZ_Clear



* 功能描述: 设置地址/清整页/清全屏



**************************************************************************/



void LDZ_SetAddr(u8 page, u8 col)



{



LDZ_WriteCMD(0xB0|page);



LDZ_WriteCMD((col >> 4)| 0x10);



LDZ_WriteCMD(col & 0x0F);



}







void LDZ_ClearPage(u8 page)



{



u8 i;



LDZ_SetAddr(page, 0);



for(i = 0;i < 128;i ++)



LDZ_WriteDAT(0x00);



}







void LDZ_Clear(void)



{



u8 i;



for(i = 0;i < 8;i ++)



LDZ_ClearPage(i);



}

​ 至此,屏幕初始化便完成了,下面准备显示内容。

五 显示字符/汉字

​ 需要用到16和32两种大小的字体,根据ASC字符与汉字的差异可以分别放在如下的数组中:

​ (i)小字符(8×16)放到数组ASC16[ ];

​ (ii)小汉字(16×16)放到数组CHN16[ ];

​ (iii)大字符(16×32)放到数组ASC32[ ];

​ (iv)大汉字(32×32)放到数组CHN32[ ];

【1】字体取模:

​ 要想显示字符/汉字,需要预先进行字体取模。我这边用到了 PCtoLCD2002 这款软件。软件的具体使用不再赘述,我这边设置是这样的:

img

​ 生成的字库如下:

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
const unsigned char ASC16[]={



0x00,0xE0,0x18,0x08,0x08,0x08,0x18,0xE0,0x00,0x07,0x18,0x10,0x10,0x10,0x18,0x07,/*"0",0*/



0x00,0x00,0x20,0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,/*"1",1*/



0x00,0x10,0x08,0x08,0x08,0x08,0x98,0x70,0x00,0x10,0x18,0x18,0x14,0x12,0x11,0x10,/*"2",2*/



0x00,0x10,0x08,0x88,0x88,0x88,0x70,0x00,0x00,0x08,0x10,0x10,0x10,0x10,0x09,0x07,/*"3",3*/



0x00,0x00,0x80,0x40,0x20,0x10,0xF8,0x00,0x06,0x05,0x04,0x04,0x04,0x04,0x1F,0x04,/*"4",4*/



0x00,0xC0,0xB8,0x88,0x88,0x88,0x88,0x08,0x00,0x09,0x10,0x10,0x10,0x10,0x10,0x0F,/*"5",5*/



0x00,0xE0,0x10,0x88,0x88,0x88,0x88,0x10,0x00,0x07,0x09,0x10,0x10,0x10,0x10,0x0F,/*"6",6*/



0x00,0x08,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x1C,0x03,0x00,0x00,0x00,/*"7",7*/



0x00,0x70,0x90,0x88,0x88,0x88,0x98,0x60,0x00,0x0F,0x11,0x10,0x10,0x10,0x19,0x0F,/*"8",8*/



0x00,0xF0,0x98,0x08,0x08,0x08,0x90,0xE0,0x00,0x08,0x11,0x11,0x11,0x11,0x08,0x07,/*"9",9*/







};







const unsigned char CHN16[]={



0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00,



0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00,/*"设",0*/



0x00,0x17,0x15,0xD5,0x55,0x57,0x55,0x7D,0x55,0x57,0x55,0xD5,0x15,0x17,0x00,0x00,



0x40,0x40,0x40,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x40,0x40,0x40,0x00,/*"置",1*/







};







const unsigned char ASC32[]={



0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x00,



0x00,0xF0,0xFE,0xFF,0x07,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0xFF,



0x00,0x0F,0x7F,0xFF,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xE0,0xFF,



0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,/*"0",0*/



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x00,0x00,0x00,0x00,



0x00,0x00,0x00,0x18,0x1C,0x0C,0x0E,0x06,0x07,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x00,0x00,0x00,0x00,/*"1",1*/



0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,



0x00,0x06,0x07,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xE3,0xFF,



0x00,0x00,0x80,0xC0,0xE0,0x60,0x70,0x38,0x18,0x1C,0x0E,0x07,0x07,0x03,0x01,0x00,



0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,/*"2",2*/



0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x00,



0x00,0x04,0x07,0x07,0x03,0x01,0x00,0x80,0xC0,0xC0,0xC0,0xC0,0xE1,0xF3,0xBF,0xBF,



0x00,0x60,0xE0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x81,0xC3,0xFF,



0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,/*"3",3*/



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x00,



0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0xFF,0xFF,0xFF,0x00,



0x00,0x1C,0x1E,0x1F,0x1F,0x1B,0x19,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF,0xFF,0x18,



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x00,/*"4",4*/



0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,



0x00,0xE0,0xFF,0xFF,0x6F,0x61,0x30,0x30,0x30,0x30,0x30,0x30,0x70,0x60,0xE0,0xC0,



0x00,0x60,0xE0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xE0,0xFF,



0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,/*"5",5*/



0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,



0x00,0xF0,0xFC,0xFE,0x8F,0xC3,0xC1,0x60,0x60,0x60,0x60,0x60,0x60,0xC1,0xC3,0x87,



0x00,0x0F,0x7F,0xFF,0xE1,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC1,0xFF,



0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,/*"6",6*/



0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF8,0x3C,0x0E,0x07,0x03,



0x00,0x00,0x00,0x00,0x00,0x80,0xF0,0xFE,0x7F,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,



0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"7",7*/



0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x00,



0x00,0x00,0x1E,0x3F,0xFF,0xE1,0xE1,0xC0,0xC0,0xC0,0xC0,0xC0,0xE1,0xE1,0xFF,0x3F,



0x00,0x3C,0xFF,0xFF,0xC3,0x81,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xC3,0xFF,



0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,/*"8",8*/



0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x00,



0x00,0x7C,0xFE,0xFF,0x87,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x83,0xFF,



0x00,0x60,0xE1,0xE1,0xC3,0x83,0x06,0x06,0x06,0x06,0x06,0x06,0x83,0xC3,0xF1,0x7F,



0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,0x00,/*"9",9*/



};







const unsigned char CHN32[]={



0x00,0x00,0x00,0x00,0x00,0x04,0x18,0xF8,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,



0xF8,0x08,0x08,0x08,0x08,0x08,0xF8,0xFC,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,



0x00,0x00,0x10,0x10,0x10,0x10,0x10,0xF8,0xF0,0x10,0x40,0x40,0x20,0x58,0x4E,0xC7,



0x40,0x40,0x40,0x40,0x40,0x40,0x47,0x4F,0xEC,0xCC,0x4C,0x0C,0x0C,0x0C,0x00,0x00,



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x80,0x40,0x20,0x10,0x00,0x00,



0x07,0x18,0x60,0xC0,0xC0,0xE0,0x78,0x1F,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x47,0x43,0x41,0x20,0x20,0x30,0x10,0x18,



0x08,0x0C,0x06,0x03,0x03,0x06,0x0E,0x0C,0x1C,0x18,0x38,0x30,0x10,0x10,0x00,0x00,/*"设",0*/



0x00,0x00,0x00,0x00,0x00,0xFC,0xF8,0x08,0x08,0x08,0x08,0x08,0xF8,0xF8,0x08,0x08,



0x08,0x08,0xF8,0xF8,0x08,0x08,0x08,0x08,0x08,0xFC,0xFC,0x08,0x00,0x00,0x00,0x00,



0x00,0x00,0x00,0x00,0x10,0x13,0x13,0x51,0x91,0x91,0x91,0x91,0x91,0x91,0xF3,0xFD,



0x95,0x95,0x91,0x91,0x91,0x91,0xD1,0xD1,0x91,0x1B,0x1B,0x10,0x00,0x00,0x00,0x00,



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,



0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,



0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x3F,0x22,0x22,0x22,0x22,0x22,0x22,



0x22,0x22,0x22,0x22,0x22,0x22,0x3F,0x3F,0x20,0x20,0x20,0x30,0x30,0x20,0x00,0x00,/*"置",1*/



};

【2】显示字符/汉字接口:

​ 用四个定制化的接口,来显示上面不同字体的字库内容:

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
/**************************************************************************



* 函数名称: LDZ_ShowASC16/LDZ_ShowASC32/LDZ_ShowCHN16/LDZ_ShowCHN32



* 功能描述: 显示字符



* 参数说明: [1]页地址 / [2]列地址 / [3]字符位于对应数组中的序号



**************************************************************************/



void LDZ_ShowASC16(u8 page, u8 col, u8 id)



{



u8 i,j;



for(i = 0;i < 2;i ++)//一共2行



{



LDZ_SetAddr(page++, col);



for(j = 0;j < 8;j ++) //一行8字节



LDZ_WriteDAT(ASC16[j + i*8 + id*16]);



}



}







void LDZ_ShowCHN16(u8 page, u8 col, u8 id)



{



u8 i,j;



for(i = 0;i < 2;i ++) //一共2行



{



LDZ_SetAddr(page++, col);



for(j = 0;j < 16;j ++) //一行16字节



LDZ_WriteDAT(CHN16[j + i*16 + id*32]);



}



}







void LDZ_ShowASC32(u8 page, u8 col, u8 id)



{



u8 i,j;



for(i = 0;i < 4;i ++) //一共4行



{



LDZ_SetAddr(page++, col);



for(j = 0;j < 16;j ++) //一行16字节



LDZ_WriteDAT(ASC32[j+ i*16 + id*64]);



}



}







void LDZ_ShowCHN32(u8 page, u8 col, u8 id)



{



u8 i,j;



for(i = 0;i < 4;i ++) //一共4行



{



LDZ_SetAddr(page++, col);



for(j = 0;j < 32;j ++) //一行32字节



LDZ_WriteDAT(CHN32[j + i*32 + id*128]);



}



}

​ 至此,定制化的字符/汉字显示接口已经完成,接下来就是在主函数中使用。

六 实际效果

​ 在主函数中调用初始化以及字符显示接口:

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
int main(void)



{



//LCD初始化/配置命令/清屏



LDZ_Init();



LDZ_Cfg();



LDZ_Clear();











while(1)



{



LDZ_ShowASC16(0, 0, 0); //显示0



LDZ_ShowASC16(0, 8, 1); //显示1



LDZ_ShowASC16(0, 16, 2); //显示2



LDZ_ShowASC16(0, 24, 3); //显示3







LDZ_ShowCHN16(2, 0, 0); //显示“设”



LDZ_ShowCHN16(2, 16, 1); //显示“置”







LDZ_ShowASC32(4, 0, 4); //显示4



LDZ_ShowASC32(4, 16, 5); //显示5







LDZ_ShowCHN32(4, 32, 0); //显示“设”



LDZ_ShowCHN32(4, 64, 1); //显示“置”



}



}

​ 实际运行屏幕效果如下:

img

七 附录

【1】【嵌入式】MCU(HC32F460)+SPI接口LCD液晶屏ILI9341 移植emWin记录1—-点亮LCD屏_ili9341是spi 还是i2c-CSDN博客

【2】【开源】使用HK32F030驱动ST7567 LCD-CSDN博客

【3】LX12864P1屏幕使用介绍(ST7567驱动),显示横线、字符、图形-CSDN博客

【4】[STM32F1]使用STM32F103驱动ST7567液晶屏_st7567单片机驱动程序-CSDN博客


相关链接(侵删)

  1. (stm32f103学习总结)—RTC独立定时器—实时时钟实验
  2. STM32F103的RTC实时时钟配置

=================我是分割线=================

欢迎到公众号来唠嗑: