STM32驱动GT20L16S1Y中文字库,驱动不了你顺着网线来打我

想要在屏幕上显示中文字符?本驱动程序代码精简,运行高效,可移植性佳!

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、大功告成。

若有其他问题,欢迎评论区留言或加入群聊提问!!
在这里插入图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值