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

📄 pinyin.c

📁 程序是基于STC89C58的点阵屏显示程序
💻 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 + -