汉字的显示与放大PPT课件

上传人:仙*** 文档编号:182051080 上传时间:2023-01-19 格式:PPT 页数:50 大小:443KB
收藏 版权申诉 举报 下载
汉字的显示与放大PPT课件_第1页
第1页 / 共50页
汉字的显示与放大PPT课件_第2页
第2页 / 共50页
汉字的显示与放大PPT课件_第3页
第3页 / 共50页
资源描述:

《汉字的显示与放大PPT课件》由会员分享,可在线阅读,更多相关《汉字的显示与放大PPT课件(50页珍藏版)》请在装配图网上搜索。

1、2023-1-191汉字的编码汉字的编码用作图方式显示和放大汉字用作图方式显示和放大汉字直接写直接写VRAM显示汉字显示汉字2023-1-192第一节、汉字的编码第一节、汉字的编码汉字的主要编码汉字的主要编码区位码区位码国标码国标码机内码机内码字形码字形码地址码地址码2023-1-193汉字数目众多(康熙字典收录汉字数目众多(康熙字典收录47000多个),多个),但最但最常用的高频字仅约常用的高频字仅约100个,常用字约个,常用字约3000个,次常用字约个,次常用字约4000个,罕见字约个,罕见字约8000个个,其余都是死字。,其余都是死字。1981年,我国公布了通讯用汉字字符集年,我国公布了

2、通讯用汉字字符集(基本集)及其交换码标准(基本集)及其交换码标准GB2312-80方方案,把高频字、常用字、次常用字汇集起来案,把高频字、常用字、次常用字汇集起来组成了汉字基本字符集(共组成了汉字基本字符集(共6763个汉字)。个汉字)。概概 述述2023-1-194上述上述基本字符集基本字符集由三部分组成:由三部分组成:一级汉字一级汉字(使用频度较高的使用频度较高的3755个个汉字汉字,按拼音排序,按拼音排序)二级汉字二级汉字(使用频度略低的使用频度略低的3008个个汉字汉字,按部首排序,按部首排序)西文字符、数字、图形符号西文字符、数字、图形符号(700多个非汉字字符多个非汉字字符)为管理

3、方便,将上述所有字符排列在了一个为管理方便,将上述所有字符排列在了一个94*94的表格中的表格中一、汉字的区位码一、汉字的区位码2023-1-195一、汉字的区位码一、汉字的区位码010203161718565701 02 03 04 0506 07 08 09 10 11 1213 14 15 94942023-1-196表中每一行为一个表中每一行为一个区区,每一列为一个,每一列为一个位位。汉字(字符)在表中的区号和位号构成了汉汉字(字符)在表中的区号和位号构成了汉字的字的区位码区位码。例如:例如:“啊啊”在在16区区01位,故位,故“啊啊”的区位码是的区位码是1601“大大”在在20区区8

4、3位,故位,故“大大”的区位码是的区位码是2083说明说明:区位码常以十六进制表示:区位码常以十六进制表示,如:如:1453H一、汉字的区位码一、汉字的区位码2023-1-197二、汉字的国标码二、汉字的国标码计算机要处理汉字,必须给每个汉字一个计算机要处理汉字,必须给每个汉字一个唯一的编码,这些编码是国家唯一的编码,这些编码是国家机构按机构按统一统一标准标准编排的编排的,故称,故称国标码国标码。英文字符是用一个字节编码英文字符是用一个字节编码的,即的,即ASCII码,而汉字数量众多,需要用两个字节才码,而汉字数量众多,需要用两个字节才足以完成编码,所以汉字足以完成编码,所以汉字(含前(含前1

5、5区的符区的符号)号)的的国标码是两个字节国标码是两个字节。2023-1-198二、汉字的国标码二、汉字的国标码国标码的两个字节是这样来的:将汉字(国标码的两个字节是这样来的:将汉字(含含前前15区的符号)的区号和位号分别加上区的符号)的区号和位号分别加上32 并并各用一个字节表示出来。各用一个字节表示出来。例如例如:“啊啊”的区号是的区号是16,位号是,位号是1,其国标码是:,其国标码是:00110000 00100001“大大”的区号是的区号是20,位号是,位号是83,其其国标码是:国标码是:00110100 011100112023-1-199二、汉字的国标码二、汉字的国标码提示:提示:

6、汉字汉字区号、位号最大是区号、位号最大是9494+32=126,不超过,不超过127 如:设如:设94区区94位有汉字,其国标码应为:位有汉字,其国标码应为:01111110 01111110结论:结论:国标码的两个字节国标码的两个字节的的最高位都是最高位都是02023-1-1910三、汉字的机内码三、汉字的机内码 每个汉字都有唯一一个国标码,按说可以用计算机每个汉字都有唯一一个国标码,按说可以用计算机处理汉字了,但不幸的是,计算机不仅要处理汉字,处理汉字了,但不幸的是,计算机不仅要处理汉字,还要处理英文字符,而汉字国标码和英文编码是存还要处理英文字符,而汉字国标码和英文编码是存在冲突的。在冲

7、突的。例如:例如:“大大”的国标码是:的国标码是:00110100 01110011,如果把国标码的这两个字节直接存储到计算机中,如果把国标码的这两个字节直接存储到计算机中,则系统很可能把它们当做两个英文字符(字符则系统很可能把它们当做两个英文字符(字符4和字符和字符i),因此计算机内部不能存储国标码。),因此计算机内部不能存储国标码。2023-1-1911三、汉字的机内码三、汉字的机内码为避免和英文为避免和英文的的ASCII码混淆,码混淆,存储汉字存储汉字前前,总是先把国标码两个字节的最高位都改为总是先把国标码两个字节的最高位都改为1然然后再存储后再存储,这样就由国标码变成了,这样就由国标码

8、变成了机内码机内码(计算机内部实际存储的汉字编码)。(计算机内部实际存储的汉字编码)。如:如:“大大”的国标码是的国标码是:00110100 01110011 机内码是机内码是:10110100 111100112023-1-1912三、汉字的机内码三、汉字的机内码注意:存储机内码时,总是把区号对应的字注意:存储机内码时,总是把区号对应的字节存储在低字节,而把位号对应的字节存储节存储在低字节,而把位号对应的字节存储在高字节。在高字节。如:如:“大大”的机内码是:的机内码是:10110100 11110011 对应区号 对应位号1011010011110011低字节高字节2023-1-1913三

9、、汉字的机内码三、汉字的机内码机内码和区位码的转换关系机内码和区位码的转换关系:区号区号=机内码的低位字节机内码的低位字节 160位号位号=机内码的高位字节机内码的高位字节 160解释说明解释说明:机内码是在国标码的基础上将两字节最高位都机内码是在国标码的基础上将两字节最高位都变为变为1而得来,相当于两个字节各加了而得来,相当于两个字节各加了128而国标码是由区位码各加而国标码是由区位码各加32而来而来2023-1-1914四四、汉字的字形码、汉字的字形码汉字的形状各不相同。为在计算机中汉字的形状各不相同。为在计算机中显示汉字,通常都是先把每个汉字的显示汉字,通常都是先把每个汉字的形状记录下来

10、形状记录下来,形成形成字形码字形码例如:例如:16点阵宋体字库中点阵宋体字库中“大大”字的字形字的字形码是这样来的:码是这样来的:2023-1-1915四四、汉字的字形码、汉字的字形码画一个画一个16*16的表格,在上面写一个宋体的表格,在上面写一个宋体“大大”。接下来,从左上角的小方格开始。接下来,从左上角的小方格开始记录记录“大大”字的形状,若小方格被字的形状,若小方格被“大大”字覆盖,则记为字覆盖,则记为1,否则记为,否则记为0。00000011 00000000 00000011 00000000 00000011 00000000 00000011 00000100 11111111

11、 11111110 00000011 00000000 11000000 0000010016点阵宋体“大”字的字形码(32字节)2023-1-1916四四、汉字的字形码、汉字的字形码将所有汉字(符号)的将所有汉字(符号)的16点阵宋体字形码点阵宋体字形码按顺序汇集到一起就是按顺序汇集到一起就是16点阵宋体字库点阵宋体字库字库中存有区位表中所有汉字(符号)的字库中存有区位表中所有汉字(符号)的字形码。当需要显示某汉字(符号)时,字形码。当需要显示某汉字(符号)时,先从字库中调出该汉字的字形码,再在屏先从字库中调出该汉字的字形码,再在屏幕上显示出来。幕上显示出来。2023-1-1917四四、汉字

12、的字形码、汉字的字形码字库有很多种,根据字库有很多种,根据点阵点阵大小不同和汉字大小不同和汉字字体字体的不同,可把字库分为的不同,可把字库分为:16点阵宋体字库、点阵宋体字库、16点阵黑体字库、点阵黑体字库、16点阵仿点阵仿宋字库、宋字库、16点阵楷体字库点阵楷体字库24点阵宋体字库、点阵宋体字库、24点阵黑体字库、点阵黑体字库、24点阵楷点阵楷体字库体字库48点阵点阵60点阵点阵点阵数越大,笔画越平滑,点阵数越小,锯齿越严重。2023-1-1918五五、汉字的地址码、汉字的地址码 对于对于16点阵的字库点阵的字库,一个汉字的字形码在字库中存储一个汉字的字形码在字库中存储的起始位置是的起始位置

13、是:offset=(94*(qh-1)+wh-1)*32 其他点阵其他点阵(设为设为S点阵点阵):offset=(94*(qh-1)+wh-1)*S*S/8 汉字字形码在字库中的首地址称作汉字字形码在字库中的首地址称作该该汉字的汉字的地址码地址码2023-1-1919第二节第二节 作图法作图法显示与放大汉字显示与放大汉字在西文状态下显示汉字一般处理方法在西文状态下显示汉字一般处理方法:在中文操作系统中打开源程序将需要显示的汉字在中文操作系统中打开源程序将需要显示的汉字存入数组存入数组(存储的是汉字的机内码)(存储的是汉字的机内码)如:如:char p=“汉字显示技术汉字显示技术”;程序中程序中

14、 通过机内码计算汉字的区号和位号,从而获得地址码通过机内码计算汉字的区号和位号,从而获得地址码 打开字库文件,读取字形码打开字库文件,读取字形码 图形方式下画点,图形方式下画点,“点点”出汉字出汉字在西文在西文DOS下编译、连接、执行下编译、连接、执行2023-1-1920一一、把汉字存入内存把汉字存入内存在源程序中把要显示的汉字(一个或多个)在源程序中把要显示的汉字(一个或多个)存到内存中。存到内存中。char p =“汉字显示技术汉字显示技术”;或:或:char*p=“汉字显示技术汉字显示技术”;存储源程序时,实际存储的是这些汉字的机存储源程序时,实际存储的是这些汉字的机内码内码 (正如英

15、文字符要被转换为正如英文字符要被转换为ASCII码码)运行程序时,机内码将被装入内存运行程序时,机内码将被装入内存 2023-1-1921二二、计算地址码、计算地址码由机内码可计算出地址码由机内码可计算出地址码:从内存中取出一个汉字的机内码,用来计从内存中取出一个汉字的机内码,用来计算区号算区号qh和位号和位号wh。qh=*(p+i)-160;wh=*(p+i+1)-160;计算该汉字的地址码计算该汉字的地址码 (设字库是设字库是S点阵点阵)offset=(qh-1)*94+(wh-1)*S*S/8;2023-1-1922三、从字库中获得字形码三、从字库中获得字形码#define S 16 /

16、点阵数点阵数#define HZK “d:tcfonthzk16f”char bufferS*S/8;/用来存字形码用来存字形码if(fp=fopen(HZK,rb)=NULL)printf(“打不开字库文件打不开字库文件n”);exit(0);fseek(fp,offset,0);fread(buffer,S*S/8,1,fp);2023-1-1923四、画出汉字四、画出汉字设要在屏幕的(设要在屏幕的(x,y)处显示该汉字)处显示该汉字坐标坐标 x,y第0字节对应的8个像素第25字节对应的8个像素2023-1-1924 要在屏幕上显示出汉字,需要对字型码中的每个字要在屏幕上显示出汉字,需要对

17、字型码中的每个字节进行处理,将每个字节变成节进行处理,将每个字节变成8个像素个像素 编程思路:编程思路:for(i=0;i S*S/8;i+)/将第将第i个字节的字型码,画成个字节的字型码,画成8个点个点 四、画出汉字四、画出汉字(方法一方法一)2023-1-1925四、画出汉字四、画出汉字(方法一方法一)字形码的第字形码的第i个字节,所决定的个字节,所决定的8个像素的起点个像素的起点是(是(x+(i%(S/8)*8,y+i*8/S)。)。程序中要针对第程序中要针对第i个字节的个字节的8个位依次进行判断个位依次进行判断和操作和操作,对于字形码为对于字形码为1的位,画出一个点的位,画出一个点ch

18、ar mask=0 x80,0 x40,0 x20,0 x10,0 x08,0 x04,0 x02,0 x01 ;for(j=0;j=7;j+)if(bufferi&maskj)!=0)putpixel(x+(i%(S/8)*8+j,y+i*8/S,color);2023-1-1926故,故,循环处理字形码每循环处理字形码每个个字节字节的代码是:的代码是:char mask=0 x80,0 x40,0 x20,0 x10,0 x08,0 x04,0 x02,0 x01 ;for(i=0;i S*S/8;i+)for(j=0;j=7;j+)if(bufferi&maskj)!=0)putpixe

19、l(x+(i%(S/8)*8+j,y+i*8/S,color);x+=S+5;/设置字间隔设置字间隔四、画出汉字四、画出汉字(方法一方法一)详细代码:s14_1_1.c2023-1-1927四、画出汉字四、画出汉字(方法二方法二)也可以针对点阵图中的每一像素来循环也可以针对点阵图中的每一像素来循环可以算出可以算出,图中第图中第i行第行第j列的像素由字形码的列的像素由字形码的第(第(S/8*i+j/8)字节决定,因此循环可写成:)字节决定,因此循环可写成:for(i=0;i=S-1;i+)for(j=0;j=S-1;j+)if(bufferS/8*i+j/8)&maskj%8)!=0)putpi

20、xel(x+j,y+i,color);详细代码:s14_1_2.c2023-1-1928五、汉字的放大五、汉字的放大汉字的放大实际上就是把一个像素变成几个汉字的放大实际上就是把一个像素变成几个像素。例如,若将汉字放大像素。例如,若将汉字放大2倍,则汉字的宽倍,则汉字的宽度和高度都要变成度和高度都要变成2倍,原来的一个像素要变倍,原来的一个像素要变成成4个像素。个像素。若要放大若要放大m倍,则要把倍,则要把1个像素变成个像素变成m2个像素个像素for(k=0;k m;k+)for(n=0;n m;n+)putpixel(x+m*j+k,y+i*m+n,color);详细代码:s14_2.c202

21、3-1-1929实实 训训1、编、编写写程序,在图形状态下显示自己的姓程序,在图形状态下显示自己的姓名,然后再放大二倍显示。名,然后再放大二倍显示。2、请针对打印字库修改例、请针对打印字库修改例、说明:字库分为显示字库和打印字库两种,区别有两点:说明:字库分为显示字库和打印字库两种,区别有两点:显示字库中每个字的字形码是按行存放的(先存第一显示字库中每个字的字形码是按行存放的(先存第一行,再存第二行行,再存第二行),而打印字库中的字形码是按列),而打印字库中的字形码是按列存放的(先存第一列,再存第二列存放的(先存第一列,再存第二列)打印字库去掉了打印字库去掉了115区的符号,从区的符号,从1区

22、开始就是汉字区开始就是汉字2023-1-1930第三节第三节 直接写直接写VRAM显示汉字显示汉字直接写屏,实际上就是图形方式下,把要显直接写屏,实际上就是图形方式下,把要显示汉字的点阵信息直接存入示汉字的点阵信息直接存入VRAM相应的位相应的位面上,写的过程就是显示的过程。面上,写的过程就是显示的过程。直接写直接写VRAM显示汉字比作图法显示汉字快显示汉字比作图法显示汉字快很多。很多。两种方法两种方法:利用定序器直接写利用定序器直接写VRAM用方式寄存器和位屏蔽寄存器直接写用方式寄存器和位屏蔽寄存器直接写VRAM2023-1-1931一、利用定序器直接写一、利用定序器直接写VRAMVGA显示

23、适配器中的定序器中显示适配器中的定序器中,有有5个寄存个寄存器共用一个口地址器共用一个口地址0 x3c5,使用的是哪,使用的是哪一个寄一个寄存器存器,是由,是由索引寄存器(口地址索引寄存器(口地址0 x3c4)中)中的的索引值索引值决定的。决定的。索引寄存器的值索引寄存器的值(口地址口地址0 x3c4)对应的寄存器对应的寄存器(口地址都是口地址都是0 x3c5)0复位1时钟模式2颜色位面写允许颜色位面写允许3字符发生器选择4存储器模式2023-1-1932一、利用定序器直接写一、利用定序器直接写VRAM数据数据20:XX寄存器寄存器4:XX寄存器寄存器1:XX寄存器寄存器2:颜色位面:颜色位面

24、写允许寄存器写允许寄存器3:XX寄存器寄存器索引寄存器索引寄存器口地址:0 x3c4口地址口地址:0 x3c5数据送入口地址为数据送入口地址为3c5的寄存器过程:的寄存器过程:2023-1-1933一、利用定序器直接写一、利用定序器直接写VRAM要选择要选择颜色位面写允许寄存器颜色位面写允许寄存器,应向索引寄,应向索引寄存器送入存器送入2:outportb(0 x3c4,2);颜色位面写允许寄存器的值(低颜色位面写允许寄存器的值(低4位)决定位)决定着着VRAM的的4个位面是否可写个位面是否可写。如:。如:颜色位面写允许寄存器颜色位面写允许寄存器XXXX1011位面3可写可写位面2不可写不可写

25、位面1可写可写位面0可写可写2023-1-1934一、利用定序器直接写一、利用定序器直接写VRAM直接写直接写VRAM显示汉字,就是通过显示汉字,就是通过“颜色位颜色位面写允许寄存器面写允许寄存器”的控制把字形码写到指定的控制把字形码写到指定位面上。位面上。方法:方法:把汉字的颜色写入把汉字的颜色写入“颜色位面写允颜色位面写允许寄存器许寄存器”outportb(0 x3c5,color);作用:作用:有选择地把字形码写入一些位面,有选择地把字形码写入一些位面,写入哪些位面由写入哪些位面由color决定。决定。2023-1-1935一、利用定序器直接写一、利用定序器直接写VRAM如:如:设字形码

26、第一个字节为设字形码第一个字节为10XXXXXX (下同下同)若若color为为WHITE(15,二进制二进制:1111),则则:字形码字形码将将写入写入4个位面,个位面,字形码为字形码为1的像素将的像素将显示为显示为白色白色,为,为0的像素显示为黑色的像素显示为黑色写允许寄存器低四位写允许寄存器低四位1111位面3可写可写位面2可写可写位面1可写可写位面0可写可写10 xxxxxx10 xxxxxx10 xxxxxx10 xxxxxx位面3位面2位面1位面0每位面每位面64KB2023-1-1936一、利用定序器直接写一、利用定序器直接写VRAM若若color值为值为BLUE(1,二进制二进

27、制:0001),则则:只写位面只写位面0,其余三个位面保持原数据不变(若原,其余三个位面保持原数据不变(若原数据数据都都是是0,对于第一点,像素对于第一点,像素将将是是蓝色蓝色,第二点,第二点为黑色为黑色)原来数据不是原来数据不是0(背景不是黑色背景不是黑色)呢呢?写允许寄存器低四位写允许寄存器低四位0001位面3不可写不可写位面2不不可写可写位面1不可写不可写位面0可写可写10 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx位面3位面2位面1位面0每位面每位面64KB2023-1-1937一、利用定序器直接写一、利用定序器直接写VRAMvoid disphz(int x,int

28、 y,char*buffer,int color)/x、y是汉字显示坐标,是汉字显示坐标,buffer是字形码首址是字形码首址char far *p;int i,j;p=(char far*)(0 xa0000000+80*y+x/8);outportb(0 x3c4,2);outportb(0 x3c5,color);for(i=0;i S;i+)/一个汉字要显示一个汉字要显示S行像素行像素 for(j=0;j S/8;j+)/每行要写每行要写S/8个字节个字节 *(p+80*i+j)=bufferS/8*i+j;outportb(0 x3c5,0 xf);每行每行640像素,像素,80字节

29、字节因此,要求因此,要求显示汉字显示汉字的横坐标的横坐标必必是是8的倍数的倍数课堂演示:14_1 c2023-1-1938一、利用定序器直接写一、利用定序器直接写VRAM上面程序仅在背景色为黑(四个位面的原数上面程序仅在背景色为黑(四个位面的原数据都是据都是0)的情况下能按指定颜色显示一个的情况下能按指定颜色显示一个汉字。汉字。若背景色不是黑色(若背景色不是黑色(原数据不是原数据不是0),显示,显示的汉字通常不是指定颜色。若要在任意背景的汉字通常不是指定颜色。若要在任意背景下都显示指定颜色,需要对下都显示指定颜色,需要对4个位面的数据都个位面的数据都改写。改写。2023-1-1939一、利用定

30、序器直接写一、利用定序器直接写VRAM例如例如:设字形码第一个字节为设字形码第一个字节为10XXXXXX (下同下同)要将汉字显示成淡绿色(要将汉字显示成淡绿色(color:10,二进制值,二进制值:1010),则:),则:字形码为字形码为1时,四个位面的数据必须是时,四个位面的数据必须是1010,以便,以便显示一个淡绿色的点显示一个淡绿色的点 位面位面3、1要写成要写成1 位面位面2、0要写成要写成00 xxxxxx1xxxxxx0 xxxxxx1xxxxxx位面3位面2位面1位面0每位面每位面64KB2023-1-1940一、利用定序器直接写一、利用定序器直接写VRAM例如例如:要将汉字显

31、示成淡绿色(要将汉字显示成淡绿色(color:10,二进制值,二进制值:1010),则:),则:字形码为字形码为0时,所有位面上时,所有位面上该位该位的值均的值均应应保持原保持原值值 位面位面3、1不变不变 位面位面2、0不变不变0 xxxxxx1xxxxxx0 xxxxxx1xxxxxx位面3位面2位面1位面0每位面每位面64KB2023-1-1941一、利用定序器直接写一、利用定序器直接写VRAM也就是:也就是:对于位面对于位面3和位面和位面1,字形码为字形码为1的位,要写入的位,要写入1 字形码为字形码为0的位,保持原值的位,保持原值对于位面对于位面2和位面和位面0 字形码为字形码为1的

32、位,要写入的位,要写入0 字形码为字形码为0的位,保持原值。的位,保持原值。因为向因为向VRAM写字形码时,不是一位一位地写,而写字形码时,不是一位一位地写,而是每次向一个位面写一个字节(是每次向一个位面写一个字节(4个位面逐个写)。个位面逐个写)。0 xxxxxx1xxxxxx0 xxxxxx1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx位面3位面2位面1位面0每位面每位面64KB2023-1-1942一、利用定序器直接写一、利用定序器直接写VRAM如何区分这两类位面?如何区分这两类位面?char mask=0 x01,0 x02,0 x04,0 x08;fo

33、r(n=0;n 4;n+)if(color&maskn!=0)/对位面对位面3和位面和位面1的操作的操作 else /对位面对位面2和位面和位面0的操作的操作2023-1-1943一、利用定序器直接写一、利用定序器直接写VRAM关键代码:关键代码:char mask=0 x01,0 x02,0 x04,0 x08;for(n=0;n 4;n+)if(color&maskn!=0)*(p+80*i+j)|=bufferS*i/8+j;else *(p+80*i+j)&=(bufferS*i/8+j);原理:原理:字形码字形码 01110010 字形码字形码 01110010 字形码取反字形码取反

34、 10001101|原值原值 00100101&原值原值 00100111 最终值最终值 01110111 最终值最终值 00000101详细代码参阅:s14_3.c2023-1-1944二二、用、用方式寄存器和位屏蔽方式寄存器和位屏蔽寄存器直接写寄存器直接写VRAMVGA显示适配器中的图形控制器中有显示适配器中的图形控制器中有9个寄个寄存器共用一个口地址存器共用一个口地址0 x3cf索引寄存器值(口地址0 x3ce)对应的寄存器(口地址都是0 x3cf)0设置/清除寄存器1设置/清除允许寄存器2颜色比较寄存器3数据旋转移动与功能选择寄存器4读颜色位面选择寄存器5方式寄存器方式寄存器6混合寄存

35、器7颜色无关寄存器8位屏蔽寄存器位屏蔽寄存器选择其中一个寄存器选择其中一个寄存器进行操作的方法是向索进行操作的方法是向索引寄存器(口地址引寄存器(口地址0 x3ce)中送入一个索引值中送入一个索引值这里需要的是方式寄这里需要的是方式寄存器和位屏蔽寄存器存器和位屏蔽寄存器2023-1-1945二二、用、用方式寄存器和位屏蔽方式寄存器和位屏蔽寄存器直接写寄存器直接写VRAM1、方式寄存器、方式寄存器方式寄存器方式寄存器决定着读写决定着读写VRAM的方式,我们的方式,我们这里这里只用到写只用到写写方式写方式有有三种,由寄存器最后两位决定三种,由寄存器最后两位决定:D1 D0 0 1 用锁存器的内容写

36、用锁存器的内容写 1 0 将将CPU中数据的中数据的后四位后四位(D3、D2、D1、D0)分)分别写别写入入位面位面3、位面、位面2、位面、位面1、位面、位面0。注意:当位屏蔽注意:当位屏蔽寄存器中对应的位为寄存器中对应的位为0时,该位的数据被屏蔽时,该位的数据被屏蔽(不写)(不写)1 1 不用不用2023-1-1946二二、用、用方式寄存器和位屏蔽方式寄存器和位屏蔽寄存器直接写寄存器直接写VRAM2、位屏蔽寄存器位屏蔽寄存器该寄存器对要写到该寄存器对要写到VRAM中的数据位进行屏蔽,中的数据位进行屏蔽,若位屏蔽寄存器某位为若位屏蔽寄存器某位为1,则写到,则写到VRAM中该位中该位的数据是的数

37、据是CPU的数据,否则写进去的是锁存器的数据,否则写进去的是锁存器中中的数据的数据如果在进行写操作前先进行读操作,使锁存器备如果在进行写操作前先进行读操作,使锁存器备份一下原来的数据,然后再进行写操作,则相当份一下原来的数据,然后再进行写操作,则相当于只把对应于位屏蔽寄存器中于只把对应于位屏蔽寄存器中“1”位的数据改位的数据改写了,而对应于写了,而对应于“0”的数据是不变的。的数据是不变的。2023-1-1947二二、用、用方式寄存器和位屏蔽方式寄存器和位屏蔽寄存器直接写寄存器直接写VRAM 例如例如:在锁存器已备份好原来数据的情况下:在锁存器已备份好原来数据的情况下若:若:位位屏蔽寄存器的值

38、为屏蔽寄存器的值为:1 1 0 0 0 0 1 0 要写的数据是:要写的数据是:*1 0 1 0 锁存器中的数据(锁存器中的数据(VRAM某地址处某地址处4个位面的原数据个位面的原数据)是:是:位面位面3原值原值 0 1 1 0 1 0 1 1 位面位面2原值原值 1 1 0 1 1 1 0 1 位面位面1原值原值 0 1 0 1 0 1 0 1 位面位面0原值原值 0 0 0 1 1 0 0 0则向该处写一个字节(则向该处写一个字节(*1010)后,)后,4个位面的值变为:个位面的值变为:位面位面3值值 1 1 1 0 1 0 1 1位面位面2值值 0 0 0 1 1 1 0 1位面位面1值

39、值 1 1 0 1 0 1 1 1位面位面0值值 0 0 0 1 1 0 0 0锁存器中的数据2023-1-1948二二、用、用方式寄存器和位屏蔽方式寄存器和位屏蔽寄存器直接写寄存器直接写VRAM 上面的操作:上面的操作:对于对于位屏蔽寄存器位屏蔽寄存器中中为为1的位,数据的后四位将的位,数据的后四位将分别写到分别写到4个位面上,这四位数据个位面上,这四位数据恰恰好决定了一好决定了一个像素的颜色个像素的颜色对于位屏蔽寄存器对于位屏蔽寄存器中中为为0的位,的位,4个位面保持原来个位面保持原来的数据不变,意味着屏幕保持原来的颜色不变的数据不变,意味着屏幕保持原来的颜色不变 因此,要在屏幕上显示汉字

40、,可因此,要在屏幕上显示汉字,可:将汉字颜色作为要写数据将汉字颜色作为要写数据的后四位的后四位将字形码的每个字节分别送入位屏蔽寄存器将字形码的每个字节分别送入位屏蔽寄存器将颜色值写入将颜色值写入VRAM。2023-1-1949二二、用、用方式寄存器和位屏蔽方式寄存器和位屏蔽寄存器直接写寄存器直接写VRAM 程序代码:程序代码:前面讨论的是把汉字显示成某颜色,背景色不变。前面讨论的是把汉字显示成某颜色,背景色不变。若需要取消背景色,代之以指定颜色作为底色,则若需要取消背景色,代之以指定颜色作为底色,则需要添加如下代码:需要添加如下代码:t=*(p+80*i+j);outportb(0 x3ce,

41、8);outportb(0 x3cf,bufferS/8*i+j);/屏蔽字形码为屏蔽字形码为1的位的位 *(p+80*i+j)=bkcolor;/bkcolor为背景色为背景色程序代码参阅:s14_4_1.c详细代码参阅:s14_4_2.c2023-1-1950实实 训训3、将例、将例14_3改写为能输出汉字字符串的函数改写为能输出汉字字符串的函数4、将例、将例14_4改写为能用打印字库输出汉字字符串改写为能用打印字库输出汉字字符串的函数的函数5、改写第、改写第12章(作图)实训章(作图)实训4的程序,利用直接写的程序,利用直接写VRAM的方法显示所需要汉字的方法显示所需要汉字原题目修改如下:原题目修改如下:利用输入重定向从文件读入利用输入重定向从文件读入10名学生的名学生的姓名姓名和成绩(和成绩(数数学、英语、计算机学、英语、计算机),画出总分前三名的直方图(标上),画出总分前三名的直方图(标上姓名),用圆饼图画出平均分在各分数段的比例(不及姓名),用圆饼图画出平均分在各分数段的比例(不及格、格、60-69,70-79,80-89,90-100),图形中要有图例。),图形中要有图例。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!