這個生成器適用于12232液晶。暫時功能不多。也就只有倒序輸出功能。輸出的是16×16的點陣字符,所以也能用在LED點陣上。
使用命令:
cc foo.c -o foo
編譯。并且還需要漢字庫(HZK16),我這里就不提供下載了,畢竟BYET給咱的流量是有限的,不過這種USDOS的東西一搜一大把。全部代碼下載:http://m.raoushi.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);
}
