define int8 unsigned char
#define int16 unsigned int
#define int32 unsigned long
/*
函数void read_hz(int16 hz)的参数hz为两字节的机内码,调用方法:read_hz(‘汉’);
对ASCII字符,则read_hz('A'+0xa380);读取
*/
void read_hz(int16 hz){
void *void_p;//定义一个空类型指针
int8 *int8_p;//定义一个unsigned char 指针
int8 i; //定义一个循环变量
int16 area_l,area_h;//定义两个整型变量,用于存储区码和位码
int32 pos; //定义一个long型变量,用于存储计算所得字模在字库的位置,
int8 chip; //字模所在的芯片,可用74HC138之类的芯片译码。
int16 addr; //在某一芯片64K字节空间内的地址
void_p=&hz; //空指针指向机内码的低字节
int8_p=void_p; //char类型指针指向空指针,即机内码的低字节
area_l=*int8_p-0xa0; //机内码低字节减去0xa0得到区码
area_h=*(int8_p+1)-0xa0; //机内码高字节减去0xa0得到位码
pos=32*((int32)((area_h-1)*94)+area_l-1); //计算在一个完整的字库中的位置(256K)
//pos=116672; //这是“请”字在HZK16文件中的位置,单位为字节。用于测试
if(pos<64*1024) //在第一片27512芯片
{
chip=0;addr=(int16)pos;
}
else if((pos>=64*1024)&&(pos<128*1024)) //在第二片27512芯片
{
chip=1;
addr=(int16)pos;
}
else if((pos>=128*1024)&&(pos<192*1024)) //在第三片27512芯片
{
chip=2;
addr=(int16)pos;
}
else if((pos>=192*1024)&&(pos<256*1024)) //在第四片27512芯片
{
chip=3;
addr=(int16)pos;
}
select_chip(chip); //选择第chip片27512芯片
for(i=0;i<32;i++)
{
hz_buffer[i]=read_data(addr+i); //读取一字节的数据
}
}
在实际中,由于现很少采用EPROM芯片,可以用并口、SPI,I2C接口的大容量Flash、EEPROM芯片。但I2C接口速度较慢,显示汉字的速度将会很慢,可以在一些比较少字场合使用;而SPI接口的存储芯片速度较快,接口简单,对于一般的应用场合还是可以满足的;对于大量使用的场合,可以使用并行接口,它具储存空间大,读取速度快的特点,如使用AT29系列的Flash存储器,单片容量可以达到256K以上,就不需要分开存储,但其需要较多的IO口,接口复杂。所以应根据实际来选择存储器。