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

今日头条

1135人已加入

描述

       本例用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(unsigned char AddH,unsigned char AddM,unsigned char AddL) 

{

    Send_Byte(0x03);

Send_Byte(AddH);

Send_Byte(AddM);

Send_Byte(AddL);

}

从字库指定的地址address读出一个字节的数据出来

unsigned char ZkReadOneByte(unsigned long int address)

{

unsigned char dat=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,unsigned char byte_long,unsigned char *p_arr)

{

    unsigned char AddH,AddM,AddL;

unsigned int j;

CS_L;

AddH=address>>16;

AddM=address>>8;

AddL=address;

GenitopZk_Address (AddH,AddM,AddL);

for(j=0;j

{

p_arr[j]=ReadByte();

}

CS_H;

}

该函数向字库发送数据

void Send_Byte(unsigned char out)

{

unsigned char i=0;


for(i=0;i<8;i++)

{

  CLK_L;

  if(((out<

      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(unsigned char M,unsigned char L)

    unsigned char i,j;

unsigned long BaseAdd;

    unsigned char MSB,LSB;

    unsigned long Address;

unsigned char hzbuf[32];

unsigned char addr[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(unsigned char AsciiCode)

    unsigned char i,j;

unsigned long BaseAdd;

    unsigned long Address;

unsigned char asciibuf[16];

unsigned char addr[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();

Unsigned char *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 个客户案例积累,所涵盖领域包括智能穿戴、智能家居、物联网设备、金融设备、智能表、教育、医疗、商用机器等等深圳高通在成本、专业、便捷、标准、品质方面追求极致。在字库产业发展方面取得了骄人的业绩,在行业内的影响力亦日趋提升,整合国内外字库资源,形成全球领先的文字处理信息产业生态链。

       我们深信:汉字作为中华文明的核心之一,有着极其重要的地位。随着世界不断数字化,随着中国不断全球化,中文信息将作为现在与未来的沟通技术,拥有者务必宽广的可能性。无论科技如何发展,我们将致力于发展中文信息产业,秉承用科技传承文化的理念,创造文明智能!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分