C必看高级编程技术

上传人:鲁** 文档编号:569384104 上传时间:2024-07-29 格式:PPT 页数:95 大小:472.51KB
返回 下载 相关 举报
C必看高级编程技术_第1页
第1页 / 共95页
C必看高级编程技术_第2页
第2页 / 共95页
C必看高级编程技术_第3页
第3页 / 共95页
C必看高级编程技术_第4页
第4页 / 共95页
C必看高级编程技术_第5页
第5页 / 共95页
点击查看更多>>
资源描述

《C必看高级编程技术》由会员分享,可在线阅读,更多相关《C必看高级编程技术(95页珍藏版)》请在金锄头文库上搜索。

1、C C必看高级编程技术必看高级编程技术l屏幕文本输出屏幕文本输出l图形程序设计图形程序设计l硬件驱动硬件驱动l键盘鼠标输入方法编程键盘鼠标输入方法编程l其它高级编程技术其它高级编程技术一、屏幕文本输出一、屏幕文本输出l1.11.1文本方式的控制文本方式的控制l1.21.2窗口设置和文本输出函数窗口设置和文本输出函数l1.31.3清屏和光标操作函数清屏和光标操作函数l1.41.4屏幕文本移动与存取函数屏幕文本移动与存取函数l1.51.5状态查询函数状态查询函数1.1.1 文本方式控制函数l文本方式就是显示文本的模式,它的显文本方式就是显示文本的模式,它的显示单位是字符而不是图形方式下的象素,示单

2、位是字符而不是图形方式下的象素,在屏幕上显示字符的位置坐标用行和列在屏幕上显示字符的位置坐标用行和列表示。表示。l缺省方式下,每屏为缺省方式下,每屏为8080列列2525行,行,Turbo CTurbo C规定屏的左上角为规定屏的左上角为l l行行l l列,屏的右下角列,屏的右下角为为2525行行8080列。列。lTurbo CTurbo C支持的文本显示方式有支持的文本显示方式有5 5种,它种,它们可以用文本显示方式设置函数来进行们可以用文本显示方式设置函数来进行设置。设置。文本显示方式设置函数:文本显示方式设置函数:void textmode(int newmode) 其中newmode的

3、值可分别为:l04025黑白显示l14025彩色显示l28025黑白显示l38025彩色显示l78025单色显示l-1上一次的显示方式1.1.2 文本方式颜色控制函数l文本颜色设置函数文本颜色设置函数void textcolor(int void textcolor(int color)color)控制文本显示的前景色,即字符显控制文本显示的前景色,即字符显示的颜色,其参数示的颜色,其参数colorcolor仅能选择仅能选择1717种颜色,种颜色,即值为即值为016016。l文文 本本 背背 景景 颜颜 色色 设设 置置 函函 数数 void void textbackground(int t

4、extbackground(int color)color)设设置置文文本本显显示示的的背背景景颜颜色色,其其参参数数colorcolor仅仅能能选选择择8 8种种颜颜色色,即值为即值为0707。l文文 本本 属属 性性 设设 置置 函函 数数 void void textattr(int textattr(int attr)attr)设设置置字字符符显显示示的的颜颜色色,背背景景色色,字字符符显显示示是是否否闪闪烁烁,显显示示属属性性参参数数attrattr可可用用一一个个字节即字节即8 8位来描述。位来描述。1.1.3 1.1.3 字符显示亮度控制函数字符显示亮度控制函数lvoid hig

5、hvideo(void)用高亮度显示字符。lvoid lowvideo(void)用低亮度显示字符。lvoid normvideo(void)将设置通常亮度显示字符。1.2 窗口设置和文本输出函数l在文本方式下,没进行窗口设置时,即在文本方式下,没进行窗口设置时,即窗口设置缺省时,认为整个屏幕为显示窗口设置缺省时,认为整个屏幕为显示窗口,窗口,lTurbo CTurbo C提供了窗口设置函数提供了窗口设置函数window()window(),可由用户根据自己的需要来重新设定显可由用户根据自己的需要来重新设定显示窗口。当设定后,以后的控制台示窗口。当设定后,以后的控制台I/OI/O操操作作( (

6、即文本输入输出即文本输入输出) ),就可均在此窗口,就可均在此窗口中进行。中进行。1.2.1 窗口设置函数lvoid void window(int window(int x1x1,int int y1y1,int int x2x2,int y2)int y2);l其其中中( (x1x1,y1)y1)为为窗窗口口的的左左上上角角坐坐标标,( (x2x2,yz)yz)为为窗窗口口的的右右下下角角坐坐标标,这这些些坐坐标标是是以整个屏幕为参考坐标系。以整个屏幕为参考坐标系。l利利用用窗窗口口函函数数可可以以在在屏屏幕幕上上定定义义多多个个不不同窗口,以显示不同的信息。同窗口,以显示不同的信息。1.

7、2.2 控制台文本输出函数lprintf()printf(),putc()putc(),puts()puts(),putchar()putchar()和和输输出出函函数数以以整整个个屏屏幕幕为为窗窗口口的的,它它们们不不受受由由windowwindow设设置置的的窗窗口口限限制制,也也无无法法用用函函数数控控制制它它们输出的位置。们输出的位置。lTurbo Turbo C C提提供供了了三三个个文文本本输输出出函函数数, int int cprintf(char cprintf(char *format*format, ) ); int int cputs(char cputs(char *s

8、tr)*str);int int putch(int putch(int ch)ch);它它们们受受窗窗口口的的控控制制,窗窗口口内内显显示示光光标标的的位位置置,就就是它开始输出的位置。是它开始输出的位置。1.3.1 清屏函数lvoid void clrscr(void)clrscr(void);清清除除窗窗口口中中的的文文本本,并并将将光光标标移移到到当当前前窗窗口口的的左左上上角角,即即(1, (1, 1)1)处。处。l void void clreol(void)clreol(void);除除当当前前窗窗口口中中从从光光标标位位置置开开始始到到本本行行结结尾尾的的所所有有字字符符,但不

9、改变光标原来的位置。但不改变光标原来的位置。l void void delline(void)delline(void);删删除除一一行行字字符符,该行是光标所在行。该行是光标所在行。1.3.2 光标操作函数lvoid void gotoxy(int gotoxy(int x x,int int y)y);把把光光标标移移到到窗窗口口内内的的( (x x,y)y)处处,x x,y y坐坐标标是是相相对对窗窗口口而而言言。它它多多和和cprintfcprintf函函数数配配合合,以以指定输出开始位置。指定输出开始位置。1.4.1 屏幕文本移动函数lvoid movetext(int x1void

10、 movetext(int x1,int y1int y1,int int x2x2,int y2int y2,int x3int x3,int y3)int y3);l该函数将把屏幕上左上角为该函数将把屏幕上左上角为( (xlxl,y1)y1),右下角右下角为为( (x2x2,y2)y2)的矩形内文本拷贝到左上角为的矩形内文本拷贝到左上角为( (x3x3,y3)y3)的一个新矩形区内。这里的一个新矩形区内。这里x x,y y坐标是以坐标是以整个屏幕为窗口坐标系,即屏幕左上角为整个屏幕为窗口坐标系,即屏幕左上角为(1(1,1)1)。l该函数与开设的窗口无关,且原矩形区文本不该函数与开设的窗口无

11、关,且原矩形区文本不变。变。1.4.2 屏幕文本存取函数1、存存文文本本函函数数void void gettext(int gettext(int xlxl,int int y1y1,int int x2x2,int int y2y2,void void *buffer)*buffer);把把左左上上角角为为( (xlxl,y1)y1),右右下下角角为为( (x2x2,y2)y2)的的矩矩形形区区内内的的文文本本存存到到由由指指针针bufferbuffer指指向向的的一一个个内内存存缓缓冲区内。冲区内。2 2、取取文文本本函函数数void void puttext(int puttext(in

12、t x1x1,int int y1y1,int int x2x2,int int y2y2,void void *buffer)*buffer);把把由由bufferbuffer指指针针指指向向的的缓缓冲冲区区内内所所存存文文本本复复制制到到屏屏幕幕上上一一矩矩形形区区内内,该该矩矩形形区区左左上上角角为为( (x1x1,y1)y1),右下角为右下角为( (x2x2,y2)y2)。1.5 1.5 状态查询函数状态查询函数lvoid gettextinfo(struct text_info *f);l这里的text_info是在conio.h头文件中定义的一个结构;l显示当前屏幕的显示方式,当前

13、窗口的坐标、当前光标的位置,文本的显示属性等。第二章 图形程序设计lTurbo CTurbo C为用户提供了一个功能很强的画图软为用户提供了一个功能很强的画图软件库,它又称为件库,它又称为BorlandBorland图形接口图形接口( (BGI)BGI),它包它包括图形库文件括图形库文件( (graphics.lib)graphics.lib),图形头文件图形头文件( (graphics.h)graphics.h)和许多图形显示器和许多图形显示器( (图形终端图形终端) )的的驱动程序驱动程序( (如如CGA.BGICGA.BGI、EGAVGA.BGIEGAVGA.BGI等等) )。及一。及一

14、些字符集的字体驱动程序些字符集的字体驱动程序( (如如goth.chrgoth.chr黑体字黑体字符集等符集等) )。l编写图形程序时用到的一些图形库函数均在编写图形程序时用到的一些图形库函数均在graphics.libgraphics.lib中,执行这些函数时,所需的有中,执行这些函数时,所需的有关信息关信息( (如宏定义等如宏定义等) )则包含在则包含在graphics.hgraphics.h头文头文件中。件中。2.1.1 图形显示的坐标l显示器的屏幕如同一张坐标纸,显示器的屏幕如同一张坐标纸,在其上显示图形时,图形上任一在其上显示图形时,图形上任一点的位置均有确定的坐标,即可点的位置均有

15、确定的坐标,即可用用x x,y y坐标值来表示。坐标值来表示。2.1.2 象素l显示器显示的图形均由一些圆点组成显示器显示的图形均由一些圆点组成( (其其亮度、颜色不同亮度、颜色不同) ),这些点称为象素,这些点称为象素( (或或称象点称象点) ),它们是组成图形的最小单位。,它们是组成图形的最小单位。l象素的大小可以通过设置不同的显示方象素的大小可以通过设置不同的显示方式来改变。象素在屏幕上的位置则可由式来改变。象素在屏幕上的位置则可由其所在的其所在的x x,y y坐标来决定。坐标来决定。2.2 图形显示器与适配器l计算机中要显示的字符和图形均以数字形式存储在存计算机中要显示的字符和图形均以

16、数字形式存储在存储器中,而显示器接收的应是模拟信号。储器中,而显示器接收的应是模拟信号。l常用的显示器有三条模拟红绿兰颜色的模拟信号输入常用的显示器有三条模拟红绿兰颜色的模拟信号输入线,每条输入线的电压决定了颜色的亮度,只要能产线,每条输入线的电压决定了颜色的亮度,只要能产生出可区分的电压来,它们不同的组合,便可使显示生出可区分的电压来,它们不同的组合,便可使显示器显示出不同的颜色来。器显示出不同的颜色来。l插在插在PCPC微机插槽中的图形卡微机插槽中的图形卡( (即适配器即适配器) ),其作用就是,其作用就是将要显示的字符和图形以数字形式存储在卡上的视频将要显示的字符和图形以数字形式存储在卡

17、上的视频存储器存储器VRAMVRAM中,再将其变成视频模拟信号送往相应适中,再将其变成视频模拟信号送往相应适配的显示器进行显示,也即适配器在计算机主机和显配的显示器进行显示,也即适配器在计算机主机和显示器之间起到了信息转换和视频发送作用。示器之间起到了信息转换和视频发送作用。l由于计算机配有的显示器种类不同,因而适配器种类由于计算机配有的显示器种类不同,因而适配器种类不同不同常用的几种适配器l1 1单单色色显显示示适适配配器器( (MDA)MDA);仅仅显显示示一一种种颜颜色色,仅仅支支持持80802525行的字符显示。行的字符显示。l2 2彩彩色色图图形形适适配配器器( (CGA)CGA);

18、这这是是PC/XTPC/XT等等微微机机配配用用的的显显示器图形卡,它可以产生单色或彩色字符和图形。示器图形卡,它可以产生单色或彩色字符和图形。l3 3增增强强型型图图形形适适配配器器EGA)EGA);除除支支持持CGACGA的的四四种种显显示示模模式式外外,还还增增加加了了分分辨辨率率为为640640200200的的1616色色显显示示方方式式, ( (EGAHI)EGAHI),也可显示也可显示1616色。色。l4 4视视频频图图形形阵阵列列适适配配器器( (VGA)VGA);它它是是目目前前流流行行的的PCPC微微机机显显示示标标准准,它它支支持持CGACGA,EGAEGA的的所所有有显显

19、示示方方式式,但但自自己己还还有有640640480480的的高高分分辨辨显显示示方方式式( (VGAHI)VGAHI)、640640350350的的中中分分辨辨显显示示方方式式( (VGAMED)VGAMED)和和640640200200的的低低分分辨辨显显示示方式方式( (VGALO)VGALO),它们均可有它们均可有1616种显示颜色可供选择。种显示颜色可供选择。常用的几种适配器l5 5TVGATVGA;它它是是目目前前市市面面上上最最流流行行的的PC PC 486486,586586微微机机配配的的显显示示器器标标准准,在在图图形形方方式式下下,它它可可 有有 640640400400

20、, 640640480480, 800800600600,10241024768768及及76876810241024等等分分辨辨率率,可可选选颜颜色色达达256256种种,在在文文本本方方式式下下,可可支支持持2525、3030、4343、6060行行,132132列列的的字字符符显显示示。它它也也兼兼容容CGACGA、EGAEGA、VGAVGA的的显显示示方方式式,由由于于Turbo Turbo C C早早于于该该产产品品出出现现,因因而而上上述述增增强强了了的的显显示示方方式式均均不不支支持持,但但对对于于高高级级编编程程者者,可可通通过过对对TVGATVGA各各专专用用寄寄存存器器直直

21、接接编程来实现这些功能。编程来实现这些功能。常用的几种适配器l6 6PVGAPVGA;它是它是paradise VGAparadise VGA的缩写,它由的缩写,它由Western DigitalWestern Digital公司生产,有的叫公司生产,有的叫SVGA(SVGA(香港香港SurperkingSurperking公司生产的公司生产的386386微机上使用微机上使用) )。还有。还有称为称为EVGA(Extended VGA)EVGA(Extended VGA),它们和它们和PVGAPVGA在软硬在软硬件上均是兼容的。件上均是兼容的。PVGAPVGA完全兼容完全兼容CGACGA、EG

22、AEGA、VGAVGA的所有工作方式,它还有自己一些特有的的所有工作方式,它还有自己一些特有的工作模式,与工作模式,与TVGATVGA类似。类似。l7 7XGAXGA;XGAXGA是是IBMIBM公司新推出的一种增强性图公司新推出的一种增强性图形适配器,它是形适配器,它是VGAVGA的换代产品,具有更高的的换代产品,具有更高的分辨率和性能,它有和分辨率和性能,它有和CGACGA,EGAEGA,VGAVGA全兼容全兼容的工作方式,但显示速度却比的工作方式,但显示速度却比VGAVGA快一倍。快一倍。常用的几种适配器l8 8CVGACVGA;这是国内研制的带有显示汉字这是国内研制的带有显示汉字功能的

23、功能的VGAVGA图形适配器,它带有汉字字库,图形适配器,它带有汉字字库,该适配器提供了和该适配器提供了和CGACGA、EGAEGA、VGAVGA全兼容全兼容的工作方式,还提供了在文本工作方式的工作方式,还提供了在文本工作方式下的高分辨图形显示功能。在它的下的高分辨图形显示功能。在它的ROM ROM BIOSBIOS中提供了中提供了INT10HINT10H的功能号为的功能号为3030H H38H38H的功能调用,因而提供了方便的汉字的功能调用,因而提供了方便的汉字处理功能。处理功能。2.3 显示器工作方式l文本方式或称字符显示方式文本方式或称字符显示方式l图形显示方式图形显示方式l它们的主要差

24、别是显示存储器它们的主要差别是显示存储器( (VRAM)VRAM)中存的信中存的信息不同。字符方式时,息不同。字符方式时,VRAMVRAM存放要显示字符的存放要显示字符的ASCIIASCII码,用它作为地址,取出字符发生器码,用它作为地址,取出字符发生器ROM(ROM(固定存储器固定存储器) )中存放的相应字符的图象中存放的相应字符的图象( (又又称字模称字模) ),变成视频信号在显示器屏上进行显,变成视频信号在显示器屏上进行显示。图形方式时,则要显示的图形的图象直接示。图形方式时,则要显示的图形的图象直接存在存在VRAMVRAM中,中,VRAMVRAM中某地址单元存放的数就表中某地址单元存放

25、的数就表示了相应屏幕上某行和列上的象素及颜色。示了相应屏幕上某行和列上的象素及颜色。Turbo CTurbo C支持的适配器和图形模支持的适配器和图形模式式l1 1MCGA(MCGA(多多色色图图形形阵阵列列) );它它和和VGAVGA是是PS/2PS/2系系列列微微机机的的主主要要适适配配器器,MCGAMCGA功功能能上上同同CGACGA相相似似,它它和和CGACGA是是部部分分兼兼容容的的,但但有有些些功功能能又又和和VGAVGA类类似似,可可有有640640480480的的二二色模式。色模式。l2 2IBM8514IBM8514;该该适适配配器器可可插插入入PS/2PS/2微微机机中中,

26、它它有有较较强强的的图图形形功功能能,最最高高分分辨辨率率可可达达10241024768768,可可有有256256种种颜色。颜色。l3 3HERCHERC;大大力力神神公公司司生生产产的的一一种种单单色色适适配配器器,是是PCPC系系列列微微机机早早期期的的第第三三种种显显示示标标准准( (其其它它两两种种MDAMDA和和CGA)CGA),它采用它采用720720348348高分辨单色显示模式。高分辨单色显示模式。l4 4EGAMONOEGAMONO;EGAEGA单单色色适适配配器器,它它只只有有一一种种640640350350单单色显示模式。色显示模式。2.5 图形系统的初始化l即要用什么

27、类型的图形显示适配器的驱即要用什么类型的图形显示适配器的驱动程序,动程序,l采用什么模式的图形方式采用什么模式的图形方式( (也就是相应程也就是相应程序的入口地址序的入口地址) ),l适配器驱动程序的寻找路径名。适配器驱动程序的寻找路径名。l注意:所用系统的显示适配器一定要支注意:所用系统的显示适配器一定要支持所选用的显示模式,否则将出错。持所选用的显示模式,否则将出错。2.5.1 图形系统的初始化函数lvoid far initgraph(int far *drivervoid far initgraph(int far *driver,int far *modeint far *mode,

28、char far char far *path_for_driver)*path_for_driver);2.5.2 图形系统检测函数lvoid far detectgraph(int far void far detectgraph(int far *graphdriver*graphdriver,int far *graphmode)int far *graphmode);l它完成对适配器的检查并得到显示器类它完成对适配器的检查并得到显示器类型号和相应的最高分辨率模式,若所设型号和相应的最高分辨率模式,若所设适配器不是规定的那些类型,则返回适配器不是规定的那些类型,则返回-2-2,表示适配

29、器不存在。,表示适配器不存在。2.5.3 清屏函数lvoid void far far cleardevice(void)cleardevice(void);该该函函数数作用范围为整个屏幕。作用范围为整个屏幕。lvoid void far far clearviewport(void);clearviewport(void);如如果果用用函函数数setviewportsetviewport定定义义一一个个图图视视窗窗口口,则则可可用用清清除除图图视视口口函函数数,它它仅仅清清除除图图视视口口区域内的内容。区域内的内容。 2.5.3恢复显示方式函数l当当画画图图程程序序结结束束,回回到到文文本本

30、方方式式时时,要要关关闭闭图图形形 系系 统统 , 回回 到到 文文 本本 方方 式式 , 用用 void void far far closegraph(void)closegraph(void);l为为了了不不关关闭闭图图形形系系统统,使使相相应应适适配配器器的的驱驱动动程程序序和和字字符符集集( (字字库库) )仍仍驻驻留留在在内内存存,但但又又回回到到原原来来所所设设置置的的模模式式,则则可可用用恢恢复复工工作作模模式式函函数数void void far far restorecrtmode(void)restorecrtmode(void);它它也也同同时时进进行行清清屏屏操操作作。

31、该该函函数数常常和和另另一一设设置置图图形形工工作作模模式式函函数数setgraphmodesetgraphmode交交互互使使用用,使使得得显显示示器器工作方式在图形和文本方式之间来回切换。工作方式在图形和文本方式之间来回切换。2.6 基本图形函数l图形由点、线、面组成,图形由点、线、面组成,Turbo Turbo C C提供了一些函数,以完成这些提供了一些函数,以完成这些操作。操作。2.6.1 画点函数lvoid void far far putpixel(int putpixel(int x x,int int y y,int int color);color);它它表表示示在在指指定定

32、的的x x,y y位位置置画画一一点点,点点的的显显示示颜颜色色由由设设置置的的colorcolor值值决决定定,关关于于颜颜色色的的设设置置,将将在在设设置置颜颜色色函函数数中中介介绍。绍。l该该函函数数的的相相对对应应函函数数是是取取象象素素值值函函数数int int far far getpixel(int getpixel(int x x,int int y)y);得得到到在在( (x x,y)y)点位置上的象素的颜色值。点位置上的象素的颜色值。2.6.2 有关画图坐标位置的函数移动画笔到指定的移动画笔到指定的( (x x,y)y)位置,移动过程不画:位置,移动过程不画:void fa

33、r moveto(int xvoid far moveto(int x,int y)int y);画画笔笔从从现现行行位位置置( (x x,y)y)处处移移到到一一位位置置增增量量处处( (x+dxx+dx,y+dx)y+dx),移动过程不画:移动过程不画:void far moverel(int dxvoid far moverel(int dx,int dy)int dy);得到当前画笔所在位置得到当前画笔所在位置int far getx(void)int far getx(void);得到当前画笔的得到当前画笔的x x位置位置int far gety(void)int far gety(

34、void);得到当前画笔的得到当前画笔的y y位置位置2.6.3 画线函数两点之间画线函数。两点之间画线函数。void void far far line(int line(int x0x0,int int y0y0,int int x1x1,int int y1)y1);从从( (x0x0,y0)y0)点到点到( (x1x1,y1)y1)点画一直线。点画一直线。从现行画笔位置到某点画线函数。从现行画笔位置到某点画线函数。void far lineto(int xvoid far lineto(int x,int y)int y);将从现行画笔位置到将从现行画笔位置到( (x x,y)y)点画

35、一直线。点画一直线。从现行画笔位置到一增量位置画线函数从现行画笔位置到一增量位置画线函数void far linerel(int dxvoid far linerel(int dx,int dy)int dy);将将从从现现行行画画笔笔位位置置( (x x,y)y)到到位位置置增增量量处处( (x+dxx+dx,y+dy)y+dy)画一直线。画一直线。画线程序举例# #include include main()main() int graphdriver=VGA;int graphdriver=VGA;int graphmode=VGAHI;int graphmode=VGAHI;initg

36、raph(&graphdriver,&graphmode,);initgraph(&graphdriver,&graphmode,);cleardevice();cleardevice();moveto(100,20);moveto(100,20);lineto(100,80);lineto(100,80);moveto(200,20);moveto(200,20);lineto(100,80);lineto(100,80);line(100,90,200,90);line(100,90,200,90);linerel(0,20);linerel(0,20);moverel(-100,0);m

37、overel(-100,0);linerel(30,20);linerel(30,20);getch();getch();closegraph();closegraph();2.6.4 画矩形和条形图函数l画矩形函数画矩形函数lvoid void far far rectangle(int rectangle(int xlxl,int int y1y1,int int x2x2,int y2)int y2);l该该函函数数将将以以( (x1x1,y1)y1)为为左左上上角角,( (x2x2,y2)y2)为为右右下角画一矩形框。下角画一矩形框。l画条形图函数画条形图函数lvoid void ba

38、r(int bar(int x1x1,int int y1y1,int int x2x2,int int y2)y2);l该该函函数数将将以以( (xlxl,y1)y1)为为左左上上角角,( (x2x2,y2)y2)为为右右下下角角画画一一实实形形条条状状图图,没没有有边边框框,图图的的颜颜色色和和填充模式可以设定填充模式可以设定。程序举例l编写程序,由编写程序,由rectanglerectangle函数以函数以(100(100,20)20)为左上角,为左上角,(200(200,50)50)为右下角画一为右下角画一矩形,接着由矩形,接着由barbar函数以函数以(100(100,80)80)为

39、左为左上角,上角,(150(150,180)180)为右下角画一实形条为右下角画一实形条状图,用缺省颜色状图,用缺省颜色( (白色白色) )填充。填充。# #include include main()main()int graphdriver=DETECTint graphdriver=DETECT;int graphmode,xint graphmode,x;initgraph(&graphdriver,&graphmode,initgraph(&graphdriver,&graphmode,”) );cleardevice()cleardevice();rectangle(100rect

40、angle(100,2020,200200,50)50);bar(100bar(100,8080,150150,180)5180)5getch()getch();closegraph()closegraph(); 2.6.5 画椭圆、圆和扇形图函数画椭圆函数画椭圆函数void void ellipse(int ellipse(int x x,int int y y,int int stanglestangle,int int endangelendangel,int int xradiusxradius,int int yradius)yradius);该该函函数数将将以以( (x x,y)y

41、)为为中中心心,以以xradiusxradius和和yradiusyradius为为x x轴轴和和y y轴轴半半径径,从从起起始始角角stanglestangle开开始始到到endangleendangle角角结结束束,画画一一椭椭圆圆线线。当当stangle=0stangle=0,endangle=360endangle=360时时,则则画画出出的的是是一一个个完完整整的的椭椭圆,否则画出的将是椭圆弧。圆,否则画出的将是椭圆弧。l画圆函数画圆函数lvoid void far far circle(int circle(int x x, int int y y, int int radius)

42、radius);l该该函函数数将将以以( (x x,y)y)为为圆圆心心,radiusradius为为半半径径画画个个圆。圆。l画圆弧函数画圆弧函数lvoid void far far arc(int arc(int x x,int int y y,int int stanglestangle,int endangleint endangle,int radius)int radius);l该该函函数数将将以以( (x x,y)y)为为圆圆心心,radiusradius为为半半径径,从从stanglestangle为为起起始始角角开开始始,到到endangleendangle为为结结束束角角画

43、一圆弧。画一圆弧。l画扇形图函数画扇形图函数lvoid void far far pieslice(int pieslice(int x x,int int y y,int int stanglestangle,int int endangleendangle,int int radius)radius);l该该函函数数将将以以( (x x,y)y)为为圆圆心心,radiusradius为为半半径径,从从stanglestangle为为起起始始角角,endangleendangle为为结结束束角角,画画一一扇扇形形图图,扇扇形形图图的的填填充充模模式式和和填填充充颜颜色色可可以以事事先先设设定

44、定,否否则则以以缺缺省省模式进行。模式进行。画三维立体直方图函数lvoid void far far bar3d(int bar3d(int x1x1,int int y1y1,int int x2x2,int int y2y2,int int depthdepth,int int topflag)topflag);l该该函函数数参参数数名名定定义义如如图图2.142.14所所示示。当当topflagtopflag非非0 0时时,画画出出三三维维顶顶,否否则则将将不不画画出出三三维维顶顶,depthdepth决决定定了了三三维维直直方方图图的的长度。长度。与填充函数有关的作图函数画三维立体直方

45、图函数画三维立体直方图函数void void far far bar3d(int bar3d(int x1x1,int int y1y1,int int x2x2,int int y2y2,int depthint depth,int topflag)int topflag); 画椭圆扇形函数画椭圆扇形函数 viod viod far far sector(int sector(int x x, int int y y, int int stanglestangle,int int endang1eendang1e,int int xradiusxradius,int int yradius)

46、yradius);该该函函数数将将以以( (x x,y)y)为为圆圆心心,以以xradiusxradius和和yradiusyradius为为x x轴轴和和y y轴轴半半径径,从从起起始始角角stang1estang1e开开始始到到endang1eendang1e角角结结束束,画画一一椭椭圆圆扇扇形形图图,并并按按设设置置的的填填充充模模式式和和颜颜色色填填充充。当当stang1estang1e为为0 0,endangleendangle为为360360时,则画出一完整的椭圆图。时,则画出一完整的椭圆图。l 画椭圆图函数画椭圆图函数l void void far far fillellipse

47、(int fillellipse(int x x, int int y y, int int xradiusxradius,int yradius)int yradius); ”l 该该函函数数将将以以( (x x,y)y)为为圆圆心心,以以xradiusxradius和和yradiusyradius为为x x轴轴和和y y轴轴半半径径,画画一一椭椭圆圆图图,并并以以设设定定或或缺缺省省模模式式和颜色填充。和颜色填充。l 画多边形图函数画多边形图函数l void void far far fillpoly(int fillpoly(int numpointsnumpoints,int int

48、far far *polypoints)*polypoints)l 该该函函数数将将画画出出一一个个顶顶点点数数为为numpointsnumpoints,各各顶顶点点坐坐标标 由由 polypointspolypoints给给 出出 的的 多多 边边 形形 , 也也 即即 边边 数数 为为polypoints-1polypoints-1,当当为为一一封封闭闭图图形形时时,numpohtsnumpohts应应为为多多边边形形的的顶顶点点数数加加1 1,并并且且第第一一个个顶顶点点坐坐标标应应和和最最后后一一个个顶点的坐标相同。顶点的坐标相同。2.7 颜色控制函数l象素的显示颜色,或者说画线、填充

49、面的颜色象素的显示颜色,或者说画线、填充面的颜色都可以用一些函数来设置,否则将采用缺省的都可以用一些函数来设置,否则将采用缺省的值。值。l显示点、线、面的颜色,称为前景色,而衬托显示点、线、面的颜色,称为前景色,而衬托它们的背景,称为背景色。它们的背景,称为背景色。l按照按照CGACGA、EGAEGA、VGAVGA图形适配器的硬件结构,图形适配器的硬件结构,颜色可以通过对其内部相应的寄存器进行编程颜色可以通过对其内部相应的寄存器进行编程来改变,但不编程时,则取缺省值。来改变,但不编程时,则取缺省值。l颜色的设置,一般用所谓调色板来进行描述,颜色的设置,一般用所谓调色板来进行描述,它实际上对应一

50、些硬件的寄存器。它实际上对应一些硬件的寄存器。调色板l从C语言的角度看,调色板实际上就是一张颜色索引表,对CGA显示器,在中分辨显示方式下,有4种显示模式,每一种模式对应有一个调色板,可用调色板号区别。l模式调色板号颜色值l 0 1 2 3lCGAC00背景色绿红黄lCGAC11背景色青洋红 白lCGAC22背景色淡绿 淡红 棕lCGAC33背景色淡青 淡洋红淡灰2.7.1 颜色设置函数l前景颜色设置函数:前景颜色设置函数:l void far setcolor(int color)void far setcolor(int color);l 该该函函数数将将使使得得前前景景以以所所选选col

51、orcolor颜颜色色进进行行显显示示,对对CGACGA,当当为为中中分分辨辨模模式式时时只只能能选选0 0,1 1,2 2,3 3。l选择背景颜色的函数:选择背景颜色的函数:l void far setbkcolor(int color)void far setbkcolor(int color)l该该函函数数将将使使得得背背景景色色按按所所选选1616种种中中的的一一种种colorcolor颜色进行显示。颜色进行显示。2.8.1 设定线型函数lTurbo Turbo C C也也提提供供了了改改变变线线的的宽宽度度、类类型型的的函函数数,其其线线的的宽宽度度当当不不设设定定时时,取取缺缺省省

52、值值,即即一一个个象象素素宽宽,当当设设定定为为3 3时时,可可取取三三个个象象素素宽宽。当当线线的的形形状状不不设设定定时时,取取缺缺省省值值,即即实实线线。设设定定时时,可可有有5 5种种选选择择,它它们们可可用用设设定定线线型型函函数数来来进进行行设置:设置:lvoid void far far setlinestyle(int setlinestyle(int linestylelinestyle,unsigned upatternunsigned upattern,int thickness)int thickness);l其其中中 1 1inestyleinestyle为为线线型型

53、参参数数; thicknessthickness为为线线的宽度参数。的宽度参数。2.9.1 填色函数lvoid far setfilestyle(int pattern,int color);l该函数将用设定的color颜色和pattern图模式对后面画出的轮廓图进行填充,这些图轮廓是由待定函数画出的。lcolor实际上就是调色板寄存器索引号,lpattern表示填充模式,2.9.2 用户自定义填充函数lvoid void far far setfillpattern(char setfillpattern(char *upattefn*upattefn,int color)int color

54、);l该该函函数数设设置置用用户户自自定定义义可可填填充充模模式式,以以colorcolor指出的颜色对封闭图形进行填充。指出的颜色对封闭图形进行填充。lcolorcolor实实际际上上就就是是调调色色板板寄寄存存器器号号,也也可可用用颜颜色名代替。色名代替。l参参数数upatternupattern是是一一个个指指向向8 8个个字字节节存存储储区区的的指指针针,这这8 8个个字字节节表表示示了了一一个个8 88 8象象素素点点阵阵组组成成的的填填充充图图模模,它它是是由由用用户户自自定定义义的的,它它将将用用来来对封闭图形填充。对封闭图形填充。2.9.3 得到填充模式和颜色的函数lvoid

55、void far far fillsettings(struct fillsettings(struct fillsettingstype far *fillinfo);fillsettingstype far *fillinfo);l它它将将得得到到当当前前的的填填充充模模式式和和颜颜色色,这这些些信信息息存存在在结结构构指指针针变变量量fillinfofillinfo指指出出的的结构中。结构中。2.9.4 与填充函数有关的作图函数l画条形图函数画条形图函数barbar和画扇形函数和画扇形函数pieslisepieslise,它它们需要用们需要用setfillstylesetfillstyl

56、e函数设置填充模式和颜函数设置填充模式和颜色,否则按缺省方式。色,否则按缺省方式。l其它:其它:画三维立体直方图函数画三维立体直方图函数lvoid void far far bar3d(int bar3d(int x1x1,int int y1y1,int int x2x2,int y2int y2,int depthint depth,int topflag)int topflag);l该该函函数数参参数数名名定定义义:topflagtopflag非非0 0时时,画画出出三三维维顶顶,否否则则将将不不画画出出三三维维顶顶,depthdepth决决定定了了三三维维直方图的长度。直方图的长度。与

57、填充函数有关的作图函数l 画椭圆扇形函数画椭圆扇形函数l viod viod far far sector(int sector(int x x,int int y y,int int stanglestangle,int int endang1eendang1e,int int xradiusxradius,int int yradius)yradius);l该该 函函 数数 将将 以以 ( (x x, y)y)为为 圆圆 心心 , 以以 xradiusxradius和和yradiusyradius为为x x轴轴和和y y轴轴半半径径,从从起起始始角角stang1estang1e开开始始到到

58、endang1eendang1e角角结结束束,画画一一椭椭圆圆扇扇形形图图,并并按按设设置置的的填填充充模模式式和和颜颜色色填填充充。当当stang1estang1e为为0 0,endangleendangle为为360360时,则画出一完整的椭圆图。时,则画出一完整的椭圆图。与填充函数有关的作图函数l画椭圆图函数画椭圆图函数l void void far far fillellipse(int fillellipse(int x x, int int y y, int int xradiusxradius,int yradius)int yradius); ”l 该该函函数数将将以以( (x

59、 x,y)y)为为圆圆心心,以以xradiusxradius和和yradiusyradius为为x x轴轴和和y y轴轴半半径径,画画一一椭椭圆圆图图,并并以以设设定定或或缺缺省省模模式式和颜色填充。和颜色填充。l 画多边形图函数画多边形图函数l void void far far fillpoly(int fillpoly(int numpointsnumpoints,int int far far *polypoints)*polypoints)l 该该函函数数将将画画出出一一个个顶顶点点数数为为numpointsnumpoints,各各顶顶点点坐坐标标 由由 polypointspoly

60、points给给 出出 的的 多多 边边 形形 , 也也 即即 边边 数数 为为polypoints-1polypoints-1,当当为为一一封封闭闭图图形形时时,numpohtsnumpohts应应为为多多边边形形的的顶顶点点数数加加1 1,并并且且第第一一个个顶顶点点坐坐标标应应和和最最后后一一个个顶点的坐标相同。顶点的坐标相同。2.9.5 2.9.5 可对任意封闭图形填充的可对任意封闭图形填充的函数函数lsetfillstylesetfillstyle函函数数,只只能能对对由由上上述述特特定定函函数数产产生的图形进行颜色填充,生的图形进行颜色填充,l对任意封闭图形均可进行填充的是函数:对

61、任意封闭图形均可进行填充的是函数:l void void far far floodfill(int floodfill(int x x,int int y y,int int border)border);l 该该函函数数将将对对一一封封闭闭图图形形进进行行填填充充,其其颜颜色色和和模模式式将将由由设设定定的的或或缺缺省省的的图图模模与与颜颜色色决决定定。其其中中参参数数( (x x,y)y)为为封封闭闭图图形形中中的的任任一一点点,borderborder是是封封闭闭图图形形的的边边框框颜颜色色。编编程程时时该该函函数数位于画图形的函数之后,即要填充该图形。位于画图形的函数之后,即要填充该

62、图形。2.10 屏幕操作函数l清屏函数清屏函数cleardevice()cleardevice()l存屏幕图象到内存区:存屏幕图象到内存区:lvoid void far far getimage(int getimage(int x1x1,int int y1y1,int int x2x2,int int y2y2,void void far far *bitmap)*bitmap);将将把把屏屏幕幕左左上上角角为为( (x1x1,y1)y1),右右下下角角为为( (x2x2,y2)y2)矩形区内的图象保存到指针矩形区内的图象保存到指针bitmapbitmap指向的内存区去。指向的内存区去。l

63、为为了了能能开开辟辟一一个个内内存存缓缓冲冲区区,则则必必须须首首先先要要知知道道所所存存图图象象占占多多少少字节,可用测定图象所占字节数的函数:字节,可用测定图象所占字节数的函数:lunsigned unsigned far far imagesize(int imagesize(int x1x1,int int y1y1,int int x2x2,int int y2)y2);该该函函数数将将得得到到屏屏幕幕上上左左上上角角为为( (x1x1,y1)y1),右右下下角角为为( (x2x2,y2)y2)矩矩形形区内图象所占的字节数。区内图象所占的字节数。l将所存图象显示函数将所存图象显示函数

64、lvoid void far far putimage(int putimage(int x1x1,int int y1y1,void void far far *bitmap*bitmap,int int op)op);l该该函函数数将将把把指指针针bitmapbitmap指指向向的的内内存存区区中中所所装装图图象象,与与屏屏上上现现有有左左上角为上角为( (xlxl,y1)y1)的矩形区内图象进行的矩形区内图象进行opop规定的操作后显示在屏上。规定的操作后显示在屏上。2.10.2 设置显示页函数l存储在显示适配器上的图象存储器存储在显示适配器上的图象存储器VRAMVRAM中的一满屏图中的

65、一满屏图象信息称为一页。每个页一般为象信息称为一页。每个页一般为6464K K字节,字节,VRAMVRAM可以存可以存储要显示的图象几个页储要显示的图象几个页( (视视VRAMVRAM容量而定,最大可达容量而定,最大可达8 8页页) )l因存储图象的页显示时,一次只能显示一页,因此必因存储图象的页显示时,一次只能显示一页,因此必须设定某页为当前显示的页须设定某页为当前显示的页( (又称可视页又称可视页) ),缺省时定,缺省时定为为0 0页页l在由用户编辑图形的页称为当前编辑页在由用户编辑图形的页称为当前编辑页( (又称激活的页又称激活的页) )缺省时定为缺省时定为0 0页页l设置激活页和显示页

66、的函数如下:设置激活页和显示页的函数如下:l void far setactivepage(int pagenum);void far setactivepage(int pagenum);l void void far far setvisualpage(int setvisualpage(int pagenum)pagenum);2.11.1 图视口设置函数l void void far far setviewport(int setviewport(int xlxl,int int y1y1,int x2int x2,int y2, clipflag); int y2, clipflag

67、); l 其其中中( (x1x1,y1)y1)为为图图视视口口的的左左上上角角坐坐标标,( (x2x2,y2)y2)为为所所设设置置的的图图视视口口右右下下角角坐坐标标,它它们们都都是是以以原原屏屏幕幕物物理理坐坐标标为为参参考考的的。clipflagclipflag参参数数若若为为非非0 0,则则所所画画图图形形超超出出图图视视口口的的部部分分将将被被切切除除而而不不显显示示出出来来。若若clipflagclipflag为为0 0,则则超超出图视口的图形部分仍将显示出来。出图视口的图形部分仍将显示出来。2.11.2 图视口清除与取信息函数l1 1图视口清除函数图视口清除函数lvoid far

68、 clearviewport(void)void far clearviewport(void)l该函数将清除图视口内的图象。该函数将清除图视口内的图象。l2 2取图视口信息函数取图视口信息函数lvoid void far far getviewsettings(struct getviewsettings(struct viewport viewport type far *viewport)type far *viewport);l 该该函函数数将将取取得得当当前前设设置置的的图图视视口口的的信信息息,它它存存于于由由结结构构viewporttypeviewporttype定定义义的的结结

69、构构变变量量viewportviewport中中2.12 图形方式下的文本输出函数l可以用printf(),puts(),putchar()函数输出文本,但只能在屏上用白色显示,无法选择输出的颜色。l 图形方式下的文本输出函数l1 1当前位置文本输出函数当前位置文本输出函数l void far outtex(char far *textstring)void far outtex(char far *textstring); 该该函数将在当前位置在屏上输出由字符串指针函数将在当前位置在屏上输出由字符串指针textseringtextsering指出的文本字符串。指出的文本字符串。 l 2 2定

70、位文本输出函数定位文本输出函数l void far outtextxy(int xvoid far outtextxy(int x,int yint y,char far char far *textstring)*textstring);该函数将在指定的该函数将在指定的( (x x,y)y)位置输出字位置输出字符串。符串。l3 3文本输出位置函数文本输出位置函数lvoid far settextjustify(int horizvoid far settextjustify(int horiz,int vert);int vert);l该函数将确定输出字位串时,如何定位该函数将确定输出字位串

71、时,如何定位( (x x,y)y)。3.1.1 I/O接口的寻址方式lPCPC机机中中的的8080x86CPUx86CPU采采用用I/OI/O独独立立编编址址方方式式,即即I/OI/O接接口口地地址址和和存存储储器器地地址址分分别别独独立立编编址址。采采用用专专门门的的I/OI/O指指令令来来对对接接口口地地址址进进行操作。行操作。l存存储储器器地地址址和和I/OI/O接接口口地地址址可可以以重重叠叠。由由于于两两者者需需采采用用不不同同的的指指令令进进行行读读写写操操作作,不会由于地址相同而混淆。不会由于地址相同而混淆。接口输入函数lint inport(int portid);int in

72、port(int portid);lint inportb(int portid);int inportb(int portid);linportinport函函数数从从指指定定的的接接口口地地址址portidportid中中读读入入一一个个字字( (即即l6l6位位二二进进制制数数) ),而而inportbinportb则则从从指指定定的的接接口口地地址址pontidpontid中中读读入入一一个个字字节节(8(8位位二二进进制制数数) )。如如I/OI/O接接口口的的寻寻址址方方式式中中所所述述,当当执执行行这这两两个个函函数数后后,它它们们均均返返回回各各自自从从接接口口地地址址所所对对

73、应应的的输输入入设设备备中中得得到到的的1616位位或或8 8位位二二进进制制数数。由由于于,PCPC机机数数据据总总线线是是8 8位位的的,故故inporb()inporb()比比较较 常常 用用 , 而而 inport(portid)inport(portid)实实 际际 上上 执执 行行 了了 两两 次次 inportbinportb()(),即即inportb(portid)inportb(portid)和和inportb(portid+1)inportb(portid+1)。例如:lunsigned char p;unsigned char p;lp=inportb(0x2F0)p=

74、inportb(0x2F0);l它它将将从从2 2F0HF0H接接口口地地址址中中得得到到一一个个字字节节的的数数,并并赋给无符号变量赋给无符号变量p p。lunsigned int c;unsigned int c;lc=inport(0x2F0)c=inport(0x2F0);l它它将将从从2 2F0HF0H和和2 2F1HF1H接接口口地地址址中中分分别别得得到到一一个个字字节节的的数数,然然后后组组合合成成一一个个1616位位的的二二进进制制数数赋赋给给变变量量c c,其其中中2 2F0HF0H接接口口中中得得到到的的数数为为低低字字节节,2 2F1HF1H接口中得到的数为高字节。接口

75、中得到的数为高字节。接口输出函数lint outport(int portidint outport(int portid,int value)int value);lint int outportb(int outportb(int portid portid unsigned unsigned char char value)value);loutportoutport函函数数把把一一个个1616位位二二进进制制数数valuevalue发发送送到到口口地地址址为为portidportid的的接接口口中中去去。对对于于PCPC机机,实实际际上上是是将将低低字字节节数数送送到到口口地地址址为为

76、portidportid接接口口中中去去,将高字节送到口地址为将高字节送到口地址为portid+1portid+1的接口中去。的接口中去。loutportboutportb函函数数是是将将一一个个字字节节的的数数valuevalue送送到到口口地址为地址为portidportid的接口中去。的接口中去。例如:loutportb(0x2F0,385);l它将把整数385送往口地址为2F0H的接口中去。loutport(0x2F2,4095);l它将把4095送到口地址为2F2H和2F3H的接口中去,(化成二进制数的低8位送l2F2H,高8位送2F3H)。3.2 中断服务程序的编写中断服务程序的编

77、写l中断与中断源:中断,中断源是指中断与中断源:中断,中断源是指CPUCPU在正常运行程序在正常运行程序时,由于程序的预先安排或内外部事件,引起时,由于程序的预先安排或内外部事件,引起CPUCPU中断中断正在运行的程序,而转到为预先安排的事件或内外部正在运行的程序,而转到为预先安排的事件或内外部事件服务的程序中去,这些引起程序中断的事件称为事件服务的程序中去,这些引起程序中断的事件称为中断源。中断源。l预先安排的事件,是指预先安排的事件,是指PCPC机的中断指令,执行到此,机的中断指令,执行到此,立即转相应的服务程序去执行。立即转相应的服务程序去执行。l内部事件,是指系统板上出现的一些事件信号

78、,中断内部事件,是指系统板上出现的一些事件信号,中断指令也可看作内部事件。指令也可看作内部事件。l外部事件,是指某些接口设备所发出的请求中断程序外部事件,是指某些接口设备所发出的请求中断程序执行的信号,这些信号称为中断请求信号。执行的信号,这些信号称为中断请求信号。中断中断l中断返回:中断服务程序执行完,返回原来执中断返回:中断服务程序执行完,返回原来执行程序的中断处行程序的中断处( (称为断点称为断点) )继续往下执行,称继续往下执行,称为中断返回。为中断返回。l中断的优先级:有时中断请求信号中断的优先级:有时中断请求信号( (即中断源即中断源) )可能有好几个,因此可能有好几个,因此CPU

79、CPU响应这些中断就得有响应这些中断就得有先后次序,这称为中断的优先级。先后次序,这称为中断的优先级。l中断的屏蔽:中断的屏蔽:CPUCPU首先响应优先级高的中断,首先响应优先级高的中断,优先级低的中断,暂不响应,称为挂起。有些优先级低的中断,暂不响应,称为挂起。有些中断源产生的中断,可以用编程的办法使中断源产生的中断,可以用编程的办法使CPUCPU不予理睬,这叫中断的屏蔽。不予理睬,这叫中断的屏蔽。中断中断lCPUCPU响应中断,转去执行中断服务程序前,需将被中断响应中断,转去执行中断服务程序前,需将被中断程序的现场信息保存下来,以便执行完中断服务程序程序的现场信息保存下来,以便执行完中断服

80、务程序后,接着从被中断程序的断点处继续往下执行。后,接着从被中断程序的断点处继续往下执行。l现场信息是指程序计数器的内容、现场信息是指程序计数器的内容、CPUCPU的状态信息、执的状态信息、执行指令后的结果特征和一些通用寄存器的内容,有些行指令后的结果特征和一些通用寄存器的内容,有些信息的保存和程序计数器的内容等由机器硬件预先安信息的保存和程序计数器的内容等由机器硬件预先安排完成,称为中断处理的隐操作。有些信息保存是在排完成,称为中断处理的隐操作。有些信息保存是在中断服务程序中预先安排。中断服务程序中预先安排。lCPUCPU响应中断时,由中断源提供地址信息,引导程序转响应中断时,由中断源提供地

81、址信息,引导程序转移到中断服务程序中去执行。这个地址信息称为中断移到中断服务程序中去执行。这个地址信息称为中断向量,它一般是和中断源相对应的,向量,它一般是和中断源相对应的,PCPC机采用类型号机采用类型号来标识中断源。来标识中断源。执行下述指令时,将产生或者可能产生中断,这执行下述指令时,将产生或者可能产生中断,这执行下述指令时,将产生或者可能产生中断,这执行下述指令时,将产生或者可能产生中断,这些中断称为软中断。些中断称为软中断。些中断称为软中断。些中断称为软中断。l执行下述指令时,将产生或者可能产生中断,这些中断称为软中断。执行下述指令时,将产生或者可能产生中断,这些中断称为软中断。l1

82、 1DIV(DIV(除除) )或或IDIV(IDIV(整除整除) )指令指令l当当执执行行这这些些除除法法指指令令时时,若若除除数数为为0 0或或商商溢溢出出,则则产产生生中中断断,这这类类中中断断称称为为0 0型中断。型中断。l2 2INTINT指令指令l当当执执行行中中断断指指令令INT INT n n时时,则则产产生生n n型型中中断断。Turbo Turbo C C用用库库函函数数geninterruptgeninterrupt()()lgeninterruptgeninterrupt宏为由宏为由intr_numintr_num给定的中断触发一个软件陷井。给定的中断触发一个软件陷井。l

83、3 3INTOINTO指令指令l若若指指令令序序列列执执行行过过程程中中,上上条条指指令令执执行行的的结结果果,使使溢溢出出标标志志位位O=1O=1,接接着着若若执执行行的的是是INTOINTO指指令令,则则引引起起内内部部中中断断,称称为为4 4型型中中断断,若若溢溢出出标标志志位位O=0O=0,该指令将不起作用。该指令将不起作用。l4 4单步执行单步执行l当当标标志志位位T=1T=1时时,每每执执行行一一条条指指令令,则则引引起起一一次次中中断断,使使得得指指令令的的执执行行,成成为为单单步步执执行行方方式式,这这种种方方式式用用于于程程序序的的调调试试,如如DEBUGDEBUG中中的的跟

84、跟踪踪命命令令T T,就就是是将将标标志志位位T T置置1 1,进进而而去去执执行行一一个个单单步步中中断断服服务务程程序序,单单步步执执行行为为1 1型中断。型中断。CPUCPU有两条中断请求线:非屏蔽中断有两条中断请求线:非屏蔽中断NMINMI和和可屏蔽中断可屏蔽中断INTRINTR线,当这两条线上收到中线,当这两条线上收到中断请求信号而引起的中断,称为硬中断。断请求信号而引起的中断,称为硬中断。l1 1非屏蔽中断非屏蔽中断l当当NMINMI线线上上出出现现一一个个由由低低上上跳跳的的高高电电平平中中断断请请求求信信号号后后( (持持续续时时间间需需大大于于两两个个时时钟钟周周期期) ),

85、不不管管标标志志寄寄存存器器I I位位的的状状态态如如何何,当当前前指指令令执执行行完完后后,8080x86CPUx86CPU马马上上转转入入中中断断处处理理。此此种种类类型型的的中中断断有有三三种种来来源源:系系统统板板上上随随机机存存储储器器RAMRAM产产生生奇奇偶偶错错,协协处处理理器器插插座座上上来来的的中中断断请请求求( (仅仅XTXT机机) ),I/OI/O通道检查出错等,这种中断是在通道检查出错等,这种中断是在PCPC机的系统板上,用户一般是不能用的。机的系统板上,用户一般是不能用的。l2 2可屏蔽中断可屏蔽中断l当当INTRINTR线线上上出出现现高高电电平平的的中中断断请请

86、求求信信号号时时( (必必须须保保持持到到当当前前执执行行的的指指令令结结束束为为止止) ),8080x86x86是是否否响响应应该该中中断断,取取决决于于标标志志寄寄存存器器I I位位的的状状态态,若若I=1I=1,则则CPUCPU处处于于开开中中断断,因因而而可可以以响响应应,若若I=oI=o,则则CPUCPU不不响响应应。I I的的状状态态,可可以以由由汇汇编编设设置置,若若执执行行开开中中断断指指令令STISTI,则则I I位位被被置置1 1,Turbo Turbo C C有有此此功功能能的的是是库库函函数数enable()enable(),若若执执行行关关中中断断指指令令CLICLI

87、,则则I I位位被被清清零零。Turbo Turbo C C有此功能的库函数是有此功能的库函数是disable()disable()。ldisabledisable宏宏屏屏蔽蔽中中断断,只只有有从从外外设设来来的的不不可可屏屏蔽蔽中中断断( (NMI)NMI),仍仍然然是是允允许许的。的。lenableenable宏开放中断,可以允许任何设备中断发生。宏开放中断,可以允许任何设备中断发生。l鼠标及汉字库内容鼠标及汉字库内容鼠标驱动程序主要功能鼠标驱动程序主要功能鼠标功能调用方法 用TC通过INT33H中断来编制基本函数,有三种常用方法:l嵌入汇编程序,如:ASM CLI清中断l利用全程变量赋予

88、寄存器值,然后通过函数geninterrupt( )调用中断实现l利用联合类型REGS,SREGS通过函数int86(),int86x()调用中断,原型在dos.h鼠标的初始化InitMouse() union REGS regs; regs.x.ax=0; int86(0x33,®s,®s); if(regs.x.ax=0) return false;else return true;鼠标光标的隐藏HideCur() union REGS regs; if(visual) regs.x.ax=2; int86(0x33,®s,®s); visual=false;鼠标光

89、标的显示ShowCur() union REGS regs; if(!visual) regs.x.ax=1; int86(0x33,®s,®s); visual=true;鼠标光标的显示与隐藏 在鼠标驱动程序中,鼠标的显示状态用0值表示,隐藏用负值表示,每调用一次显示功能则该值加一,每调用一次隐藏功能,则该值减一。这样,在多次调用了驱动程序的隐藏鼠标光标功能后,再调用显示鼠标光标功能时,将不能正常显示鼠标光标。需要加入一个visual布尔型变量,来取代驱动程序中的数值。读取鼠标的状态Status( ) union REGS regs; regs.x.ax=3; int86(0x3

90、3,®s,®s);x=regs.x.cx; y=regs.x.dx;status=regs.x.bx;读取鼠标的状态l其中X,Y为光标位置lstatus&1左键状态,1为按下,0为未按lstatus&2右键状态,1为按下,0为未按lstatus&4中键状态,1为按下,0为未按 要注意循环检测时的抖动现象,可增加一些空循环或延时来清除剩余的按键信号。设置光标位置void MoveMouse(int x,int y) REGS regs; regs.x.ax=4; regs.x.cx=x; regs.x.dx=y; int86(0x33,®s,®s);设置鼠标光标形状设置鼠

91、标光标需要三个方面信息:l鼠标的外边界:8*8点阵,16个整数l鼠标的内部形状:8*8点阵,16个整数l以及鼠标的热点的相对坐标:int x,yl其中外边界和内边界连续存放,为长度为32的整型数组 int marks32设置鼠标光标形状SetCurs(unsigned masks32,x,y) union REGS regs; struct SREGS sregs;regs.x.ax=9; regs.x.bx=x; regs.x.cx=y;/* hot spot*/ regs.x.dx=(unsigned)masks; segread(&sregs); int86(0x33,®s,&re

92、gs);手的光标数据l 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, /*cursor mask*/l 0x0c00, 0x1200, 0x1200, 0x1200, 0x13fe, 0x1249, 0x1249, 0x1249, 0x7249, 0x9001, 0x9001, 0x9001, 0x8001, 0x8001, 0x4002, 0x3ffc /*cursor mask*/l

93、4,0 /*hot spot*/设置鼠标的移动范围SetMouseArea(int x0,int y0,int x1,int y1) union REGS regs;regs.x.ax=7;regs.x.cx=x0;regs.x.dx=x1;int86(0x33,®s;®s);regs.x.ax=8;regs.x.cx=y0;regs.x.dx=y1;int86(0x33,®s,®s);西文状态下汉字的显示l汉字库简介l取得字节的某一位l显示24点阵汉字l显示16点阵汉字l在字库中取字模汉字库简介 程序中可直接使用UCDOS中的HZK16,ASC16和HZK24三个文件

94、。lHZK16中存储的是16*16点阵汉字是按行存储的以便于显示,每个汉字字模32BYTE,按照国标码顺序存储,其中也包含了682个纯中文符号字母。汉字库的情况lASC16存储256个西文ASCII码的8*16点阵格式,按行存储,每个ASCII码16字节。lHZK24X存储24*24点阵打印字模,按列存储,每个汉字字模占576字节。24*24点阵汉字存储两比较大,所以从16区1位“啊”字开始存储,以减少字库大小。其中X为KS表示楷体,宋体等。取得字节某一位的值int getbit(unsigned char byte,int bit) if(bit7)return 0; return (byt

95、ebit)&0x1;函数getbit用于得出一个字节中每个位(bit)是0还是1。显示24点阵的汉字void PutChn24(x,y,char *by,color) int i1,i2,i3; for(i1=0;i124;i1+) /LINES for(i2=0;i23;i2+) /3 bytes per line for(i3=0;i38;i3+)f(getbit(byi1*3+i2,7-i3) putpixel(x+i1,y+(i2*8+i3),color);显示16点阵的汉字void PutChn16(x,y,char* buf,color) int i1,i2,i3; for(i1=

96、0;i116;i1+) for(i2=0;i22;i2+) for(i3=0;i38;i3+)if(getbit(bufi1*2+i2,7-i3) putpixel(x+i2*8+i3,y+i1,color);在字库中找字模l qu= c1 - 0xa1; wei= c2 - 0xa1;l通过计算个计算出该区位码在汉字库中的偏移量:lenth = 32llong offset=(qu) * 94 + wei) * (long) lenth;l24*24点阵汉字字模的读取类似,只是其偏移量计算稍有不同:lenth=72llong offset=(qu-15)* 94+ wei)* (long) lenth;DOS下如何发声在dos.h下,有如下三个函数可以处理声音:lsound (long freq):发出特定频率的声音lnosound( ):停止发声ldelay( ):延时特定时间良好的程序设计风格l使用有意义的变量名l匈牙利式命名法l文档的模块化组织(缩进、对齐)l自顶向下的设计方法l增加程序的可读性(增加注释)l不要滥用语言技巧

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号