想要在屏幕上显示中文字符?本驱动程序代码精简,运行高效,可移植性佳!
GT20L16S1Y字库芯片
GT20L16S1Y是一款内含16x16点阵的汉字库芯片,支持GB2312国标简体汉字(含有国家信标委合法授权)、ASCII字符。排列格式为竖置横排。
GT20L16S1Y除含有上述字库以外,芯片提供64KB可擦写空间,包含16个扇区,每个扇区4K字节或16页,每页256字节,可自由写入空间地址范围为:0x6FFFF-0x7FFFF。仅支持上位机烧录,可重复擦写10万次以上。
- 时钟频率:45MHz @3.3V
- 工作电压:2.7V~3.6V
- 工作电流:读电流 20mA(max)
- 写电流 30mA(max)
- 睡眠电流:8uA(Max)
- 工作温度:-40℃~85℃
- 封装:SOT23-6
- 字符集:GB2312
- 字号: 16x16 点阵
引脚配置
STM32连接至SO的引脚配置为输入,其它均为输出。
话不多说,直接上干货:创建gt20l16s1y.h
#ifndef __GT20L16S1Y_H
#define __GT20L16S1Y_H
#include "main.h"
#define GT_CS_PORT ZK_CS_GPIO_Port
#define GT_CS_PIN ZK_CS_Pin
#define GT_SCLK_PORT ZK_SCLK_GPIO_Port
#define GT_SCLK_PIN ZK_SCLK_Pin
#define GT_SI_PORT ZK_SI_GPIO_Port
#define GT_SI_PIN ZK_SI_Pin
#define GT_SO_PORT ZK_SO_GPIO_Port
#define GT_SO_PIN ZK_SO_Pin
#define GT20L16S1Y_ASCII_8x16_BASE_ADDR 0x3B7C0
#define GT20L16S1Y_ASCII_BOLD_8x16_BASE_ADDR 0x3CF80
#define GT20L16S1Y_GB2312_EXTEND_8x16_BASE_ADDR 0x3B7D0
#define GT20L16S1Y_GB2312_15x16_BASE_ADDR 0x00000
#define ZK_WIDTH 8
#define ZK_HEIGHT 16
enum {
FONT_8X16,
FONT_GB2312
};
uint8_t * GT20_read(uint8_t font, uint32_t addr);
uint32_t get_addr_GB2312_15x16(char *GB2312Code);
#endif
创建gt20l16s1y.c
#include "gt20l16s1y.h"
void write_byte(uint8_t byte) {
for (uint8_t i = 0; i < 8; i++) {
HAL_GPIO_WritePin(GT_SCLK_PORT, GT_SCLK_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GT_SI_PORT, GT_SI_PIN, byte & 0x80 ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(GT_SCLK_PORT, GT_SCLK_PIN, GPIO_PIN_SET);
byte <<= 1;
}
}
uint8_t read_byte() {
uint8_t font = 0;
for (uint8_t i = 0; i < 8; i++) {
font <<= 1;
HAL_GPIO_WritePin(GT_SCLK_PORT, GT_SCLK_PIN, GPIO_PIN_RESET);
font |= HAL_GPIO_ReadPin(GT_SO_PORT, GT_SO_PIN) ? 0x01 : 0x00;
HAL_GPIO_WritePin(GT_SCLK_PORT, GT_SCLK_PIN, GPIO_PIN_SET);
}
return font;
}
uint8_t* GT20_read(uint8_t font, uint32_t addr) {
static uint8_t data[32] = { 0x00 };
HAL_GPIO_WritePin(GT_CS_PORT, GT_CS_PIN, GPIO_PIN_RESET);
write_byte(0x03);
write_byte((addr >> 16) & 0xff);
write_byte((addr >> 8) & 0xff);
write_byte(addr & 0xff);
uint8_t len = font == FONT_8X16 ? 16 : 32;
for (uint8_t i = 0; i < len; i++) {
data[i] = read_byte();
}
HAL_GPIO_WritePin(GT_CS_PORT, GT_CS_PIN, GPIO_PIN_SET);
return data;
}
uint32_t get_addr_GB2312_15x16(char *GB2312Code) {
uint8_t MSB = *GB2312Code;
uint8_t LSB = *(GB2312Code + 1);
if (MSB == 0xA9 && LSB >= 0xA1) {
return GT20L16S1Y_GB2312_15x16_BASE_ADDR + (282 + (LSB - 0xA1)) * 32;
} else if (MSB >= 0xA1 && MSB <= 0xA3 && LSB >= 0xA1) {
return GT20L16S1Y_GB2312_15x16_BASE_ADDR + ((MSB - 0xA1) * 94 + (LSB - 0xA1)) * 32;
} else if (MSB >= 0xB0 && MSB <= 0xF7 && LSB >= 0xA1) {
return GT20L16S1Y_GB2312_15x16_BASE_ADDR + ((MSB - 0xB0) * 94 + (LSB - 0xA1) + 846) * 32;
}
return 0;
}
如何使用
在你的stm32工程中添加上面两个文件,并引入头文件,然后在根据引脚定义在头文件中修改为对应的引脚(再次提醒:GT_SO_PIN设置为输入模式)。
1、通过get_addr_GB2312_15x16获取字符对应的地址,参数为gb2312编码的汉字。
2、通过GT20_read获取字符的编码数据,参数有2个,分别为【字体样式】和【get_addr_GB2312_15x16返回的地址】
3、【GT20_read】返回一个指针,该指针指向【gb2312编码的汉字】的首地址,根据字体确定读取长度,该芯片支持FONT_8X16和FONT_GB2312两种字体。
4、大功告成。
若有其他问题,欢迎评论区留言或加入群聊提问!!