字库芯片GT20L16S1Y使用记录
1、芯片基本信息
16x16點陣的漢字庫芯片
支持GB2312國標(biāo)簡體漢字(含有國家信標(biāo)委合法授權(quán))、ASCII字符
排列格式為豎置橫排
SPI 串行總線接口
通過字符內(nèi)碼計算字庫在芯片中的地址
2、字庫內(nèi)容
3、芯片IO說明
4、芯片操作
支持兩種讀取方式,一般讀取(Read),快速讀取(FAST_READ)。
4.1一般讀取
1byte讀取命令,3byte地址,后面緊跟著是芯片輸出的字庫數(shù)據(jù)。
4.2快速讀取
1byte讀取命令,3byte地址,1字節(jié)任意數(shù)據(jù),后面緊跟著是芯片輸出的字庫數(shù)據(jù)。
5、 點陣排列格式(豎置橫排)
每個漢字在芯片中是以漢字點陣字模的形式存儲的,每個點用一個二進(jìn)制位表示,存 1 的點, 當(dāng)顯示時可以在屏幕上顯示亮點,存 0的點,則在屏幕上不顯示。點陣排列格式為豎置橫排:即一 個字節(jié)的高位表示下面的點,低位表示上面的點(如果用戶按 16bit總線寬度讀取點陣數(shù)據(jù),請注意 高低字節(jié)的順序),排滿一行后再排下一行。這樣把點陣信息用來直接在顯示器上按上述規(guī)則顯示, 則將出現(xiàn)對應(yīng)的漢字。
一個15X16 點漢字的信息需要 32 個字節(jié)(BYTE 0 – BYTE 31)來表示,則點陣的排列順序如下(這個與在LCD上顯示的時候,寫數(shù)據(jù)的順序息息相關(guān))
6、代碼實現(xiàn)
本文使用GD32F303VC讀取字庫,是用GPIO模擬SPI方式。
6.1、IO口定義以及初始化
#define ZK_CS_OUT(level) { if(level) \{ gpio_bit_set(GPIOB,GPIO_PIN_12);} \else \{ gpio_bit_reset(GPIOB,GPIO_PIN_12);} \} #define ZK_SCK_OUT(level) { if(level) \{ gpio_bit_set(GPIOB,GPIO_PIN_13);} \else \{ gpio_bit_reset(GPIOB,GPIO_PIN_13);} \} #define ZK_SO_OUT(level) { if(level) \{ gpio_bit_set(GPIOB,GPIO_PIN_14);} \else \{ gpio_bit_reset(GPIOB,GPIO_PIN_14);} \} #define ZK_SI_IN() gpio_input_bit_get(GPIOB,GPIO_PIN_15) static void GT20L16S1YIoInit(void) {rcu_periph_clock_enable(RCU_GPIOB);gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14); gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ,GPIO_PIN_15); }6.2、SPI讀寫
static void GT20L16S1YSendByte( uint32_t addr ) {uint8_t i;addr = addr | 0x03000000;for( i = 0; i < 32; i++ ){ZK_SCK_OUT(0);if( addr & 0x80000000 ){ZK_SO_OUT(1);}else{ZK_SO_OUT(0);}ZK_SCK_OUT(1);addr = addr << 1;} }static uint8_t GT20L16S1YReadByte( void ) {uint8_t i;uint8_t dat = 0;ZK_SCK_OUT(1);for( i = 0; i < 8; i++ ){ZK_SCK_OUT(0);dat = dat << 1;if( ZK_SI_IN() ){dat = dat | 0x01;}else{dat &= 0xfe;}ZK_SCK_OUT(1);}return dat; }6.3、GT20L16S1Y讀寫
/**************************************************** 說明:從字庫中讀數(shù)據(jù) Address : 表示字符點陣在芯片中的字節(jié)地址。 byte_long: 是讀點陣數(shù)據(jù)字節(jié)數(shù)。 *p_arr : 是保存讀出的點陣數(shù)據(jù)的數(shù)組。 *****************************************************/ static void GT20L16S1YRead( uint32_t address, uint8_t byte_long, uint8_t* p_arr ) {unsigned int j = 0;ZK_CS_OUT(0);GT20L16S1YSendByte( address );for( j = 0; j < byte_long; j++ ){p_arr[j] = GT20L16S1YReadByte();}ZK_CS_OUT(1); }6.4、GT20L16S1Y讀字庫
/*************************************** ASCII字符集 ASCIICode:表示ASCII 碼(8bits) BaseAdd:說明該套字庫在芯片中的起始地址。 r_dat_bat: 是讀點陣數(shù)據(jù)函數(shù)。 DZ_Data:是保存讀出的點陣數(shù)據(jù)的數(shù)組。 ***************************************/ uint8_t GT20L16S1YGetAsciiData( uint8_t ASCIICode, uint32_t BaseAdd, uint8_t* S1YDZ_Data ) {if( ( ASCIICode >= 0x20 ) && ( ASCIICode <= 0x7e ) ){switch( BaseAdd ){case 0x3bfc0:GT20L16S1YRead( ( ASCIICode - 0x20 ) * 8 + BaseAdd, 8, S1YDZ_Data ); //標(biāo)準(zhǔn)5X7,96個break ;case 0x66c0:GT20L16S1YRead( ( ASCIICode - 0x20 ) * 8 + BaseAdd, 8, S1YDZ_Data ); //標(biāo)準(zhǔn)7X8,96個break ;case 0x3b7c0:GT20L16S1YRead( ( ASCIICode - 0x20 ) * 16 + BaseAdd, 16, S1YDZ_Data ); //標(biāo)準(zhǔn)8X16,96break ;case 0x3cf80:GT20L16S1YRead( ( ASCIICode - 0x20 ) * 26 + BaseAdd, 16, S1YDZ_Data ); //粗體8X16, 96break ;case 0x3c2c0:GT20L16S1YRead( ( ASCIICode - 0x20 ) * 34 + BaseAdd + 2, 32, S1YDZ_Data ); //16點陣不等寬,Arial(方頭),96break ;case 0x3d580:GT20L16S1YRead( ( ASCIICode - 0x20 ) * 34 + BaseAdd + 2, 32, S1YDZ_Data ); //16 點陣不等寬,Times New Roman(白正),96break ;default:break;}return 1;}else{return 0;} }/*************************************************** 16*16點GB2312 標(biāo)準(zhǔn)點陣字庫 GBCode表示漢字內(nèi)碼。 MSB 表示漢字內(nèi)碼GBCode 的高8bits。 LSB 表示漢字內(nèi)碼GBCode 的低8bits。 Address 表示漢字或ASCII字符點陣在芯片中的字節(jié)地址。 BaseAdd:說明點陣數(shù)據(jù)在字庫芯片中的起始地址。 r_dat_bat 是讀點陣數(shù)據(jù)函數(shù)。 DZ_Data是保存讀出的點陣數(shù)據(jù)的數(shù)組。 *****************************************************/ void GT20L16S1YGetGb2312Data( uint8_t MSB, uint8_t LSB, uint8_t* S1YDZ_Data ) {uint32_t temp = ( MSB - 0xB0 ) * 94 + LSB - 0xA1;uint32_t BaseAdd = 0, Address;if( MSB == 0xA9 && LSB >= 0xA1 ) //GB2312 字符 ,A9區(qū){Address = ( 282 + ( LSB - 0xA1 ) ) * 32 + BaseAdd;}else if( MSB >= 0xA1 && MSB <= 0xA3 && LSB >= 0xA1 ) //GB2312 字符 ,A1-A3區(qū),A1-A3、A9共376個字符{Address = ( ( MSB - 0xA1 ) * 94 + ( LSB - 0xA1 ) ) * 32 + BaseAdd;}else if( MSB >= 0xB0 && MSB <= 0xF7 && LSB >= 0xA1 ) //GB2312 漢字 ,6763個 {Address = ( 846 + temp ) * 32 + BaseAdd;}GT20L16S1YRead( Address, 32, S1YDZ_Data ); } /**************************************************** 8*16點國際擴(kuò)展字符,126個,AAA1-ABC0BaseAdd:說明本套字庫在字庫芯片中的起始字節(jié)地址。 FontCode:表示字符內(nèi)碼(16bits). Address:表示字符點陣在芯片中的字節(jié)地址。 r_dat_bat 是讀點陣數(shù)據(jù)函數(shù)。 DZ_Data是保存讀出的點陣數(shù)據(jù)的數(shù)組。 *****************************************************/ void GT20L16S1YGetExt8x16Data( uint16_t FontCode, uint8_t* S1YDZ_Data ) {uint32_t BaseAdd = 0x3b7d0, Address;uint32_t temp1 = ( FontCode - 0xAAA1 );uint32_t temp2 = ( FontCode - 0xABA1 + 95 );if( FontCode >= 0xAAA1 && FontCode <= 0xAAFE ) {Address = temp1 * 16 + BaseAdd;}else if( FontCode >= 0xABA1 && FontCode <= 0xABC0 ){Address = temp2 * 16 + BaseAdd;}GT20L16S1YRead( Address, 16, S1YDZ_Data ); }6.5、GT20L16S1Y讀寫測試
手冊給了字母“A”的字庫,用于可以讀取“A”的字庫比對,驗證驅(qū)動正確與否。
排置:Y(豎置橫排)
點陣大小 8X16 字母"A"
點陣數(shù)據(jù):00 E0 9C 82 9C E0 00 00 0F 00 00 00 00 00 0F 00
7、擴(kuò)展
GB2312簡體中文編碼表:http://tools.jb51.net/table/gb2312
8、讀取字庫LCD顯示
總結(jié)
以上是生活随笔為你收集整理的字库芯片GT20L16S1Y使用记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (四)现代计算机系统的层次结构
- 下一篇: 全文检索汇总