野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12074|回复: 2

(已经搞定)使用高通的字库芯片,遇到一个问题:字符的基...

[复制链接]
发表于 2020-4-14 07:59:05 | 显示全部楼层 |阅读模式
本帖最后由 pidalu 于 2020-5-3 08:22 编辑

(已经搞定,见3楼)芯片是上海高通的GT30L32S4W,翻遍整本手册也没找到如何得到各种字体标号的字符地址的方法,头大。SPI通信倒是正常,芯片的控制指令非常简单,发一个字节的指令代码,跟上3字节的起始地址,然后就使劲的读取点阵字符数据就好了。
回复

使用道具 举报

发表于 2020-4-16 21:33:10 | 显示全部楼层
帮顶
回复

使用道具 举报

 楼主| 发表于 2020-5-2 17:59:06 | 显示全部楼层
本帖最后由 pidalu 于 2020-5-2 18:06 编辑

自己摸索了两天,终于找到相关资料了。等宽字体的偏移地址如下:
ASCII:
5x7:0x1DDF80
7x8:0x1DE280
6x12:0x1DBE00
8x16:0x1DD780
12x24:0x1DFF00
16x32:0x1E5A50
GB2312:宋体
12x12:0x00000
16x16:0x2C9D0
24x24:0x68190
32x32:0xEDF00

下面的例子代码经过调试验证,是可行的。
void GetDataFromIC(uint32_t nStartAddr,PSTR Buf,uint16_t nSize)
{
  FOT_Select();
  W_spi8(0x0B);       //发送字库IC连续读取命令
  W_spi24(nStartAddr);//发送起始地址(3字节)
  W_spi8(0x00);       //发送一个Dummy字节

  R_spiX(Buf,nSize);  //读取字模数据到缓冲区
  FOT_UnSelect();
}
uint32_t GetAddrByAsc(char c)
{
  uint32_t nAddr = 0;
  c = max(0x20,c) & 0x7F;
  nAddr = c - 0x20;
  return nAddr;
}

uint32_t GetAddrByGb2312(uint16_t c)
{
  uint32_t nAddr = 0;
  uint8_t msb = (uint8_t)(c>>8);  //区码
  uint8_t lsb = (uint8_t)(c);     //位码

  if ((msb>=0xA1) && (msb<=0xA9)) {// 1~9,符号区域
    nAddr = (msb-0xA1)*94 + (lsb-0xA1);
  }else if ((msb>=0xB0)&&(msb<=0xF7)){// 16~87,汉字区域
    nAddr = (msb-0xB0)*94 + (lsb-0xA1) + 846;
  }

  return nAddr;
}

void GetAsc_5x7(char c,PSTR Buf)
{
  const uint16_t nSize = 8;
  const uint32_t nBaseAddr = 0x1DDF80;
  uint32_t nAddr = GetAddrByAsc(c);

  nAddr *= nSize;
  nAddr += nBaseAddr;

  GetDataFromIC(nAddr,Buf,nSize);
}

void GetAsc_7x8(char c,PSTR Buf)
{
  const uint16_t nSize = 8;
  const uint32_t nBaseAddr = 0x1DE280;
  uint32_t nAddr = GetAddrByAsc(c);

  nAddr *= nSize;
  nAddr += nBaseAddr;

  GetDataFromIC(nAddr,Buf,nSize);
}

void GetAsc_6x12(char c,PSTR Buf)
{
  const uint16_t nSize = 12;
  const uint32_t nBaseAddr = 0x1DBE00;
  uint32_t nAddr = GetAddrByAsc(c);

  nAddr *= nSize;
  nAddr += nBaseAddr;

  GetDataFromIC(nAddr,Buf,nSize);
}
void GetAsc_8x16(char c,PSTR Buf)
{
  const uint16_t nSize = 16;
  const uint32_t nBaseAddr = 0x1DD780;
  uint32_t nAddr = GetAddrByAsc(c);

  nAddr *= nSize;
  nAddr += nBaseAddr;

  GetDataFromIC(nAddr,Buf,nSize);
}

void GetAsc_12x24(char c,PSTR Buf)
{
  const uint16_t nSize = 48;
  const uint32_t nBaseAddr = 0x1DFF00;
  uint32_t nAddr = GetAddrByAsc(c);

  nAddr *= nSize;
  nAddr += nBaseAddr;

  GetDataFromIC(nAddr,Buf,nSize);
}

void GetAsc_16x32(char c,PSTR Buf)
{
  const uint16_t nSize = 64;
  const uint32_t nBaseAddr = 0x1E5A50;
  uint32_t nAddr = GetAddrByAsc(c);

  nAddr *= nSize;
  nAddr += nBaseAddr;

  GetDataFromIC(nAddr,Buf,nSize);
}

void GetGB2312_12x12(uint16_t c, PSTR Buf)
{
  const uint16_t nSize = 12*2;
  const uint32_t nBaseAddr = 0x00;
  uint32_t nAddr = GetAddrByGb2312(c);

  nAddr *= nSize;
  nAddr += nBaseAddr;

  GetDataFromIC(nAddr,Buf,nSize);
}

void GetGB2312_16x16(uint16_t c, PSTR Buf)
{
  const uint16_t nSize = 16*2;
  const uint32_t nBaseAddr = 0x2C9D0;
  uint32_t nAddr = GetAddrByGb2312(c);

  nAddr *= nSize;
  nAddr += nBaseAddr;

  GetDataFromIC(nAddr,Buf,nSize);
}

void GetGB2312_24x24(uint16_t c, PSTR Buf)
{
  const uint16_t nSize = 24*3;
  const uint32_t nBaseAddr = 0x68190;
  uint32_t nAddr = GetAddrByGb2312(c);

  nAddr *= nSize;
  nAddr += nBaseAddr;

  GetDataFromIC(nAddr,Buf,nSize);
}

void GetGB2312_32x32(uint16_t c, PSTR Buf)
{
  const uint16_t nSize = 32*4;
  const uint32_t nBaseAddr = 0xEDF00;
  uint32_t nAddr = GetAddrByGb2312(c);

  nAddr *= nSize;
  nAddr += nBaseAddr;

  GetDataFromIC(nAddr,Buf,nSize);
}


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-21 01:47 , Processed in 0.034013 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表