专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

发一个字库生成器

作者:佚名   来源:本站原创   点击数:  更新时间:2012年09月07日   【字体:

  这个生成器适用于12232液晶。暂时功能不多。也就只有倒序输出功能。输出的是16×16的点阵字符,所以也能用在LED点阵上。

使用命令:
cc foo.c -o foo

  编译。并且还需要汉字库(HZK16),我这里就不提供下载了,毕竟BYET给咱的流量是有限的,不过这种USDOS的东西一搜一大把。全部代码下载:http://www.51hei.com/f/ddcd2.rar

上代码:

/****************************************** 
 * FILE disp.c
 * @ Ubuntu Linux GCC
 * Need HZK16
 * Write By 万致远@rzy.co.cc
******************************************/ 

#include<stdio.h> 
#include <iconv.h>
#include <memory.h>
#include <string.h>
#include <stdlib.h>
FILE *fp; 
unsigned char vb;
//转换成单片机的格式
void hanzi16(char *s) 
{ 

 char buffer[32]; 
 register i,j,k; 
 unsigned char x,y,z;
 unsigned char qh,wh; 
 unsigned long location; 
 unsigned int st_len;
 unsigned char outbuf[32];
 st_len=strlen(s);
 while(*s) 
 { 
 qh=*s-0xa0; 
 wh=*(s+1)-0xa0; 
 location=(94*(qh-1)+(wh-1))*32L; 
 fseek(fp,location,SEEK_SET); 
 fread(buffer,32,1,fp); 
 for(i=0;i<32;i++)
 {
	outbuf[i]=0x00;
 }
if(vb==1) printf("/******点阵*******\n");
 for(i=0;i<16;i++) 
	{
 for(j=0;j<2;j++) 
	{
 for(k=0;k<8;k++) 
	{
    	  if(((buffer[i*2+j]>>(7-k))&0x1)!=0) 
	  {
		x=8*j+k;
		y=i;
			//printf("X=%d\n",x);
			//printf("Y=%d\n",y);
		if(y>7)
		{
			x=x+16;
			//printf("Y[FIX]=%d\n",y);
			y=(y-8);
			
		}
			y=7-y;
			outbuf[x]=outbuf[x] | (0x80>>y);	
		if(vb==1) printf("1");
	  }
	  else
	  {
		if(vb==1) printf("0");
	  }
	}
	}
	if(vb==1) printf("\n");
	}
	if(vb==1) printf("*******点阵结束********/\n");
	printf("{");
	for(i=0;i<32;i++)
	{
		if(i!=31)
		{
		printf("0x%X,",outbuf[i]);
		}
		else
		{
		printf("0x%X}",outbuf[i]);
		}
	}
 s+=2;
	if(*s!='\0')
	{
		printf(",\n");
	}
	else
	{
		printf("\n};\n");
	}
 } 
} 


int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
{
  iconv_t cd;
  int rc;
  char **pin = &inbuf;
  char **pout = &outbuf;

  cd = iconv_open(to_charset,from_charset);
  if (cd==0)
    return -1;
  memset(outbuf,(size_t)0,(size_t)outlen);
  if (iconv(cd,pin,&inlen,pout,&outlen) == -1)
    return -1;
  iconv_close(cd);
  return 0;
}

int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
 	return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}

int main(int argc,char *argv[])  
{
	char* str=0;
	if(argv[1]==NULL)
	{
		printf("//请输入字符串!\n");
		return;
	}
	if(strcmp(argv[1],"-help")==0)
	{
	printf("用法:%s <-help> <文字> <-v> > foo.c\n",argv[0]);
	printf("本软件支持16*16的中文字符输出,不支持英文。\n");
	printf("-v	控制是否在C程序中输出点阵字\n");
	printf("-help	用于显示本帮助信息\n");
	printf("本软件运行需要HZK16的支持.\n");
	printf("BUG反馈:http://www.rwzy.co.cc\n");
	printf("	dv.xw@qq.com\n");
	printf("万致远		 2012.8.5\n");
	return;
	}
	vb=0;
 	if((fp=fopen("HZK16","rb"))==NULL) 
	{ 
	printf("//无法打开HZK16文件,请检查!\n"); 
	return;
	} 
	printf("/*---------------------\n");
	printf("生成的以下字的字库:%s\n",argv[1]);
	str=(char*)realloc(str,strlen(argv[1])+1);
	printf("字库由万致远HZK软件建立。");
	if(argv[2]!=NULL)
	{		
		if(strcmp(argv[2],"-v")==0)
		{
		printf("使用点阵显示模式\n");
		vb=1;
		}
	}
	printf("HZ就是您需要的汉字库\n----------------*/\n");
	printf("unsigned char __code HZ[][32]={\n");//一个汉字32字节
	u2g(argv[1],strlen(argv[1])+1,str,strlen(argv[1])+1);//strlen(argv[1])+1
	hanzi16(str);//转换格式
	fclose(fp); 
}
关闭窗口

相关文章