1.19 12864 点阵液晶屏带字库(来自 Deep Dark Fantasies 的贡献)
1.19.1 模块来源
采购链接: 可带中文字库 12864 点阵液晶屏 LCD 显示屏液晶模块 JLX12864G-086
资料下载链接: https://pan.baidu.com/s/191VkgC1moLDU-L-GgKSgYQ 提取码:abr1
1.19.2 规格参数
工作电压:3.3v/5v
工作电流:20mA
通信方式:串行
引脚数量:12pin(2.54mm 间距排针)
1.19.3 移植过程
我们的目标是将例程移植至梁山派 GD32F470 上。按照以下步骤,即可完成移植。
- 将源码导入工程;
- 根据编译报错处进行粗改;
- 修改引脚配置;
- 修改时序配置;
- 移植验证。
1.19.3.1 查看资料
12864 是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及 128*64 全点阵液晶显示点组成,每个显示点都对应着有一位二进制数,0 表示灭,1 表示亮,可完成图形显示,也可以显示 8*4 个(16*16 点阵)汉字。
1.19.3.2 移植至工程
将官方代码移植到梁山派的过程中,需要将官方的 .c 和 .h 文件加入工程,这三个文件在 “jxl12864_PCB 显示适配程序.zip” 中的 “Hardware” 文件夹里。
我移植好的的工程文件放在文末,.c 和.h 文件压缩包里的 “Hardware” 文件夹里。
先打开梁山派工程模板(下文有)的文件夹,再按照以下步骤进行移植:
复制完之后,在 Project 文件夹中,用 KEIL 打开工程文件 “GD32F450.uvprojx”,将刚才复制好的文件加入工程
按照下面的顺序,将 .c 文件加入工程
按照下面的顺序,将** .h **文件加入工程,
1.19.3.3 引脚选择
表 1.19.3.2 1602 接线
选择好引脚后,进入工程开始编写屏幕引脚初始化代码。
为了方便后续移植,我在 1602.h 处宏定义了每一个引脚,后续根据需要进行修改即可。
/*
RIN-----PD5
ROUT-----PD1
RSCK-----PC6
RCS-----PD4
SCK-----PC0
SDA-----PC7
RS-----PC8
RSET-----PC9
CS-----PC10
*/
// 定义 LCD 和 字库 引脚时钟
#define ROM_RCU RCU_GPIOD
#define LCD_RCU RCU_GPIOC
// 定义 LCD 和 字库 引脚端口
#define ROM_IN_PORT GPIOD
#define ROM_OUT_PORT GPIOD
#define ROM_CS_PORT GPIOD
#define LCD_SCLK_PORT GPIOD
#define ROM_SCK_PORT GPIOC
#define LCD_SID_PORT GPIOC
#define LCD_RS_PORT GPIOC
#define LCD_RESET_PORT GPIOC
#define LCD_CS1_PORT GPIOC
// 定义 LCD 和 字库 引脚号
#define ROM_IN_PIN GPIO_PIN_5
#define ROM_OUT_PIN GPIO_PIN_1
#define ROM_SCK_PIN GPIO_PIN_6
#define ROM_CS_PIN GPIO_PIN_4
#define LCD_SCLK_PIN GPIO_PIN_0
#define LCD_SID_PIN GPIO_PIN_7
#define LCD_RS_PIN GPIO_PIN_8
#define LCD_RESET_PIN GPIO_PIN_9
#define LCD_CS1_PIN GPIO_PIN_10
// 定义 12864引脚输出电平,方便移植
#define LCD_CS1_H gpio_bit_write(LCD_CS1_PORT, LCD_CS1_PIN,SET)
#define LCD_CS1_L gpio_bit_write(LCD_CS1_PORT, LCD_CS1_PIN,RESET)
#define LCD_RESET_H gpio_bit_write(LCD_RESET_PORT, LCD_RESET_PIN,SET)
#define LCD_RESET_L gpio_bit_write(LCD_RESET_PORT, LCD_RESET_PIN,RESET)
#define LCD_RS_H gpio_bit_write(LCD_RS_PORT, LCD_RS_PIN,SET)
#define LCD_RS_L gpio_bit_write(LCD_RS_PORT, LCD_RS_PIN,RESET)
#define LCD_SID_H gpio_bit_write(LCD_SID_PORT, LCD_SID_PIN, SET)
#define LCD_SID_L gpio_bit_write(LCD_SID_PORT, LCD_SID_PIN, RESET)
#define LCD_SCLK_H gpio_bit_write(LCD_SCLK_PORT, LCD_SCLK_PIN, SET)
#define LCD_SCLK_L gpio_bit_write(LCD_SCLK_PORT, LCD_SCLK_PIN, RESET)
#define ROM_CS_H gpio_bit_write(ROM_CS_PORT, ROM_CS_PIN, SET)
#define ROM_CS_L gpio_bit_write(ROM_CS_PORT, ROM_CS_PIN, RESET)
#define ROM_SCK_H gpio_bit_write(ROM_SCK_PORT, ROM_SCK_PIN, SET)
#define ROM_SCK_L gpio_bit_write(ROM_SCK_PORT, ROM_SCK_PIN, RESET)
#define ROM_IN_H gpio_bit_write(ROM_IN_PORT, ROM_IN_PIN, SET)
#define ROM_IN_L gpio_bit_write(ROM_IN_PORT, ROM_IN_PIN, RESET)
#define ROM_OUT_H gpio_bit_write(ROM_OUT_PORT, ROM_OUT_PIN, SET)
#define ROM_OUT_L gpio_bit_write(ROM_OUT_PORT, ROM_OUT_PIN, RESET)
#define ROM_OUT_CIN gpio_input_bit_get(ROM_OUT_PORT, ROM_OUT_PIN)
//官方文档给的这两行代码需要删掉
//IO设置
//#define ROM_OUT_IN() {GPIOB->CRH&=0xFFFF0FFF;GPIOC->CRH|=0x00000008;} //低八位引脚的PB8脚定义为输入
//#define ROM_OUT_OUT() {GPIOB->CRH&=0xFFFF0FFF;GPIOC->CRH|=0x00000003;} //低八位引脚的PB8脚定义为输出
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
官方代码中有很多注释掉的 delay(),不要延时,加了延时可能会出问题,花屏。
这里只展示了核心程序的修改,完整的程序在文末,想直接拿来使用的话,可以按照上面 “移植工程” 的步骤,将移植好的程序加入到自己的工程。
/******************************************************************
* 函 数 名 :jlx12864g_086_gpio_init()
* 函 数 说 明:初始化IO口,比较重要
* 函 数 形 参:
* 函 数 返 回:
* 作 者:罗小黑
* 备 注:ROM_OUT 一定要配置为输入模式
******************************************************************/
void jlx12864g_086_gpio_init(void)
{
rcu_periph_clock_enable(LCD_RCU); // 开启字库时钟
rcu_periph_clock_enable(ROM_RCU); // 开启LCD时钟
gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, ROM_IN_PIN | ROM_CS_PIN | LCD_SCLK_PIN);
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, ROM_SCK_PIN | LCD_SID_PIN | LCD_RS_PIN | LCD_RESET_PIN | LCD_CS1_PIN);
gpio_mode_set(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_NONE, ROM_OUT_PIN);
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, ROM_IN_PIN | ROM_CS_PIN | LCD_SCLK_PIN );
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, ROM_SCK_PIN | LCD_SID_PIN | LCD_RS_PIN | LCD_RESET_PIN | LCD_CS1_PIN);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.19.4 移植验证
在 main.c 中输入代码如下
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: LC
* 修改日期: 2023年06月20日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#include "gd32f4xx.h"
#include "systick.h"
#include "stdio.h"
#include "lcd12864.h"
int main(void)
{
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 优先级分组
systick_config(); // 滴答定时器初始化 1us
jlx12864g_086_gpio_init();
initial_lcd();
clear_screen();
while (1)
{
//第一个参数表示行,第二个参数表示列
//显示中文的话,换行,第一个参数加2;间隔一个汉字,第二个参数加16
display_GB2312_string(1, 1, "罗小黑");
display_GB2312_string(1+2, 1+16, "罗小黑");
display_GB2312_string(1+2+2, 1, "立创梁山派");
display_GB2312_string(1+2+2+2, 1+16+16, "立创梁山派");
}
}
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
上电效果
文件 1.19.4.1 移植成功案例