这个生成器适用于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);
}
