⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gt21l16s2w.c

📁 GT21L16S2W汉字库芯片源代码
💻 C
字号:
#include <reg51.h>
sbit CS=P1^0;
sbit SCLK=P1^1;
sbit SI=P1^2;
sbit SO=P1^3;
//--------------------------------------------------------------------------------
// 仅限GT21L16S2W汉字库芯片使用,版权归上海集通数码科技有限责任公司所有。
// 作者:朱和平 时间:2008-12-23 版本:VER1.0
//--------------------------------------------------------------------------------
//------------------------------------------------------
//  在GT21L16S2W芯片中数据的地址 
//------------------------------------------------------
#define ASC0808D2HZ_ADDR ( 0x66c0  ) 		//7*8 ascii code
#define ASC0812M2ZF_ADDR ( 0x66d40 )   		//6*12 ascii code
#define GBEX0816ZF_ADDR   243648   	   		//8*16 ascii code
#define ZF1112B2ZF_ADDR  ( 0x3cf80 )	   	//12*12 12点字符 
#define HZ1112B2HZ_ADDR  ( 0x3cf80+376*24 )	//12*12 12点汉字 
#define CUTS1516ZF_ADDR  0x00  				//16*16 16点字符 
#define JFLS1516HZ_ADDR  27072  			//16*16 16点汉字 

//---------------------------------------------
// 保留 
//--------------------------------------------
#define ASCII0507ZF_ADDR        245696
#define ARIAL_16B0_ADDR         246464
#define ARIAL_12B0_ADDR         422720
#define SPAC1616_ADDR           425264
#define GB2311ToUnicode_addr    (12032)
#define UnicodeToGB2311_addr    (425328)
//------------------------------------------------
// 要显示的汉字的类型 
//------------------------------------------------
#define   TYPE_8  	0 //8  点字符 
#define   TYPE_12  	1 //12 点汉字字符 
#define   TYPE_16  	2 //16 点汉字字符 
//-------------------------------------------------
// unsigned long  GB2312_Addr(unsigned char *ss,unsigned char type)
//  函数说明:
//   	由汉字内码 SS[0] S[1] ......
//	 	计算的在GT23L16S2W中的点阵数据地址 
//  参数:
//  	ss 		汉字GB2312内码指针 
//		type 	汉字类型 
//  返回:
//		汉字在芯片中的点阵数据起始地址 
//--------------------------------------------------
unsigned long  GB2312_Addr(unsigned char *ss,unsigned char type)
{
	unsigned long temp = 0;
	unsigned char c1,c2;//c3,c4;

	 if(ss[0]<0x80)	   	//ascii  半角字符 
		{
            if( ss[0] >= ' ' )  //判断是否大于“空格键 ” 0x20 
			   temp = ss[0] - ' ';
			if( type == TYPE_8 )  	    temp = temp*8  + ASC0808D2HZ_ADDR;		 	//7*8 ascii code
			else if( type == TYPE_12 )	temp = temp*12 + ASC0812M2ZF_ADDR;			//6*12 ascii code
			else if( type == TYPE_16 )	temp = temp*16 + GBEX0816ZF_ADDR;			//8*16 ascii code
		}
      else               //chinese tab zone
       {
        	c1=ss[0];
        	c2=ss[1];
       	 	//符号区,全角 
        	if(c1>=0xA1 && c1 <= 0xAB && c2>=0xa1)
        	{
                	if( type == TYPE_12 ) //16 点汉字字符 
                	{
                		if( c1>=0xA1 && c1 <= 0xA3 && c2>=0xa1 )//ZF 272 ZONE
                			temp = (c1 - 0xA1) * 94 + (c2 - 0xA1);
                		else if( c1 == 0xa9 && c2>=0xa1  )//tab 94 zone
                			temp = 282 + ( c2 - 0xA1 );
					
						return( temp *24 + ZF1112B2ZF_ADDR);		 //11*12 12点字符 
					}
					else
					{
						temp = (c1 - 0xA1) * 94 + (c2 - 0xA1);
						return(temp *32 + CUTS1516ZF_ADDR);			 //16*16 16点字符 
					}

        	 }
        	//GBK双字节2区 6768
        	else if(c1>=0xb0 && c1 <= 0xf7 && c2>=0xa1)
        	{
                temp= (c1 - 0xB0) * 94 + (c2 - 0xA1);
               	if( type == TYPE_12 )
					temp = temp*24 + HZ1112B2HZ_ADDR;
				else if( type == TYPE_16 )
					temp = temp*32 + JFLS1516HZ_ADDR;
        	}
       }
    return temp;
}
//从芯片中addr地址读一个BYTE的数据 
 unsigned char readbyte(unsigned long addr)  //read one byte from GT ROM
 {
  unsigned char i,RT_data=0x03;
  CS=0;
  SI=0;
  for(i=0;i<8;i++)	  //先写入0x03;
  {
   SI=(bit)(RT_data&0X80);
   SCLK=0;
   SCLK=1;
   RT_data<<=1;
  }
  for(i=0;i<24;i++)	   //再写三个字节地址 
  {
   SI=(bit)(addr&0x80);
   SCLK=0;
   SCLK=1;
   addr<<=1;
  }
  for(i=0;i<8;i++)	   //读一个字节 
  {
   RT_data=0;
   SCLK=1;
   SCLK=0;
   if(SO==1)(RT_data||0X01);
   RT_data<<=1;
  }
  CS=1;
  return (RT_data);
 }
//------------------------------------------------
// 程序使用例子   
//-------------------------------------------------
void main( void )
{
 volatile  unsigned char a[2] = { 0xb0,0xa1 }; //16点汉字 “啊”  的GB2312内码。 
 volatile  unsigned char a_dot[32];			  //存储汉字 “啊”  的点阵数据。 
 volatile  unsigned long a_dot_address;
 volatile  unsigned char count;
   a_dot_address = GB2312_Addr(a,TYPE_16); //得到“啊” 点阵数据的起始地址 
   for( count = 0; count < 32; count++ )   //得到“啊” 点阵数据 
   	 a_dot[count] =  readbyte(a_dot_address+count);

 //  display(x,y,a_dot,TYPE_16);			   //在坐标(X,Y),显示汉字“啊” 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -