本例用STM32單片機普通IO口模擬SPI的方式來讀取高通字庫GT20L16S1Y。本款芯片適合最基本的16點陣字庫、16x16漢字庫、一級字庫、單片機字庫應(yīng)用,該芯片支持gb2312點陣和基本的ASCII編碼的字符集,采用SPI協(xié)議的接口來讀取芯片內(nèi)的數(shù)據(jù)。封裝為SOT23-6,體積較小,適合任意大小的設(shè)備。
本例中使用的單片機型號是STM32F103VDT6,字庫使用的引腳是PA口的4,5,6,7腳,首先我們對這個單片機的系統(tǒng)時鐘進行設(shè)置。進行系統(tǒng)時鐘設(shè)置后才能開啟端口的時鐘。具體如下例所示。
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;
}
設(shè)置好時鐘后開始初始化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來讀寫字庫
發(fā)送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讀出一個字節(jié)的數(shù)據(jù)出來
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個字節(jié)的數(shù)據(jù)
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<byte_long;j++)
{
p_arr[j]=ReadByte();
}
CS_H;
}
該函數(shù)向字庫發(fā)送數(shù)據(jù)
void Send_Byte(unsigned char out)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
CLK_L;
if(((out<<i)&0x80)==0)
SO_L;
else
SO_H;
CLK_H;
}
}
該函數(shù)從字庫接收數(shù)據(jù)
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;
}
讀取漢字并顯示的函數(shù),參數(shù)M是指漢字機內(nèi)碼的高字節(jié),L是指漢字機內(nèi)碼的低字節(jié)。
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規(guī)格書的第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編碼并顯示的函數(shù)
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規(guī)格書的第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函數(shù)內(nèi)的實現(xiàn)方法
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);
}
公司介紹:
深圳高通半導(dǎo)體有限公司成立于2014年11月,其技術(shù)及團隊傳承上海高通半導(dǎo)體有限公司。迄今已來始終致力于中文信息處理技術(shù),堅持發(fā)展中文信息民族產(chǎn)業(yè)的道路,秉持著用科技傳承文化的理念,從1992年DOS時代的漢卡類產(chǎn)品至如今的漢字庫芯片產(chǎn)品,持續(xù)為行業(yè)提供專業(yè)的中文信息產(chǎn)品。
高通公司為國家高新技術(shù)企業(yè),軟件企業(yè),累積知識產(chǎn)權(quán)百余項,專注于中文信息處理集成電路產(chǎn)品,簡稱字庫芯片。其開發(fā)產(chǎn)品包含點陣字庫芯片、矢量字庫芯片、GUI字庫芯片、智能字庫芯片等,為用戶提供各類電子產(chǎn)品中的文字解決方案,使產(chǎn)品在中文信息處理方面的開發(fā)更加便捷,效果與品質(zhì)極大提升。
逾6000 個客戶案例積累,所涵蓋領(lǐng)域包括智能穿戴、智能家居、物聯(lián)網(wǎng)設(shè)備、金融設(shè)備、智能表、教育、醫(yī)療、商用機器等等深圳高通在成本、專業(yè)、便捷、標準、品質(zhì)方面追求極致。在字庫產(chǎn)業(yè)發(fā)展方面取得了驕人的業(yè)績,在行業(yè)內(nèi)的影響力亦日趨提升,整合國內(nèi)外字庫資源,形成全球領(lǐng)先的文字處理信息產(chǎn)業(yè)生態(tài)鏈。
我們深信:漢字作為中華文明的核心之一,有著極其重要的地位。隨著世界不斷數(shù)字化,隨著中國不斷全球化,中文信息將作為現(xiàn)在與未來的溝通技術(shù),擁有者務(wù)必寬廣的可能性。無論科技如何發(fā)展,我們將致力于發(fā)展中文信息產(chǎn)業(yè),秉承用科技傳承文化的理念,創(chuàng)造文明智能!
評論
查看更多