怎样把一个汉字的点阵码取出来.doc_第1页
怎样把一个汉字的点阵码取出来.doc_第2页
怎样把一个汉字的点阵码取出来.doc_第3页
怎样把一个汉字的点阵码取出来.doc_第4页
怎样把一个汉字的点阵码取出来.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

怎样把一个汉字的点阵码取出来?我要把汉字显示在LED上我以前回过的一个类似贴 /Expert/topic/3453/3453150.xml?temp=.6769373 汉字库我用的是UCDOS的HZK16,直接导入了ROM他说的仅仅是取点阵码而已。 用软件就不必说了,那太多了。 用程序来: 在一块MemDC上写上汉字, 弄到合适大小。 然后GetPixelCDC memDC; CBitmap memBmp; CBitmap *pOldBmp; memDC.CreateDC(.);/创建DC(“画图工具”) /创建“画布” /画布大小为LED点阵大小,用黑白两色的那种画布 memBmp.CreateBitmap(.); pOldBmp = memDC.SelectObject(&memBmp);/选择新的画布,保存旧的 /还可以新建字体CFont,来创建你需要的字体 /. memDC.DrawText(.);/写入文字 for(int i=0; i nWidth; i+) for(int j=0; j 0)/好像非0是白色的,0 是黑色的,正好相反 else /点亮LED上对应的点 memDC.SelectObject(pOldBmp); memBmp.DeleteObject(); memDC.DeleteDC();听说还有一种方法的,但我只知道大致思路,其实也是系统显示字体的方式,就是根据汉字的内码对系统字库本身进行寻址获取其点阵信息,寻址方式有一定的规律,内码的高低位通过一个公式运算后获得,具体公式忘记了汉字的区位码和其在汉字库中的偏移量关系如下(HZK16为例): lOffset = ( (区码 - 1) * 94L + (位码 - 1) ) * 32L汉字点阵与编码-写大字2007-09-25 23:14有关库文件准备: 12点阵或者16点阵的汉字库文件.。扩展名是 fon。我这里也有,如果需要可以和我联系。注意库文件和输入点阵数的匹配!#include#include#include#define reglen 94 /每区(行)有94位(列)#define subcode 0xa0 /内码与区位码的差值/*#define font_size 16 /点阵的数目/根据字体库进行更改#define dotsize font_size*font_size/8 /一个汉字点阵所占的字节数char font_file_name=16dot.fon; /点阵字库文件名,必须与字体大小匹配char bindotdotsize; /存储点阵信息的数组*/char str2,ch;int font_size,dotsize;void printcharbindot(char *bindot,int dotlen);int main()char font_file_name30;printf(输入字体点阵数:(12或16):n);scanf(%d,&font_size);printf(输入文字库文件的路径(如果在同目录可只输入文件名):n);scanf(%s,font_file_name);dotsize=(font_size*font_size/8);#if(font_size=12)char bindot12*12/8;#elsechar bindot16*16/8;#endifFILE *fp=fopen(font_file_name,r);ch=getchar();printf(输入任意中文文本:n);while(ch=getchar(),ch!=n) str0=ch; ch=getchar(); str1=ch; int string_size=font_size*font_size; int i=0,j=0; unsigned char regcode; /区码 unsigned char bitcode; /位码 /计算区位码 regcode=(unsigned char)stri-subcode; bitcode=(unsigned char)stri+1-subcode; /计算汉字在字库中的位置 int offset=(regcode-1)*reglen+bitcode-1)*dotsize; /在字库文件中读取点阵数据 fseek(fp,offset,SEEK_SET); fread(bindot,sizeof(bindot),1,fp); /输出 printcharbindot(bindot,dotsize); for(i=1;i=font_size;i+) printf(-); printf(n);fclose(fp);system(pause);return 0;/按顺序输出点阵的每一位信息void printcharbindot(char *bindot,int dotlen)int charnum=0; /当前字节号int bitnum=0; /已读取的位数int bitindex=0; /当前位号int bitvalue; /当前位的值for(charnum=0;charnum=0;bitindex-) /输出当前字节第bitindix位的值 bitvalue=(bindotcharnumbitindex)&0x1); if(bitvalue=1) printf(*); else printf( ); /printf(%c,bitvalue+0); /一行输出完了换行 if(+bitnum%font_size)=0) printf(n); return;欢迎大家提出你们宝贵的意见或建议。标签: 嵌入式中文stm32如何在液晶屏上显示汉字?1、汉字的点阵码我现在知道的是:(1)汉字可以以点阵的形式存储。(2)液晶可以在屏上画点。这两者结合起来就可以在液晶屏上显示汉字。最简单的方法,可以在程序中事先存储号点阵码的字符,然后要用的时候显示出来。举个例子,小这个汉字,它的点阵码是这样的:它对应的点阵字符码是:0x01,0x00,0x01,0x00,0x01,0x00,0x01, 0x00,0x01,0x00,0x05,0x40,0x05,0x20, 0x09, 0x10,0x09,0x08,0x11,0x04,0x21, 0x04,0x41,0x00,0x01,0x00,0x01,0x00, 0x05,0x00,0x02,0x00共32个字节,其扫描的顺序是从左到右,从上到下。在显示的时候,再把字符点阵按相同的顺序显示在液晶屏上,就看到了小字。2、中文文档的存储方式那么我们看到的中文文档,它们全部都是存储的这种点阵码吗?不是的。汉字在计算机内容实际是存储的一种特定编码。比如“小”这个字,在文档内我们在对应位置看到的可能是“D0 A1”,也可能是“5C 0F”,也就是可以有不同的编码表示“小”这个汉字,这就是汉字的编码方式。我现在听过的概念有:区位码、国标码、内码、unicode、UTF-8,还有GBK、GB2312(这两个好像与国标码是相关的,具体怎么对应,我的理解还不是很清晰)。除了UTF-8适合在网络上传输,这里不管它。其它几种编码方式都是16位的,其大致关系如下:内码 = 国标码 + 0x80; 国标码 = 区位码 + 0x20;国标码 = GB2312; GBK好像是国标码的最新扩展。汉字在计算机内部文档里面一般是以内码的形式存储。而文件系统里中文文件名一般以unicode编码的形式存储。以上这些理解不知对不对?再去百度一下加深对这些概念的理解。GB2312、GBK都是中文的内码,GB18030好像是最新的扩展(还包括了少数名族的字符),Big5是繁体汉字的内码。嵌入式系统上一般用GB2312就行了。“D0 A1”就是:“小”的内码,是一种GB2312码,当然由于GBK、GB18030的继承性,同样的汉字其编码是一样的。3、中文字库的作用当计算机程序读取一个中文文档时,它读到的是内码,为什么能够在屏幕上显示其字形呢?方法是在计算机内部存储了一个汉字字库,存储了大部分汉字的字形点阵。而且对于每一个汉字来说,它在字库里点阵的位置 与其 内码存在着一一对应关系。也就是说只要知道了内码,就可以在字库文件里找到其点阵码,然后进行显示。GB2312型的内码是通过以下的换算找到其在字库中的位置的,以“小”字为例:它的内码是“D0 A1”,别减去“A0 A0”得到其区位码,“30 01”。字库的组织方式就是根据区位码排列的,在0x30区,序号29,每个区94个汉字,一次其序号为:(0x30-1)*94 + (01-1)。当然从字节的存储位置来说,还要乘以32,(每个汉字16*16点阵,占据32个字节),综合起来,公式可以写成:CharPos = ( (NH-0xA1)* 94 + ( NL-0xA1) )* 32。我现在也不能完全确认这就是对的,我在网上下了UCDOS的HZK16文件,很快就要编写一个测试程序来检验。4、我们在键盘上是怎么样输入汉字的实际上我们在键盘上的 “键入组合”,在“中文输入法”的干预下,将被转换为内码。好像有的时候,这种键入组合也可以称之为外码。比如,我们怎么样在键盘上输入汉字“小”呢?以最常用的拼音输入法为例,我们要一次键入“xiao”四个字符,这个应该就叫做“外码”,当时起主导作用的输入法通过“查表”或“其它算法”,将这个组合方式转变成了“小”字的内码“D0 A1”存储在文件内,或在计算机上传输。比如串口,你输入“小”的时候,串口实际发出的是“A1”,“D0”。(小端字节应该是这样发的吧)。5、第一个测试程序的规划添加一个命令mctest,STM32开发接受到这个命令后,等待串口终端的输入。若输入一个汉字,则命令处理程序打开汉字库文件,找到点阵码,在液晶上显示汉字。若输入英文字符,也要能显示英文。当按下“ESC”键的时候,命令处理程序退出。标签: stm32液晶中文汉字显示的测试程序1、程序框架的修改我编写程序都是积累式的,以前曾经编写过五个按键输入、液晶作为显示终端的命令输入界面。这个界面一直是有效的,现在汉字显示要使用液晶屏,所以要经过一些修改。修改的地方如下:(1)主程序占用了液晶的一行,写液晶的那句话注释掉。/ Shell_PutStrPC(0,0,Str,Yellow,Black); /不要占据屏幕了(2)键盘、液晶命令界面的主任务删除掉。实际就是不创建这个任务了。/OSTaskCreate(Task_CmdShell,(void *)0,&Task_CmdShellStkTaskStk_Size-1,Task_CmdShell_Prio);/该任务暂时不需要了。(3)在键盘扫描任务中,使读键子程序总是返回0(不管有没有按键)KeyCurrent=GetKeyState();/总是返回0(4)在无按键输入处理流程中,将关闭液晶显示的指令去掉因为在以前的程序中,当一分钟左右没有按键输入的时候,系统会自动关闭液晶显示(模拟手机的模式),现在要注释掉。/ DisplayOn=0; /不要关闭屏幕/ LCD_DisplayOff();再次编译下载,成功。液晶现在可以自由使用了。2、mctest命令处理程序框架的编写修改支持命令个数的常数、添加命令字符串、初始化命令表的新命令、在输入命令文件中添加新命令、在Help命令处理程序中添加新命令显示、写新命令函数定义(暂时空着),编译下载,一个新的命令就添加成功了。这次又要支持很多的命令,故工程中新增加一个文件media.c,用于处理多媒体相关的命令。3、mctest命令处理程序内容的设计处理程序进入一个循环,不断的接收从串口过来的字符。如果是“ESC”键按下( 0x1B ),则跳出循环。定义一个标志字符,当接收到ESC时,设置标志为1。采用 do while循环结构。定义两个字符变量,接收一个字符后进行判断。如果小于0x80,说明是普通的ascii码,进行相应处理。如果大于0x80,判断是否DBCS的第一个字节。接收第二个字节,同时判断是否DBCS第二字节,如果满足条件,计算出对应汉字在字库文件中对应的存储位置。打开字库文件,定位到存储位置,读取32个字节存入缓冲区。然后调用液晶显示程序显示汉字。do Char1 = Uart_GetChar ( ); /这个字符是从串口字符队列中取得的。 if ( Char1 0x80 ) if ( Char1 = 0x1B ) break; /退出输入模式 else if ( Char1 = b ) /处理退格命令 else if ( Char1 = r ) continue; /r跳过不处理,只处理n else if ( Char1 = n ) /处理换行 else if ( ISPRTCHAR ( Char1 ) ) /是可打印字符 Shell_PutChar ( Char1 ); else /其它控制字符不处理,显示一个空格 Shell_PutChar ( x20 ); else if ( !ISDBCS1(Char1) ) break;/是否DBCS的低字节 else Char2 = Uart_GetChar ( );if ( !ISDBCS1(Char1) ) break; /是否DBCS的高字节DBCSFlag =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论