📄 pinyin.c
字号:
#include"reg51.h"
#define baseaddr 0x1f36f0;//0; //根据字库芯片的实际地址进行修改(见数据手册)
// 读字库芯片****************************************
extern void sendcmd(unsigned char cmd);
extern void sendaddress(unsigned long address);
extern void Readtodisp_hanzi(unsigned char *hzstr);
extern void write_eight_byte(unsigned char *p,unsigned char ADDRH);
extern unsigned char read_eight_byte(unsigned char *p,unsigned char ADRH);
sbit GT32_CS=P1^4; //字库芯片使能
sbit GT32_CLK=P1^5; //字库芯片时钟线
sbit GT32_SI=P1^7; //字库芯片输入数据线
sbit GT32_SO=P1^6; //字库芯片输出数据线
unsigned char readbyte(unsigned long adrr);
void pyInit();
void Input_py(char *tmppy);
void locate_hz();
void Pre_hz();
void Next_hz();
typedef struct {
unsigned char py[6]; //拼音 (6BYTE)
unsigned short begin; //对应的码表起始序号 (2BYTE)
} PYCODETABLE ; // (8BYTE)
xdata int pyfd; //拼音码表句柄
unsigned short xdata pysum; //拼音组合的个数
unsigned short xdata hzsum; //码表中的汉字个数
unsigned short xdata pyidx[26]; //以26 个英文字母开头的拼音串索引
unsigned short xdata pyseek; //拼音查找的开始位置 ,移动指针用
unsigned short xdata next_pyseek=0;
unsigned short xdata firsthz=0; //第一个汉字所在位置,为了用hzseek 计算最后一个拼音的汉字个数
unsigned short xdata hzseek=0x2000; //汉字查找的开始位置,curhz 移动指针用
unsigned char xdata curhz=0; //当前显示汉字的号,上下移动距离为hzdispwin
unsigned char xdata maxcurhz=0; //当前拼音的最大汉字数
extern unsigned char xdata hzstring[8]={0xa1,0xa3,0xb2,0xd1,0xb0,0xd8,0xb1,0xd8}; //保存汉字内码,大小应为hzdispwin*2+1//汉字显示个数MAX=10 个
extern unsigned char hz_dis[3][8]={0xa1,0xa1,0xa1,0xa1,0xa1,0xa1,0xa1,0xa1,0xa1,0xa1,
0xa1,0xa1,0xa1,0xa1,0xa1,0xa1,0xa1,0xa1,
0xa1,0xa1,0xa1,0xa1,0xa1,0xa1};
unsigned char page=0;
unsigned char hz_dis_geshu[3]={0x00,0x00,0x00};
unsigned xdata byte=0;
void readonebyte()
{
unsigned char xdata j,DATA=0;
GT32_CS=0;
GT32_CLK=1;
for(j=0;j<8;j++)
{
GT32_CLK=0;
if(GT32_SO)
DATA=DATA|0x01;
else DATA=DATA|0x0;
GT32_CLK=1;
if(j!=7) DATA=DATA<<1;
}
byte=DATA;
GT32_CS=1;
}
unsigned char readbyte(unsigned long adrr)
{
sendcmd(0x03);
sendaddress(adrr);
readonebyte();
return(byte);
}
///////////////////////////////////////////////
// 初始化,读入拼音码表 //
///////////////////////////////////////////////
void pyInit()
{
short xdata i;
unsigned long xdata addr=0x0000;
PYCODETABLE py;
unsigned char xdata bytmp;
//unsigned short wdtmp;
addr=0x0000+baseaddr; //pysum 拼音组合数(2BYTE)
bytmp=readbyte(addr++);
pysum=bytmp;
pysum=pysum<<8;
bytmp=readbyte(addr);
pysum=pysum+bytmp;
addr=0x0002+baseaddr; //hzsum 读入汉字组合数(2BYTE)
bytmp=readbyte(addr++);
hzsum=bytmp;
hzsum=hzsum<<8;
bytmp=readbyte(addr);
hzsum=hzsum+bytmp;
addr=0x0004+baseaddr; //以26 个英文字母开头的拼音串索引(26*2=52BYTE)
for(i=0;i<26;i++)
{
bytmp=readbyte(addr++);
pyidx[i]=bytmp;
pyidx[i]=pyidx[i]<<8;
bytmp=readbyte(addr++);
pyidx[i]=pyidx[i]+bytmp;
}
pyseek=pyidx[0]; //拼音查找的相对开始地址 ,移动指针用
addr=pyseek+baseaddr; //初始化时索引到第一字母“a”地址(初始值)
for(i=0;i<6;i++)
{
py.py[i]=readbyte(addr++);
}
bytmp=readbyte(addr++);
py.begin=bytmp;
py.begin=py.begin<<8;
bytmp=readbyte(addr++);
py.begin=py.begin+bytmp;
firsthz=py.begin;
}
///////////////////////////////////////////
// 进行拼音串的处理 //
///////////////////////////////////////////
void Input_py(char *tmppy) //tmppy 拼音串为小写a-z 的组合. 若全局变量maxcurhz 为0 说明拼音串非法,无相应汉
{
short i,j;
PYCODETABLE py;
unsigned long addr=0;
unsigned char pylong=0;
unsigned char bytmp=0;
unsigned char k=0,t=0;
curhz=0;
maxcurhz=0;
//拼音串已录入到tmppy 中,且长度不大于6,大于6 的将无法找到拼音
if(tmppy[0]=='\0') //空返回
{
maxcurhz=0;
return;
}
for(i=0;i<7;i++)
if(tmppy[i]!='\0')
pylong++;
pylong++;
i=tmppy[0]-'a'; //声母索引
pyseek=pyidx[i]; //第一次索引
if(i=='v'-'a') return;
else if(i==25) //最后一个字母
next_pyseek=firsthz;
else if(i=='h'-'a') next_pyseek=pyidx[i+2]; //h后面的i,没有以i的声母
else if(i=='t'-'a') next_pyseek=pyidx[i+3]; //t后面的u,v,没有以u,v开头的声母
else
next_pyseek=pyidx[i+1];
//根据拼音串的第一个字母确定查找的拼音串 //第二次索引
for(;pyseek<=next_pyseek;pyseek=pyseek+8)
{
addr=pyseek+baseaddr;
for(j=0;j<6;j++)
py.py[j]=readbyte(addr++);
for(k=0;k<pylong;k++)
{
if(py.py[k]!=tmppy[k])//||py.py[k]=='\0')
break;
}
if(k==pylong)
{
break;
}
}
if(pyseek<next_pyseek) //找到了相应的拼音串,确定汉字位置及发此音的汉字个数
{
bytmp=readbyte(addr++);
py.begin=bytmp;
py.begin=py.begin<<8;
bytmp=readbyte(addr++);
py.begin=py.begin+bytmp;
hzseek=py.begin;
if(pyseek<firsthz-8) //非最后一个拼音,可通过索引确定汉字个数
{
addr=addr+6;
bytmp=readbyte(addr++);
py.begin=bytmp;
py.begin=py.begin<<8;
bytmp=readbyte(addr);
py.begin=py.begin+bytmp;
maxcurhz=(py.begin-hzseek)>>1;
}
else //最后一个拼音的汉字个数
maxcurhz=hzsum-((hzseek-firsthz)>>1);
}
else
{
//无此拼音组合
maxcurhz=0;
return;
}
}
/////////////////////////////////////////////////////////////////////
// 取汉字后更新当前页内容hzstring[] //
////////////////////////////////////////////////////////////////////
void locate_hz()
{
short i=0,m=0;
unsigned char *wrstring=0;
unsigned long xdata addr;
wrstring=hzstring;
for(i=0;i<8;i++)
*(hzstring+i)=0xa1;
for(i=curhz,m=0;i<maxcurhz && m<4;i++,m++)//约束在显示范围内的处理m<hzdispwin
{
addr=hzseek+i*2+baseaddr;
*wrstring=readbyte(addr++);
wrstring++;
*wrstring=readbyte(addr++);
wrstring++;
}
}
//查找拼音串pyasc[7]对应的汉字
void pinyinchazi(unsigned char *py)
{
Input_py(py);
locate_hz();
Readtodisp_hanzi(hzstring);
}
/////////////////////////////////////////////////////////////////////////
// 取汉字向回翻屏后更新页内容hzstring[] //
/////////////////////////////////////////////////////////////////////////
void Pre_hz()
{
if(curhz<4) //已翻到头
return;
curhz-=4;
locate_hz();
Readtodisp_hanzi(hzstring);
}
/////////////////////////////////////////////////////////////////////////
// 取汉字向后翻屏后更新页内容hzstring[] //
////////////////////////////////////////////////////////////////////////
void Next_hz()
{
if(curhz+4>=maxcurhz) //已是最后一屏
return;
curhz+=4;
locate_hz();
Readtodisp_hanzi(hzstring);
}
void Choose_hz(unsigned char no)
{
if(hz_dis_geshu[page]<4)
{
hz_dis[page][hz_dis_geshu[page]*2]=hzstring[no*2];
hz_dis[page][hz_dis_geshu[page]*2+1]=hzstring[no*2+1];
hz_dis_geshu[page]++;
}
Readtodisp_hanzi(hz_dis[page]);
write_eight_byte(hz_dis[page],(0xee+page*2));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -