• 官方微信

    CA800二维码微平台 大视野

  • 工控头条

    CA800二维码工控头条App

当前位置:自动化网>自动化文库>解决方案>高通STM32针对字库的调用方法——适用于最基本的16点阵字库、 16x16汉字库等应用

高通STM32针对字库的调用方法——适用于最基本的16点阵字库、 16x16汉字库等应用

发布时间:2019-09-02 来源:深圳高通半导体有限公司 类型:解决方案 人浏览
分享到:
关键字:

点阵字库 16点阵字库

导读:

本款芯片适合最基本的16点阵字库、16x16汉字库、一级字库、单片机字库应用,该芯片支持gb2312点阵和基本的ASCII编码的字符集,采用SPI协议的接口来读取芯片内的数据。封装为SOT23-6,体积较小,适合任意大小的设备。

       本例用STM32单片机普通IO口模拟SPI的方式来读取高通字库GT20L16S1Y。
       本款芯片适合最基本的16点阵字库、16x16汉字库、一级字库、单片机字库应用,该芯片支持gb2312点阵和基本的ASCII编码的字符集,采用SPI协议的接口来读取芯片内的数据。封装为SOT23-6,体积较小,适合任意大小的设备。
       本例中使用的单片机型号是STM32F103VDT6,字库使用的引脚是PA口的4,5,6,7脚,首先我们对这个单片机的系统时钟进行设置。进行系统时钟设置后才能开启端口的时钟。具体如下例所示。
void SystemInit (void)
{
  RCC->CR |= (uint32_t)0x00000001;
  RCC->CFGR &= (uint32_t)0xF0FF0000;  
  RCC->CR &= (uint32_t)0xFEF6FFFF;
  RCC->CR &= (uint32_t)0xFFFBFFFF;
  RCC->CFGR &= (uint32_t)0xFF80FFFF;
  RCC->CIR = 0x009F0000;
  RCC->CFGR2 = 0x00000000;      
  RCC->CIR = 0x009F0000;
  SystemInit_ExtMemCtl(); 
  SetSysClock();
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; 
}
设置好时钟后开始初始化STM32的IO口,如下例所示
#define  CLK_H     GPIO_SetBits(GPIOA,GPIO_Pin_5)
#define  CLK_L     GPIO_ResetBits(GPIOA,GPIO_Pin_5)
#define  SO_H      GPIO_SetBits(GPIOA,GPIO_Pin_7)
#define  SO_L      GPIO_ResetBits(GPIOA,GPIO_Pin_7)
#define  CS_H      GPIO_SetBits(GPIOA,GPIO_Pin_4)
#define  CS_L      GPIO_ResetBits(GPIOA,GPIO_Pin_4)

#define  SI        GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)
void GenitopZkInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
好了,下面开始用IO口模拟SPI来读写字库
发送0X03及计算出来的字库地址
void GenitopZk_Address(unsignedcharAddH,unsignedcharAddM,unsignedcharAddL) 
{
    Send_Byte(0x03);
Send_Byte(AddH);
Send_Byte(AddM);
Send_Byte(AddL);
}
从字库指定的地址address读出一个字节的数据出来
unsignedcharZkReadOneByte(unsigned long int address)
{
unsignedchardat=0x00,AddH,AddM,AddL;
CS_L;
AddH=address>>16;
AddM=address>>8;
AddL=address;
GenitopZk_Address (AddH,AddM,AddL);
dat=ReadByte();
CS_H;
return dat;
}  

从字库指定的地址读出N个字节的数据
Void ZkReadNByte(unsigned long int address,unsignedcharbyte_long,unsignedchar*p_arr)
{
    unsignedcharAddH,AddM,AddL;
unsigned int j;
CS_L;
AddH=address>>16;
AddM=address>>8;
AddL=address;
GenitopZk_Address (AddH,AddM,AddL);
for(j=0;j<byte_long;j++)
{
p_arr[j]=ReadByte();
}
CS_H;
}
该函数向字库发送数据
void Send_Byte(unsignedcharout)
{
unsignedchari=0;

for(i=0;i<8;i++)
{
  CLK_L;
  if(((out<<i)&0x80)==0)
      SO_L;   
  else
      SO_H;
  CLK_H;
  }
}
该函数从字库接收数据
u8 ReadByte(void)
{
u8 i;
u8 dat;
CLK_H;
for(i=0;i<8;i++)
{
CLK_L;
dat=dat<<1;
if(SI)
dat=dat|0x01;
else 
dat&=0xfe;
CLK_H ;
}
return dat;
}
读取汉字并显示的函数,参数M是指汉字机内码的高字节,L是指汉字机内码的低字节。
void Display_GTHZ16(unsignedcharM,unsignedcharL)

    unsignedchari,j;
unsigned long BaseAdd;
    unsignedcharMSB,LSB;
    unsigned long Address;
unsignedcharhzbuf[32];
unsignedcharaddr[4];
MSB=M;
LSB=L;
BaseAdd=0x00;//以下公式参见GT20L16S1Y规格书的第17页。
if(MSB==0xA9 && LSB>=0xa1)
Address=(282+(LSB-0XA1))*32+BaseAdd;
else if(MSB >=0xA1 && MSB <= 0xA3 && LSB >=0xA1)
    Address= ((MSB - 0xA1) * 94 + (LSB - 0xA1))*32+BaseAdd;   
else if(MSB >=0xB0 && MSB <= 0xF7 && LSB >=0xA1)
Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 1038)*32+ BaseAdd;    ZkReadNByte (Address,hzbuf,32);
for(i=0;i<16;i++)  //以下是显示部分,用的是128X64的STN屏。
{
LcdWriteCmd(0XB0+y);
LcdWriteCmd(0X10|(x+i+4)>>4);
LcdWriteCmd(0X0F&(x+i+4));
LcdWriteData(hzbuf[i]);
}
for(j=0;j<16;j++)
{  
LcdWriteCmd(0XB0+y+1);
LcdWriteCmd(0X10|(x+j+4)>>4);
LcdWriteCmd(0X0F&(x+j+4));
LcdWriteData(hzbuf[j+16]);

x=x+16;
}
读取ASCII编码并显示的函数
void Display_GTAscii16(unsignedcharAsciiCode)

    unsignedchari,j;
unsigned long BaseAdd;
    unsigned long Address;
unsignedcharasciibuf[16];
unsignedcharaddr[4];
BaseAdd=0x3B7C0; //以下公式参见GT20L16S1Y规格书的第18页。
if(AsciiCode>=20 && AsciiCode <= 0x7E)
Address=(AsciiCode-0x20) *16+BaseAdd;
   ZkReadNByte (Address,asciibuf,16);
for(i=0;i<8;i++)
{
LcdWriteCmd(0XB0+y);
LcdWriteCmd(0X10|(x+i+4)>>4);
LcdWriteCmd(0X0F&(x+i+4));
LcdWriteData(asciibuf[i]);
}
for(j=0;j<8;j++)
{  
LcdWriteCmd(0XB0+y+1);
LcdWriteCmd(0X10|(x+j+4)>>4);
LcdWriteCmd(0X0F&(x+j+4));
LcdWriteData(asciibuf[j+8]);

x=x+8;
}
在main函数内的实现方法
Void main()
{
SystemInit();
GenitopZkInit();
Unsignedchar*text=”高通科技ABC”;
While(*text!=”\0”)
{
  If(*text>0x80){
          Display_GTHZ16(*text,*(text++));  //显示汉字
} else {
          Display_GTAscii16(*text);         //显示英文Ascii编码
     }
  Text++;
}
While(1);
}


公司介绍:
      深圳高通半导体有限公司成立于2014年11月,其技术及团队传承上海高通半导体有限公司。迄今已来始终致力于中文信息处理技术,坚持发展中文信息民族产业的道路,秉持着用科技传承文化的理念,从1992年DOS时代的汉卡类产品至如今的汉字库芯片产品,持续为行业提供专业的中文信息产品。
      高通公司为国家高新技术企业,软件企业,累积知识产权百余项,专注于中文信息处理集成电路产品,简称字库芯片。其开发产品包含点阵字库芯片、矢量字库芯片、GUI字库芯片、智能字库芯片等,为用户提供各类电子产品中的文字解决方案,使产品在中文信息处理方面的开发更加便捷,效果与品质极大提升。
      逾6000 个客户案例积累,所涵盖领域包括智能穿戴、智能家居、物联网设备、金融设备、智能表、教育、医疗、商用机器等等深圳高通在成本、专业、便捷、标准、品质方面追求极致。在字库产业发展方面取得了骄人的业绩,在行业内的影响力亦日趋提升,整合国内外字库资源,形成全球领先的文字处理信息产业生态链。
      我们深信:汉字作为中华文明的核心之一,有着极其重要的地位。随着世界不断数字化,随着中国不断全球化,中文信息将作为现在与未来的沟通技术,拥有者务必宽广的可能性。无论科技如何发展,我们将致力于发展中文信息产业,秉承用科技传承文化的理念,创造文明智能!

本文地址:本文地址: http://www.ca800.com/apply/d_1o19p9jlsjf51_1.html

拷贝地址

上一篇:XGN66-12箱型固定式金属封闭开关设备

下一篇:如何解决文字显示中出现的漏字、错字等现象——高通标准点阵字库解决方案

版权声明:版权归中国自动化网所有,转载请注明出处!