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间距排针)
移植过程
我们的目标是将例程移植至天空星GD32F407上。按照以下步骤,即可完成移植。
- 将源码导入工程;
- 根据编译报错处进行粗改;
- 修改引脚配置;
- 修改时序配置;
- 移植验证。
查看资料
打开厂家资料例程(例程下载见模块来源)。具体路径见 图1.14.3.1 例程路径
在main.c文件发现对屏幕的初始化配置函数为 LCD_Init(); ,该函数里包含了对屏幕引脚的配置、对屏幕显示方式的配置。
我们主要修改的是引脚的初始化与时序的修改。
移植至工程
将厂家资料路径下的【LCD】文件夹和User文件夹下的GUI.c、GUI.h、test.c和test.h,复制到自己的工程中。自己的工程至少需要有毫秒级延时函数。(工程可以参考入门手册空白工程下载)
打开自己的工程,将我们刚刚复制过来的文件导入.c和.h文件。
将gui.h文件下的 sys.h 改为 gd32f4xx.h,还要将lcd.h文件下的 sys.h 改为 gd32f4xx.h ,最后在test.h文件中添加 gd32f4xx.h 。
(在左边将lcd.c、GUI.c和test.c的工程目录展开,就发现有相关的头文件)
将lcd.c、gui.c 和 test.c 文件下的 delay.h 改为 board.h。
分别在 lcd.h、gui.h 和 test.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
再编译发现只剩下LCD引脚初始化的内容报错,接下来我们要进行引脚选择。
引脚选择
该屏幕需要设置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_3
#define RCU_LCD_WR RCU_GPIOA//WR
#define PORT_LCD_WR GPIOA
#define GPIO_LCD_WR GPIO_PIN_2
#define RCU_LCD_CS RCU_GPIOA//CS
#define PORT_LCD_CS GPIOA
#define GPIO_LCD_CS GPIO_PIN_0
#define RCU_LCD_DC RCU_GPIOA //DC/RS
#define PORT_LCD_DC GPIOA
#define GPIO_LCD_DC GPIO_PIN_1
#define RCU_LCD_RES RCU_GPIOA//RES
#define PORT_LCD_RES GPIOA
#define GPIO_LCD_RES GPIO_PIN_4
#define RCU_LCD_BLK RCU_GPIOD//BLK/BL
#define PORT_LCD_BLK GPIOD
#define GPIO_LCD_BLK GPIO_PIN_14
#define RCU_LCD_DB0 RCU_GPIOA//DB0
#define PORT_LCD_DB0 GPIOA
#define GPIO_LCD_DB0 GPIO_PIN_5
#define RCU_LCD_DB1 RCU_GPIOA//DB1
#define PORT_LCD_DB1 GPIOA
#define GPIO_LCD_DB1 GPIO_PIN_6
#define RCU_LCD_DB2 RCU_GPIOA//DB2
#define PORT_LCD_DB2 GPIOA
#define GPIO_LCD_DB2 GPIO_PIN_7
#define RCU_LCD_DB3 RCU_GPIOE//DB3
#define PORT_LCD_DB3 GPIOE
#define GPIO_LCD_DB3 GPIO_PIN_7
#define RCU_LCD_DB4 RCU_GPIOE//DB4
#define PORT_LCD_DB4 GPIOE
#define GPIO_LCD_DB4 GPIO_PIN_8
#define RCU_LCD_DB5 RCU_GPIOE//DB5
#define PORT_LCD_DB5 GPIOE
#define GPIO_LCD_DB5 GPIO_PIN_9
#define RCU_LCD_DB6 RCU_GPIOE//DB6
#define PORT_LCD_DB6 GPIOE
#define GPIO_LCD_DB6 GPIO_PIN_10
#define RCU_LCD_DB7 RCU_GPIOE//DB7
#define PORT_LCD_DB7 GPIOE
#define GPIO_LCD_DB7 GPIO_PIN_11
#define RCU_LCD_DB8 RCU_GPIOE//DB8
#define PORT_LCD_DB8 GPIOE
#define GPIO_LCD_DB8 GPIO_PIN_12
#define RCU_LCD_DB9 RCU_GPIOE//DB9
#define PORT_LCD_DB9 GPIOE
#define GPIO_LCD_DB9 GPIO_PIN_13
#define RCU_LCD_DB10 RCU_GPIOE//DB10
#define PORT_LCD_DB10 GPIOE
#define GPIO_LCD_DB10 GPIO_PIN_14
#define RCU_LCD_DB11 RCU_GPIOE//DB11
#define PORT_LCD_DB11 GPIOE
#define GPIO_LCD_DB11 GPIO_PIN_15
#define RCU_LCD_DB12 RCU_GPIOB//DB12
#define PORT_LCD_DB12 GPIOB
#define GPIO_LCD_DB12 GPIO_PIN_10
#define RCU_LCD_DB13 RCU_GPIOB//DB13
#define PORT_LCD_DB13 GPIOB
#define GPIO_LCD_DB13 GPIO_PIN_11
#define RCU_LCD_DB14 RCU_GPIOB//DB14
#define PORT_LCD_DB14 GPIOB
#define GPIO_LCD_DB14 GPIO_PIN_12
#define RCU_LCD_DB15 RCU_GPIOB//DB15
#define PORT_LCD_DB15 GPIOB
#define GPIO_LCD_DB15 GPIO_PIN_13
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
图1.14.3.20 软件SPI引脚宏
将lcd.c源代码中新添加一个函数 void LCD_GPIO_Init(void) 为如下代码。
void LCD_GPIO_Init(void)
{
/* 使能时钟 */
rcu_periph_clock_enable(RCU_LCD_RD);
rcu_periph_clock_enable(RCU_LCD_WR);
rcu_periph_clock_enable(RCU_LCD_CS);
rcu_periph_clock_enable(RCU_LCD_DC);
rcu_periph_clock_enable(RCU_LCD_RES);
rcu_periph_clock_enable(RCU_LCD_BLK);
rcu_periph_clock_enable(RCU_LCD_DB0);
rcu_periph_clock_enable(RCU_LCD_DB1);
rcu_periph_clock_enable(RCU_LCD_DB2);
rcu_periph_clock_enable(RCU_LCD_DB3);
rcu_periph_clock_enable(RCU_LCD_DB4);
rcu_periph_clock_enable(RCU_LCD_DB5);
rcu_periph_clock_enable(RCU_LCD_DB6);
rcu_periph_clock_enable(RCU_LCD_DB7);
rcu_periph_clock_enable(RCU_LCD_DB8);
rcu_periph_clock_enable(RCU_LCD_DB9);
rcu_periph_clock_enable(RCU_LCD_DB10);
rcu_periph_clock_enable(RCU_LCD_DB11);
rcu_periph_clock_enable(RCU_LCD_DB12);
rcu_periph_clock_enable(RCU_LCD_DB13);
rcu_periph_clock_enable(RCU_LCD_DB14);
rcu_periph_clock_enable(RCU_LCD_DB15);
/* 配置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_DB11, 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
然后修改 lcd.c 文件中的 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;
LCD_LED(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
将lcd_init.h中的 LCD端口定义 宏,修改为图1.14.3.22样式。
#define LCD_LED(x) gpio_bit_write(PORT_LCD_BLK,GPIO_LCD_BLK, x?1:0)
#define LCD_CS_SET gpio_bit_write(PORT_LCD_CS, GPIO_LCD_CS, SET)//CS
#define LCD_RS_SET gpio_bit_write(PORT_LCD_DC, GPIO_LCD_DC, SET)//DC
#define LCD_WR_SET gpio_bit_write(PORT_LCD_WR, GPIO_LCD_WR, SET)//WR
#define LCD_RD_SET gpio_bit_write(PORT_LCD_RD, GPIO_LCD_RD, SET)//RD
#define LCD_RST_SET gpio_bit_write(PORT_LCD_RES, GPIO_LCD_RES, SET)//RES
#define LCD_CS_CLR gpio_bit_write(PORT_LCD_CS, GPIO_LCD_CS, RESET)//CS
#define LCD_RS_CLR gpio_bit_write(PORT_LCD_DC, GPIO_LCD_DC, RESET)//DC
#define LCD_WR_CLR gpio_bit_write(PORT_LCD_WR, GPIO_LCD_WR, RESET)//WR
#define LCD_RD_CLR gpio_bit_write(PORT_LCD_RD, GPIO_LCD_RD, RESET)//RD
#define LCD_RST_CLR gpio_bit_write(PORT_LCD_RES, GPIO_LCD_RES, RESET)//RES
2
3
4
5
6
7
8
9
10
11
12
13
因为是并口屏,传输8位的数据,是一根线一个位,8个位数据就是8根线。所以我们需要将一个8位的数据,装载到8根数据线上。在 lcd_init.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
将读取颜色的函数注释。
打开test.c文件将 void Touch_Test(void) 函数注释掉
到这里就移植完成了,请移步到移植验证。
移植验证
在main.c中输入代码如下
#include "gd32f4xx.h"
#include "board.h"
#include "LCD.h"
#include "test.h"
int main(void)
{
float t = 0;
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 优先级分组
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
上电效果:
移植成功案例:
代码下载
链接在开发板介绍
章节的资料下载!!