C语言编写16和32点阵字库

作者&投稿:仲长枯 (若有异议请与网页底部的电邮联系)
为什么在16*16点阵字库中,存储一个汉字的字模信息为什么需要32个字节?~

一个十六点阵的字库字模,是由16*16个点组成的,一个点可以用一“位”来记录,所以在这个16行16列的点阵中,一行需要16位也就是2个字节来记录,共16列,需要16*2个字节也就是32个字节来记录一个字模。

到目前为止,我们编写的C 程序,其用于人机交互的提示或菜单都是英文
的,那么如何在没有汉化的Turbo C 集成开发环境下编制显示汉字的程序呢?

解决这一编程问题,我们首先必须了解有关汉字编码及字库的知识。根据对汉字使
用频率的研究,可把汉字分成高频字(约100 个),常用字(约3000 个),次常用字(约4000 个),
罕见字(约8000 个)和死字(约45000 个),即正常使用的汉字达15000 个。我国1981 年公布
了《通讯用汉字字符集(基本集)及其交换码标准》GB2312-80 方案,把高频字、常用字、和
次常用字集合成汉字基本字符集(共6763 个),在该集中按汉字使用的频度,又将其分为一
级汉字3755 个(按拼音排序)、二级汉字3008 个(按部首排序),再加上西文字母、数字、图
形符号等700 个。

汉字编码:

区位码

国家标准的汉字字符集(GB2312—80)在汉字操作系统中是以汉字库的形式提供的。汉
字库结构作了统一规定,即将字库分成94 个区,每个区有94 个汉字(以
位作区别)每一个汉字在汉字库中有确定的区和位编号(用两个字节),这就是所谓的区位码
(区位码的第一个字节表示区号,第二个字节表示位号,因而只要知道了区位码,就可知道
该汉字在字库中的地址,每个汉字在字库中是以点阵字模形式存储的,如一般采用16×16
点阵形式,每个点用一个二进位表示,存1 的点,当显示时,可以在屏上显示一个亮点,存
0 的点,则在屏上不显示,这样把存某字的16×16 点阵信息直接用来在显示器上按上述原
则显示,则将出现对应的汉字。

内码
汉字使用两字节表示,国家制定了统一标准,称为国标码。国标码规定,每个字节使用
后面7 位,第一位为0。为了区别于英文的ASCII 码,国标码在计算机上使用的时候,规定
汉字每个字节第一位设置为1,以表示该两字节为汉字,称为内码。以“大”字为例子:
国标码3473H: 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 1
内码B4F3H: 1 0 1 1 0 1 0 0 1 1 1 1 0 0 1 1
国标码与内码有一定的转换公式,即16 进制的区位码,两个字节各加80H,就成为了
国标码。
汉字字模在字库中存放的位置根据汉字的区位码来确定,内码是汉字在机内的表示。由
于区位码和内码存在固定的转换关系,所以当在支持汉字输入的系统中,键盘输入的汉字内
码即在程序中存在,将其转换为区位码,再从字库中找到对应的汉字字模,然后再用有关的
位操作和循环语句,对每个字节的每一位进行判断,如同过滤一样,如果某位是1,则按设
置的颜色在屏幕的相应位置画点(用graphics.h 中的显示象素点的函数putpixel()),若某位
为0,则不画点,这样就可按预先设置的颜色在相应位置显示出该汉字来。

内码到区位码的转换
若汉字内码为十六进制数h2h1l2l1,则区号qh 相位号wh 分别为:
qh= h2h1-0xa0;
wh= l2l1-0xa0;
若用十进制表示内码为dld2,则
qh=dl-l60;
wh=d2-160;
即区位码qw 为:
qw=100*(d1-160)十(d2-160);
反过来,若已经知道了区位码qw。则也可求得区号和位号:
qh=qw/100;
wh=qw-100*qh;
因而该汉字在汉字库中离起点的偏移位置(以字节为单位),可计算为:
offset=(94*(qh-1)+(wh-1))* 32;
注意:字库中每1 区有94 个字符。
这样,就可以找寻到文件的偏移量,读出一个char bytes[32]数组。这样bytes 数组中则
存了要显示汉字的16×16 点阵字模,然后将字模按行扫描的办法,通过循环用putpixel()函
数在屏幕设定位置显示出象点,因而组合成一个显示的汉字。

CFont ft;
ft.CreatePointFont(90,_T("宋体")); //做点阵字体。 90 所需字体高度(用0.1点表示,例如,传递120表示12点字体)。
DC.SelectObject(&ft);
DC.DrawText((LPCTSTR)str,str.GetLength(),&rt,DT_LEFT);把你要的字写入一个DC

然后用GetPixel得到dc的点阵结构 至于怎么存储就看怎么使用了

去网上查查看 摇头专门的点阵软件


汇编语言:计算机中,什么使用16位寻址,32位寻址,这个多少位寻址是什么意...
而16位寻址,指的是CPU的寻址能力,一般由其数据总线根数决定,如8086有20位地址总线,地址范围为1M字节单元,但CPU是16位的,因此需分段处理。32位寻址则其CPU的数据总线应是32位的,一次性可寻址范围为2的32次方,也就是4G了。

汇编语言中中碰到一个数怎么知道它是16位的还是32位的是字节还是字?例...
一个是立即数,比如1234H,就是字,08H,就是字节 另一个是看操作的寄存器是什么位的,AL,就是字节,AX,就是字,EAX就是32位

c语言数据长度16位和32位什么意思?
16位是指操作系统所能表示最大整数由16个二进制数表示,即65536,32位所能表示的能达到4294967296,现在已经有64位的了,而且未来的计算机都将趋于64位。也就是表示数据范围大,对于大型工程能够好的表示。

16\/32位汇编语言中" in al ,dx"啥意思
IN AL,DX:DX是源操作数。AL是8位寄存器,作为目的操作数,IN指令是端口操作指令。作用:将源操作数代表的端口的内容送给目的操作数,所以整条指令是将端口的内容送给AL寄存器。

16\/32位微机原理汇编语言及接口技术习题
si 加2 那个长度应该是原有的二倍 每个单元可以转换成两个码 mov AL,[si]第一个码应该是,右移四个味,40H应该是数字“0”的ASCII码,把那个字节的数字加40H,放到block 区就可以了 di+1 第二个码,和0FH与运算,把高四位去掉,然后加40H,放到那个区就行了 然后 si +1 di +1 C...

汇编语言中的CPU的16位,32位和当今操作系统所指的32位,64位概念有点...
事实上64位上的RAX名称只是汇编语言中的一个助记标,它与寄存器的关系非常小的,至于叫RAX还是你想叫EEAX,那只是一个名字而已,主要是为了人们交流而已,只不过汇编语言也采用了这种人们交流的名称。不要以为计算机会知道它自己一个寄存器叫RAX,它只认识二进制编码,所以在计算使用时0001对应了AX,EAX,...

请编写程序从P1.1引脚输出16个脉冲,占空比无要求!汇编语言
ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV R2,#16 LOOP:CLR P1.1 MOV R3,#250 DJNZ R3,SETB P1.1 MOV R3,#250 DJNZ R3,DJNZ R2,LOOP SJMP END

请问既然学习了王爽的《汇编语言》为什么还要学习《windows环境下32位...
王爽书中的汇编语言,是16位实模式下的汇编语言。罗云斌的书讲的是工作在32位环境下保护模式的汇编。时至今日,传统的dos时代已经过去了。很少应用程序还设计为工作在16位环境下。大部分都工作在32位环境下。而16位和32位是两码事,16位中是调用各种中断完成功能,但在32位保护模式中,这是非法指令,...

汇编语言程序设计 题目一 用16位乘法指令完成32位无符号数的乘法(结果...
mov [HFLS+2],dx ;存取高位*低位的结果。下同,不再写了 mov ax,[first+0] ;mov bx,[second+2] ;同上 mul bx mov [LFHS+0],ax mov [LFHS+2],dx ;mov ax,[first+2] ;mov bx,[second+2] ;同上 mul bx mov [HFHS+0],ax mov [HFHS+2],dx ;mov ax,[LFLS+...

C语言16位指针如何指向32位有符号数的高16位,谢谢,急!!!
32位) int ph=(pp>>16);\/\/右移2字节取高16位 int pl=pp&0xffff;\/\/掩码遮蔽掉高16位取低16位 cout<<hex<<pp<<endl;\/\/输出指针值为110f7e4 cout<<hex<<ph<<endl;\/\/输出拆分后的高16位地址值为110 cout<<hex<<pl<<endl;\/\/输出拆分后的低16位地址值为f7e4 希望能帮到你。

德令哈市19793668288: 急!!C语言编写 汉字点阵字库 -
謇榕鲑降: /* 以下是 '谢' 的 16点阵宋体 字模,32 byte */0x01,0x08,0x42,0x08,0x37,0x88,0x24,0x88,0x07,0xFE,0x04,0x88,0xE7,0xC8,0x24,0xA8,0x2F,0xA8,0x21,0x88,0x22,0x88,0x2A,0x88,0x34,0x88,0x28,0x88,0x12,0xA8,0x01,0x10, }; /* 以下是 '佳' ...

德令哈市19793668288: 16X32点阵显示c语言程序怎么写 -
謇榕鲑降: 这是 和嵌入式有关的,有2种方法,最简单一种就是下载一个点阵生成器,他会把你输入的字符,图像转换成二级制代码,就可以在屏幕输出了.

德令哈市19793668288: 用C语言编程16点阵字库 -
謇榕鲑降: #include <stdio.h> #include <alloc.h> #include <ctype.h> #include <dos.h> #include <dir.h> #include <io.h> #include <graphics.h> #define GETADR(n,str) (str *) calloc (n,sizeof(str)) // 申请N个指定字符串长度的地址 #define W16 16 #define C16 32 ...

德令哈市19793668288: 急!C语言编写 汉字点阵字库 '罗' '恒'这两个字 -
謇榕鲑降: #include <stdio.h>// 每个汉字的水平点数 const int WIDTH = 24;// 每个汉字的垂直点数 const int HEIGHT = 24;/*// 方案1 :每个汉字的笔画 const char FRONT_COLOR[]="■";// 方案1 :每个汉字的背景 const char BACKGROUND_COLOR[]=...

德令哈市19793668288: C语言设计汉字点阵字库 -
謇榕鲑降: 用C\C++都可吧 liubaoxinggo1986@126.com发过来,我看看 互学互探讨,要什么RMB

德令哈市19793668288: 如图,要想点阵能显示汉字并左移,用C语言应如何编程? -
謇榕鲑降: C语言中,汉字是储存在汉字库里的.每个汉字在字库中以点阵字模形式存储,一般采用16*16点阵形式,每个点用一个二进位表示,存1的点,当显示时,可以在屏上显示一个亮点,存0的点,则在屏上不显示,这样把存某字的16*16点阵信息...

德令哈市19793668288: 有关c语言点阵的一道编程题 -
謇榕鲑降: #include<stdio.h> void main() { FILE *fp; unsigned char buffer[12],s[20],c; int i,j;if ( fp=fopen("ASC12.fon","rb") ) {printf("Please input a char:"); scanf("%s",s); c=s[0];fseek(fp,c*12L,SEEK_SET); fread(buffer,12,1,fp);fclose(fp);for ( i=0;...

德令哈市19793668288: c语言考试编辑程序用*输出汉字浩 -
謇榕鲑降: 思路:楼主你去百度下【HZK16】汉字库 然后,你可以通过汉字码得到他的字模库 字模库是一个16*16位的矩阵【32字节】 得到这个字模库之后,你对他按位操作,如果位为0,不输出【*】,位为1,则输出【*】即可. 下面是我以前研究汉字...

德令哈市19793668288: 如何用c语言写16*16点阵显示汉字的程序 -
謇榕鲑降: 楼主没说清楚啊,你是用点阵led还是用lcd,用lcd的话支不支持汉字库.如果是用led就自己把汉字图像一行一行的发过去,不支持字库的lcd,设置lcd为图像模式,按图像发过去,支持...

德令哈市19793668288: 16*16点阵LED显示 C语言程 74HC154 -
謇榕鲑降: 当初的读点阵显示汉字的程序: int out16hz(int x, int y, int color, char *p) {Word i, QM, WM, f=0;int record, i1, i2, i3;long pointer;char Bit[32];while ((i=*p++) != 0){if (f == 0){if (i < 128) /*显示ascii码*/{pointer = i * 16L;lseek(flagasc, pointer, ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网