4.0寸ILI9488彩屏
模块来源
采购链接:
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.5b952e8de35PKf&id=562076871528&_u=72t4uge57303
资料下载链接:
https://pan.baidu.com/s/1DWdbVY9WcOLYKITB_zdjFg
资料提取码:8888
规格参数
工作电压:3.3V
工作电流:120MA
模块尺寸:62.0(H) x 106.57(V) MM
像素大小:320(H) x 480(V)RGB
驱动芯片:ST7789V
通信协议:16位并口
管脚数量:24 Pin(2.54mm间距排针)
移植过程
我们的目标是将例程移植至立创开发板GD32E230C8T6上。按照以下步骤,即可完成移植。
- 将源码导入工程;
- 根据编译报错处进行粗改;
- 修改引脚配置;
- 修改时序配置;
- 移植验证。
查看资料
打开厂家资料例程。具体路径见 图1.14.3.1 例程路径
在main.c文件发现对屏幕的初始化配置函数为 LCD_Init(); ,该函数里包含了对屏幕引脚的配置、对屏幕显示方式的配置。
我们主要修改的是引脚的初始化与时序的修改。
移植至工程
将厂家资料路径下的【LCD】文件夹和User文件夹下的GUI.c、GUI.h、test.c和test.h,复制到自己的工程中。自己的工程至少需要有毫秒级延时函数。(工程可以参考入门手册空白工程(工程模板)下载)
然后空白工程中的Hardware文件夹就是这样的:
我们打开工程,添加C文件到工程中。
- LCD文件夹
- gui和test文件
接下来添加h文件路径到工程中
我们不需要添加Hardware文件夹的路径,因为在空白文件中为大家已经添加过了,所以不用。
导入完成后,工程目录下会出现新导入的文件。
将各个文件中的包含头文件语句改为:
// main.c
#include "gd32e23x.h"
#include "systick.h"
#include <stdio.h>
#include "LCD.h"
#include "test.h"
2
3
4
5
6
// lcd.c
#include "lcd.h"
#include "stdlib.h"
#include "lcdfont.h"
#include "usart.h"
2
3
4
5
// gui.c
#include "lcd.h"
#include "string.h"
#include "gui.h"
2
3
4
// test.c
#include "lcd.h"
#include "gui.h"
#include "test.h"
#include "touch.h"
#include "pic.h"
2
3
4
5
6
// lcd.h
#include "gd32e23x.h"
#include "stdlib.h"
#include "systick.h"
2
3
4
// gui.h
#include "gd32e23x.h"
#include "systick.h"
2
3
// test.h
#include "gd32e23x.h"
#include "systick.h"
2
3
分别在 lcd.h、gui.h和lcd.h 文件中定义三个宏,u32、u16与u8。
#ifndef u8
#define u8 uint8_t
#endif
#ifndef u16
#define u16 uint16_t
#endif
#ifndef u32
#define u32 uint32_t
#endif
2
3
4
5
6
7
8
9
10
11
引脚选择
该屏幕需要设置24个接口,具体接口说明见 文件规格书。
文件下载
因为使用的是软件并行口,所以除了特殊引脚外,其他引脚都可以设置。时序部分厂家已经完成,我们只需要将引脚和延时配置好即可。所以对应接入的屏幕引脚请按照你的需要。这里选择的引脚见表1.14.3.2 16位并行接线。
选择好引脚后,进入工程开始编写屏幕引脚初始化代码。
为了方便后续移植,我在lcd.h处宏定义了每一个引脚,后续根据需要进行修改即可。
//-----------------LCD端口移植----------------
#define RCU_LCD_RD RCU_GPIOA//RD
#define PORT_LCD_RD GPIOA
#define GPIO_LCD_RD GPIO_PIN_0
#define RCU_LCD_WR RCU_GPIOB//WR
#define PORT_LCD_WR GPIOB
#define GPIO_LCD_WR GPIO_PIN_15
#define RCU_LCD_CS RCU_GPIOC//CS
#define PORT_LCD_CS GPIOC
#define GPIO_LCD_CS GPIO_PIN_13
#define RCU_LCD_DC RCU_GPIOB //DC/RS
#define PORT_LCD_DC GPIOB
#define GPIO_LCD_DC GPIO_PIN_14
#define RCU_LCD_RES RCU_GPIOA//RES
#define PORT_LCD_RES GPIOA
#define GPIO_LCD_RES GPIO_PIN_1
#define RCU_LCD_BLK RCU_GPIOB//BLK/BL
#define PORT_LCD_BLK GPIOB
#define GPIO_LCD_BLK GPIO_PIN_12
#define RCU_LCD_DB0 RCU_GPIOA//DB0
#define PORT_LCD_DB0 GPIOA
#define GPIO_LCD_DB0 GPIO_PIN_2
#define RCU_LCD_DB1 RCU_GPIOA//DB1
#define PORT_LCD_DB1 GPIOA
#define GPIO_LCD_DB1 GPIO_PIN_3
#define RCU_LCD_DB2 RCU_GPIOA//DB2
#define PORT_LCD_DB2 GPIOA
#define GPIO_LCD_DB2 GPIO_PIN_4
#define RCU_LCD_DB3 RCU_GPIOA//DB3
#define PORT_LCD_DB3 GPIOA
#define GPIO_LCD_DB3 GPIO_PIN_5
#define RCU_LCD_DB4 RCU_GPIOA//DB4
#define PORT_LCD_DB4 GPIOA
#define GPIO_LCD_DB4 GPIO_PIN_6
#define RCU_LCD_DB5 RCU_GPIOA//DB5
#define PORT_LCD_DB5 GPIOA
#define GPIO_LCD_DB5 GPIO_PIN_7
#define RCU_LCD_DB6 RCU_GPIOB//DB6
#define PORT_LCD_DB6 GPIOB
#define GPIO_LCD_DB6 GPIO_PIN_0
#define RCU_LCD_DB7 RCU_GPIOB//DB7
#define PORT_LCD_DB7 GPIOB
#define GPIO_LCD_DB7 GPIO_PIN_1
#define RCU_LCD_DB8 RCU_GPIOB//DB8
#define PORT_LCD_DB8 GPIOB
#define GPIO_LCD_DB8 GPIO_PIN_10
#define RCU_LCD_DB9 RCU_GPIOB//DB9
#define PORT_LCD_DB9 GPIOB
#define GPIO_LCD_DB9 GPIO_PIN_11
#define RCU_LCD_DB10 RCU_GPIOB//DB10
#define PORT_LCD_DB10 GPIOB
#define GPIO_LCD_DB10 GPIO_PIN_3
#define RCU_LCD_DB11 RCU_GPIOB//DB11
#define PORT_LCD_DB11 GPIOB
#define GPIO_LCD_DB11 GPIO_PIN_4
#define RCU_LCD_DB12 RCU_GPIOB//DB12
#define PORT_LCD_DB12 GPIOB
#define GPIO_LCD_DB12 GPIO_PIN_5
#define RCU_LCD_DB13 RCU_GPIOB//DB13
#define PORT_LCD_DB13 GPIOB
#define GPIO_LCD_DB13 GPIO_PIN_6
#define RCU_LCD_DB14 RCU_GPIOB//DB14
#define PORT_LCD_DB14 GPIOB
#define GPIO_LCD_DB14 GPIO_PIN_7
#define RCU_LCD_DB15 RCU_GPIOB//DB15
#define PORT_LCD_DB15 GPIOB
#define GPIO_LCD_DB15 GPIO_PIN_8
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
图1.14.3.20 软件SPI引脚宏
将 lcd.c 源代码中添加 void LCD_GPIO_Init(void) 这个函数,并且在h文件中声明一下这个函数。
void LCD_GPIO_Init(void)
{
/* 使能时钟 */
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_GPIOC);
/* 配置RD */
gpio_mode_set(PORT_LCD_RD,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_LCD_RD);
gpio_output_options_set(PORT_LCD_RD,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_LCD_RD);
gpio_bit_write(PORT_LCD_RD, GPIO_LCD_RD, SET);
/* 配置WR */
gpio_mode_set(PORT_LCD_WR,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_LCD_WR);
gpio_output_options_set(PORT_LCD_WR,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_LCD_WR);
gpio_bit_write(PORT_LCD_WR, GPIO_LCD_WR, SET);
/* 配置DC */
gpio_mode_set(PORT_LCD_DC,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_LCD_DC);
gpio_output_options_set(PORT_LCD_DC,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_LCD_DC);
gpio_bit_write(PORT_LCD_DC, GPIO_LCD_DC, SET);
/* 配置CS */
gpio_mode_set(PORT_LCD_CS,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_LCD_CS);
gpio_output_options_set(PORT_LCD_CS,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_LCD_CS);
gpio_bit_write(PORT_LCD_CS, GPIO_LCD_CS, SET);
/* 配置RES */
gpio_mode_set(PORT_LCD_RES,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_LCD_RES);
gpio_output_options_set(PORT_LCD_RES,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_LCD_RES);
gpio_bit_write(PORT_LCD_RES, GPIO_LCD_RES, SET);
/* 配置BLK */
gpio_mode_set(PORT_LCD_BLK, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_BLK);
gpio_output_options_set(PORT_LCD_BLK, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_BLK);
gpio_bit_write(PORT_LCD_BLK, GPIO_LCD_BLK, SET);
/* 配置DB0 */
gpio_mode_set(PORT_LCD_DB0, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB0);
gpio_output_options_set(PORT_LCD_DB0, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB0);
gpio_bit_write(PORT_LCD_DB0, GPIO_LCD_DB0, SET);
/* 配置DB1 */
gpio_mode_set(PORT_LCD_DB1, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB1);
gpio_output_options_set(PORT_LCD_DB1, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB1);
gpio_bit_write(PORT_LCD_DB1, GPIO_LCD_DB1, SET);
/* 配置DB2 */
gpio_mode_set(PORT_LCD_DB2, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB2);
gpio_output_options_set(PORT_LCD_DB2, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB2);
gpio_bit_write(PORT_LCD_DB2, GPIO_LCD_DB2, SET);
/* 配置DB3 */
gpio_mode_set(PORT_LCD_DB3, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB3);
gpio_output_options_set(PORT_LCD_DB3, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB3);
gpio_bit_write(PORT_LCD_DB3, GPIO_LCD_DB3, SET);
/* 配置DB4 */
gpio_mode_set(PORT_LCD_DB4, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB4);
gpio_output_options_set(PORT_LCD_DB4, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB4);
gpio_bit_write(PORT_LCD_DB4, GPIO_LCD_DB4, SET);
/* 配置DB5 */
gpio_mode_set(PORT_LCD_DB5, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB5);
gpio_output_options_set(PORT_LCD_DB5, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB5);
gpio_bit_write(PORT_LCD_DB5, GPIO_LCD_DB5, SET);
/* 配置DB6 */
gpio_mode_set(PORT_LCD_DB6, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB6);
gpio_output_options_set(PORT_LCD_DB6, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB6);
gpio_bit_write(PORT_LCD_DB6, GPIO_LCD_DB6, SET);
/* 配置DB7 */
gpio_mode_set(PORT_LCD_DB7, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB7);
gpio_output_options_set(PORT_LCD_DB7, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB7);
gpio_bit_write(PORT_LCD_DB7, GPIO_LCD_DB7, SET);
/* 配置DB8 */
gpio_mode_set(PORT_LCD_DB8, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB8);
gpio_output_options_set(PORT_LCD_DB8, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB8);
gpio_bit_write(PORT_LCD_DB8, GPIO_LCD_DB8, SET);
/* 配置DB9 */
gpio_mode_set(PORT_LCD_DB9, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB9);
gpio_output_options_set(PORT_LCD_DB9, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB9);
gpio_bit_write(PORT_LCD_DB9, GPIO_LCD_DB9, SET);
/* 配置DB10 */
gpio_mode_set(PORT_LCD_DB10, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB10);
gpio_output_options_set(PORT_LCD_DB10, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB10);
gpio_bit_write(PORT_LCD_DB10, GPIO_LCD_DB10, SET);
/* 配置DB11 */
gpio_mode_set(PORT_LCD_DB11, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB11);
gpio_output_options_set(PORT_LCD_DB11, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB11);
gpio_bit_write(PORT_LCD_DB11, GPIO_LCD_DB11, SET);
/* 配置DB12 */
gpio_mode_set(PORT_LCD_DB12, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB12);
gpio_output_options_set(PORT_LCD_DB12, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB12);
gpio_bit_write(PORT_LCD_DB12, GPIO_LCD_DB12, SET);
/* 配置DB13 */
gpio_mode_set(PORT_LCD_DB13, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB13);
gpio_output_options_set(PORT_LCD_DB13, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB13);
gpio_bit_write(PORT_LCD_DB13, GPIO_LCD_DB13, SET);
/* 配置DB14 */
gpio_mode_set(PORT_LCD_DB14, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB14);
gpio_output_options_set(PORT_LCD_DB14, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB14);
gpio_bit_write(PORT_LCD_DB14, GPIO_LCD_DB14, SET);
/* 配置DB15 */
gpio_mode_set(PORT_LCD_DB15, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_LCD_DB15);
gpio_output_options_set(PORT_LCD_DB15, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_LCD_DB15);
gpio_bit_write(PORT_LCD_DB15, GPIO_LCD_DB15, SET);
}
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
将 void LCD_Init(void) 函数修改为下方代码:
//初始化lcd
void LCD_Init(void)
{
//引脚初始化
LCD_GPIO_Init();
// GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
//
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOA, &GPIO_InitStructure); //GPIOA
// GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_SetBits(GPIOB,GPIO_Pin_All);
//
LCD_RST_CLR;
delay_ms(200); // delay 50 ms
LCD_RST_SET;
delay_ms(50); // delay 50 ms
Set_Dir(DFT_SCAN_DIR);
LCD_WR_REG(0xE0);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x07);
LCD_WR_DATA(0x0f);
LCD_WR_DATA(0x0D);
LCD_WR_DATA(0x1B);
LCD_WR_DATA(0x0A);
LCD_WR_DATA(0x3c);
LCD_WR_DATA(0x78);
LCD_WR_DATA(0x4A);
LCD_WR_DATA(0x07);
LCD_WR_DATA(0x0E);
LCD_WR_DATA(0x09);
LCD_WR_DATA(0x1B);
LCD_WR_DATA(0x1e);
LCD_WR_DATA(0x0f);
LCD_WR_REG(0xE1);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x22);
LCD_WR_DATA(0x24);
LCD_WR_DATA(0x06);
LCD_WR_DATA(0x12);
LCD_WR_DATA(0x07);
LCD_WR_DATA(0x36);
LCD_WR_DATA(0x47);
LCD_WR_DATA(0x47);
LCD_WR_DATA(0x06);
LCD_WR_DATA(0x0a);
LCD_WR_DATA(0x07);
LCD_WR_DATA(0x30);
LCD_WR_DATA(0x37);
LCD_WR_DATA(0x0f);
LCD_WR_REG(0xC0);
LCD_WR_DATA(0x10);
LCD_WR_DATA(0x10);
LCD_WR_REG(0xC1);
LCD_WR_DATA(0x41);
LCD_WR_REG(0xC5);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x22);
LCD_WR_DATA(0x80);
LCD_WR_REG(0x36); // Memory Access Control
if(DFT_SCAN_DIR==L2R_U2D)LCD_WR_DATA(0x48);
else if(DFT_SCAN_DIR==R2L_D2U)LCD_WR_DATA(0x88);
else if(DFT_SCAN_DIR==U2D_R2L)LCD_WR_DATA(0x28);
else LCD_WR_DATA(0xE8);
LCD_WR_REG(0x3A); //Interface Mode Control,
LCD_WR_DATA(0x55);
LCD_WR_REG(0XB0); //Interface Mode Control
LCD_WR_DATA(0x00);
LCD_WR_REG(0xB1); //Frame rate 70HZ
LCD_WR_DATA(0xB0);
LCD_WR_DATA(0x11);
LCD_WR_REG(0xB4);
LCD_WR_DATA(0x02);
LCD_WR_REG(0xB6); //RGB/MCU Interface Control
LCD_WR_DATA(0x02);
LCD_WR_DATA(0x02);
LCD_WR_REG(0xB7);
LCD_WR_DATA(0xC6);
LCD_WR_REG(0xE9);
LCD_WR_DATA(0x00);
LCD_WR_REG(0XF7);
LCD_WR_DATA(0xA9);
LCD_WR_DATA(0x51);
LCD_WR_DATA(0x2C);
LCD_WR_DATA(0x82);
LCD_WR_REG(0x11);
// delay_ms(120);
LCD_WR_REG(0x29);
// LCD_LED=1;
//usart_send_string("run this 1");
gpio_bit_write(PORT_LCD_RES, GPIO_LCD_RES, SET);
// usart_send_string("run this 2");
}
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
将 lcd.h 中的 LCD端口定义 宏,修改为 图1.14.3.22 样式。
#define LCD_CS_SET gpio_bit_write(PORT_LCD_CS, GPIO_LCD_CS, SET)//CS// GPIOA->BSRR=1<<0 //片选端口 PA0
#define LCD_RS_SET gpio_bit_write(PORT_LCD_DC, GPIO_LCD_DC, SET)//DC //GPIOA->BSRR=1<<1 //数据/命令 PA1
#define LCD_WR_SET gpio_bit_write(PORT_LCD_WR, GPIO_LCD_WR, SET)//WR//GPIOA->BSRR=1<<2 //写数据 PA2
#define LCD_RD_SET gpio_bit_write(PORT_LCD_RD, GPIO_LCD_RD, SET)//RD//GPIOA->BSRR=1<<3 //读数据 PA3
#define LCD_RST_SET gpio_bit_write(PORT_LCD_RES, GPIO_LCD_RES, SET)//RES //GPIOA->BSRR=1<<4 //复位 PA4
#define LCD_CS_CLR gpio_bit_write(PORT_LCD_CS, GPIO_LCD_CS, RESET)//CSGPIOA->BRR=1<<0 //片选端口 PA0
#define LCD_RS_CLR gpio_bit_write(PORT_LCD_DC, GPIO_LCD_DC, RESET)//DCGPIOA->BRR=1<<1 //数据/命令 PA1
#define LCD_WR_CLR gpio_bit_write(PORT_LCD_WR, GPIO_LCD_WR, RESET)//WRGPIOA->BRR=1<<2 //写数据 PA2
#define LCD_RD_CLR gpio_bit_write(PORT_LCD_RD, GPIO_LCD_RD, RESET)//RDGPIOA->BRR=1<<3 //读数据 PA3
#define LCD_RST_CLR gpio_bit_write(PORT_LCD_RES, GPIO_LCD_RES, RESET)//RES GPIOA->BRR=1<<4 //复位 PA4
//-----------------LCD端口定义----------------
#define LCD_LED(x) gpio_bit_write(PORT_LCD_BLK, GPIO_LCD_BLK, x?1:0) //LCD背光 PA5
#define LCD_CS_SET gpio_bit_write(PORT_LCD_CS, GPIO_LCD_CS, SET)//CS// GPIOA->BSRR=1<<0 //片选端口 PA0
#define LCD_RS_SET gpio_bit_write(PORT_LCD_DC, GPIO_LCD_DC, SET)//DC //GPIOA->BSRR=1<<1 //数据/命令 PA1
#define LCD_WR_SET gpio_bit_write(PORT_LCD_WR, GPIO_LCD_WR, SET)//WR//GPIOA->BSRR=1<<2 //写数据 PA2
#define LCD_RD_SET gpio_bit_write(PORT_LCD_RD, GPIO_LCD_RD, SET)//RD//GPIOA->BSRR=1<<3 //读数据 PA3
#define LCD_RST_SET gpio_bit_write(PORT_LCD_RES, GPIO_LCD_RES, SET)//RES //GPIOA->BSRR=1<<4 //复位 PA4
#define LCD_CS_CLR gpio_bit_write(PORT_LCD_CS, GPIO_LCD_CS, RESET)//CSGPIOA->BRR=1<<0 //片选端口 PA0
#define LCD_RS_CLR gpio_bit_write(PORT_LCD_DC, GPIO_LCD_DC, RESET)//DCGPIOA->BRR=1<<1 //数据/命令 PA1
#define LCD_WR_CLR gpio_bit_write(PORT_LCD_WR, GPIO_LCD_WR, RESET)//WRGPIOA->BRR=1<<2 //写数据 PA2
#define LCD_RD_CLR gpio_bit_write(PORT_LCD_RD, GPIO_LCD_RD, RESET)//RDGPIOA->BRR=1<<3 //读数据 PA3
#define LCD_RST_CLR gpio_bit_write(PORT_LCD_RES, GPIO_LCD_RES, RESET)//RES GPIOA->BRR=1<<4 //复位 PA4
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
因为是并口屏,传输8位的数据,是一根线一个位,8个位数据就是8根线。所以我们需要将一个8位的数据,装载到8根数据线上。在 lcd.h 中添加以下代码,方便后续的数据传输和端口修改。
// x ? 置1 : 置0
#define PIN_HIGH_OR_LOW(port,gpio,x) {((x) ? (GPIO_OCTL(port)|=(uint32_t)(gpio)) : (GPIO_OCTL(port)&=~(uint32_t)(gpio)));}
// 先清除该位,空出位置 根据x判断是设置位还是清除位
#define BIT_DB15(x) { GPIO_OCTL(PORT_LCD_DB15) &= ((uint32_t)~(GPIO_LCD_DB15)); PIN_HIGH_OR_LOW( PORT_LCD_DB15, GPIO_LCD_DB15, x) }
#define BIT_DB14(x) { GPIO_OCTL(PORT_LCD_DB14) &= ((uint32_t)~(GPIO_LCD_DB14)); PIN_HIGH_OR_LOW( PORT_LCD_DB14, GPIO_LCD_DB14, x) }
#define BIT_DB13(x) { GPIO_OCTL(PORT_LCD_DB13) &= ((uint32_t)~(GPIO_LCD_DB13)); PIN_HIGH_OR_LOW( PORT_LCD_DB13, GPIO_LCD_DB13, x) }
#define BIT_DB12(x) { GPIO_OCTL(PORT_LCD_DB12) &= ((uint32_t)~(GPIO_LCD_DB12)); PIN_HIGH_OR_LOW( PORT_LCD_DB12, GPIO_LCD_DB12, x) }
#define BIT_DB11(x) { GPIO_OCTL(PORT_LCD_DB11) &= ((uint32_t)~(GPIO_LCD_DB11)); PIN_HIGH_OR_LOW( PORT_LCD_DB11, GPIO_LCD_DB11, x) }
#define BIT_DB10(x) { GPIO_OCTL(PORT_LCD_DB10) &= ((uint32_t)~(GPIO_LCD_DB10)); PIN_HIGH_OR_LOW( PORT_LCD_DB10, GPIO_LCD_DB10, x) }
#define BIT_DB9(x) { GPIO_OCTL(PORT_LCD_DB9) &= ((uint32_t)~(GPIO_LCD_DB9)); PIN_HIGH_OR_LOW( PORT_LCD_DB9, GPIO_LCD_DB9, x) }
#define BIT_DB8(x) { GPIO_OCTL(PORT_LCD_DB8) &= ((uint32_t)~(GPIO_LCD_DB8)); PIN_HIGH_OR_LOW( PORT_LCD_DB8, GPIO_LCD_DB8, x) }
#define BIT_DB7(x) { GPIO_OCTL(PORT_LCD_DB7) &= ((uint32_t)~(GPIO_LCD_DB7)); PIN_HIGH_OR_LOW( PORT_LCD_DB7, GPIO_LCD_DB7, x) }
#define BIT_DB6(x) { GPIO_OCTL(PORT_LCD_DB6) &= ((uint32_t)~(GPIO_LCD_DB6)); PIN_HIGH_OR_LOW( PORT_LCD_DB6, GPIO_LCD_DB6, x) }
#define BIT_DB5(x) { GPIO_OCTL(PORT_LCD_DB5) &= ((uint32_t)~(GPIO_LCD_DB5)); PIN_HIGH_OR_LOW( PORT_LCD_DB5, GPIO_LCD_DB5, x) }
#define BIT_DB4(x) { GPIO_OCTL(PORT_LCD_DB4) &= ((uint32_t)~(GPIO_LCD_DB4)); PIN_HIGH_OR_LOW( PORT_LCD_DB4, GPIO_LCD_DB4, x) }
#define BIT_DB3(x) { GPIO_OCTL(PORT_LCD_DB3) &= ((uint32_t)~(GPIO_LCD_DB3)); PIN_HIGH_OR_LOW( PORT_LCD_DB3, GPIO_LCD_DB3, x) }
#define BIT_DB2(x) { GPIO_OCTL(PORT_LCD_DB2) &= ((uint32_t)~(GPIO_LCD_DB2)); PIN_HIGH_OR_LOW( PORT_LCD_DB2, GPIO_LCD_DB2, x) }
#define BIT_DB1(x) { GPIO_OCTL(PORT_LCD_DB1) &= ((uint32_t)~(GPIO_LCD_DB1)); PIN_HIGH_OR_LOW( PORT_LCD_DB1, GPIO_LCD_DB1, x) }
#define BIT_DB0(x) { GPIO_OCTL(PORT_LCD_DB0) &= ((uint32_t)~(GPIO_LCD_DB0)); PIN_HIGH_OR_LOW( PORT_LCD_DB0, GPIO_LCD_DB0, x) }
#define DATAOUT(dat){\
BIT_DB15( (dat>>15)&0x01 );\
BIT_DB14( (dat>>14)&0x01 ); \
BIT_DB13( (dat>>13)&0x01 );\
BIT_DB12( (dat>>12)&0x01 );\
BIT_DB11( (dat>>11)&0x01 );\
BIT_DB10( (dat>>10)&0x01 );\
BIT_DB9( (dat>>9)&0x01 ); \
BIT_DB8( (dat>>8)&0x01 ); \
BIT_DB7( (dat>>7)&0x01 );\
BIT_DB6( (dat>>6)&0x01 );\
BIT_DB5( (dat>>5)&0x01 );\
BIT_DB4( (dat>>4)&0x01 );\
BIT_DB3( (dat>>3)&0x01 );\
BIT_DB2( (dat>>2)&0x01 );\
BIT_DB1( (dat>>1)&0x01 ); \
BIT_DB0( (dat>>0)&0x01 ); \
}
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
将读取颜色的函数注释。
将lcd.h文件中函数u16 LCD_RD_DATA(void)注释掉
打开test.c文件,将里面的void Touch_Test(void)函数注释掉
到这里就移植完成了,请移步到1.14.4节进行移植验证。
移植验证
在main.c中输入代码如下
#include "gd32f4xx.h"
#include "systick.h"
#include "LCD.h"
#include "test.h"
int main(void)
{
float t = 0;
systick_config();//滴答定时器初始化 1ms
LCD_Init();
LCD_Fill(0,0,320,480,YELLOW);
while(1)
{
main_test();
Test_Color();
Test_FillRec();
Test_Circle();
English_Font_test();
Chinese_Font_test();
Pic_test();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
上电效果