📄 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 + -