? ? ? ?本例用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 個客戶案例積累,所涵蓋領域包括智能穿戴、智能家居、物聯網設備、金融設備、智能表、教育、醫療、商用機器等等深圳高通在成本、專業、便捷、標準、品質方面追求極致。在字庫產業發展方面取得了驕人的業績,在行業內的影響力亦日趨提升,整合國內外字庫資源,形成全球領先的文字處理信息產業生態鏈。 ? ? ? ?我們深信:漢字作為中華文明的核心之一,有著極其重要的地位。隨著世界不斷數字化,隨著中國不斷全球化,中文信息將作為現在與未來的溝通技術,擁有者務必寬廣的可能性。無論科技如何發展,我們將致力于發展中文信息產業,秉承用科技傳承文化的理念,創造文明智能!
評論
查看更多