DOS下的中断编程.doc_第1页
DOS下的中断编程.doc_第2页
DOS下的中断编程.doc_第3页
DOS下的中断编程.doc_第4页
DOS下的中断编程.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

typedef unsigned short WORD;WORD wGlobal_SystemDivide = 2;WORD wGlobal_SystemCounter = 0;/函数原型:void ChangeSystemTimer(WORD wDivide)/函数作用:改变系统定时器/入口参数:WORD wDivide - 分频数,取值在116之间/ wDivide = 1时,每秒中断(18.2 * pow(2,1- 1)次,即54.94mS中断一次/ wDivide = X时,每秒中断(18.2 * pow(2,X-1)次/出口参数:无/返 回 值:无/传递参数时用wGlobal_SystemDivide全局变量void ChangeSystemTimer(WORD wDivide) /时钟是1.1931817MHz /计算计数值 WORD wTimer = (WORD)(65536L (wDivide - 1u); /选择计数器0, 先低后高读/写入,模式3,二进制数计数 asm mov al, 00110110B /36H asm out 43H, al /选择模式 asm mov ax, wTimer asm out 40H, Al /写入低字节 asm mov al, ah asm out 40H, Al /写入高字节 return;/中断0x1C需要修改void far interrupt NewInt1C() /在中断函数里面不要执行浮点运算,否则需要保护数学协处理器FCU,指令是FSave,FWait和frstor asm mov ax, seg wGlobal_SystemCounter asm mov ds, ax if (+wGlobal_SystemCounter) = (1 (wGlobal_SystemDivide - 1) wGlobal_SystemCounter = 0; /这里调用老的中断1CH /这里执行您自己的函数 /. return;/需要修改老的delay函数void NewDelay(WORD wMilloSeconds) for (int i = 0; i (1 (wGlobal_SystemDivide - 1); i+) /这里有错,以后修改 :delay(wMilloSeconds); 首先要学会对8253编程,然后学会中断处理,用后台处理程序!你先看看下面的介绍吧:(一):8253原理及编程PC机采用一块8253定时器芯片计算系统时钟的脉冲,若干个系统时钟周期转换成一个脉冲,这些脉冲序列可以用以计时,也可以送入计算机的扬声器产生特定频率的声音。8253定时器芯片独立于CPU运行,它可以象实时时钟那样,CPU的工作状态对它没有任何影响。8253芯片有三个独立的通道,每个通道的功能各不相同,三个通道的功能如下:通道0:为系统时钟所用,在启动时由BIOS置入初值,每秒钟约发出18.2个脉冲,脉冲的计数值存放在BIOS数据区的0040:006c储单元中(注意,这个单元的内容对我们非常有用!),通道0的输出脉冲作为申请定时器中断的请求信号,还用于磁盘的某些定时操作,如果改变了通道0的计数值,必须确保在CPU每次访问磁盘以前恢复原来的读数,否则将使磁盘读写产生错误。通道1:用于控制计算机的动态RAM刷新速率,一般情况下不要去改变它。通道2:连接计算机的扬声器,产生单一的方波信号控制扬声器发声。8253定时器芯片的每一个通道含有3个寄存器,CPU通过访问3个端口(通道0为40h,通道1为41h,通道2为42h)来访问各个端口的3个寄存器,8253每个端口有6种工作模式,当通道0用于定时或通道2用于定时或发声时,一般用模式3。在模式3下,计数值被置入锁存器后立即复制到计数器,计数器在每次系统时钟到来时减1,减至0后一方面马上从锁存器中重新读取计数值,另一方面向CPU发出一个中断请求(INT1CH中断,很有用),如此循环在输出线上高低电平的时间各占计数时间的一半,从而产生方波输出。对8253定时器芯片编程是通过命令端口寄存器(控制字寄存器)43h来实现,它决定选用的通道、工作模式、送入锁存器的计数值是一字节还是两字节、是二进制码还是BCD码等工作参数,端口43h各位的组合形式如下:控制字寄存器各位的功能表示D7D6D5D4D3D2D1D0-|SC1SC0|RL1RL0|M2M1M0|BCD|-D0位_若为0则采用二进制表示,否则用BCD码表示计数值。D3-D1位_工作模式号,其值(0-5)对应6种模式。D5-D4位_操作的类型:00:把通道中当前数据寄存器的值送入16位锁存器中,供CPU读取该值;01:表示只读/写低8位字节数据,只写入低8位时,高8位自动置为0;10:表示只读/写高8位字节数据,只写入高8位时,低8位自动置为0;11:允许读/写16位字数据,8253的数据线只有8位,读/写时必须分两次进行,先读/写低8位字节,再读/写高8位字节;D7-D6位_决定选用的通道号,其值为0-2。对8253芯片编程的三个步骤:1设置命令端口43h:设置控制字,用来选择通道、工作模式、传输方式等,以备传输。2向端口发送一个工作状态字节:将一个字的计数值,按先低字节后高字节的顺序送入通道的I/O端口寄存器(通道0为40h,通道1为41h,通道2为42h)。/即设置技术初值3确定定时器的工作方式:若是通道2,给端口61h(8255芯片接口)的第0位和第1位置数,启动时钟信号,当第1位置1时,通道2驱动扬声器,置0时用于定时操作;当第3个步骤完成后被编程的通道马上在新的状态下开始工作。由于8253的三个通道都独立于CPU运行,所以在程序结束以前要恢复各通道的正常状态值。(二)在后台运行程序所谓后台运行就是在游戏运行当中“同时“运行其它的程序,如在游戏中演奏背景音乐、游戏计时等,这些工作看起来好象与游戏过程“同时“在进行。这里的“同时“其实就是利用中断的方法来实现的,即在游戏中每隔一定时间产生一次中断去做其他工作,完成后再回到游戏中。在BIOS中包含了一个特殊的伪中断-INT1CH中断,这一中断在BIOS初始化时没有任何作用,它的中断处理程序只有一条中断返回语句-IRET,因此该中断一经调用立即返回。INT1CH中断是在BIOS中断INT8H修正日历计数后由该中断调用,和INT8H中断程序一起以定时器中断频率(正常情况下为每秒钟18.2次)不停地执行而与CPU无关,我们可以改变这一中断,使它指向我们的中断处理程序,当我们改变了时间定时器的值以后,INT1CH程序将按改变后的频率被调用。重置INT1CH中断向量前必须先保存好原来的INT1CH中断向量,以便在我们的程序运行结束时再恢复它,否则将引起系统崩溃。另外,中断处理程序的处理时间不能超过定时器确定的时间,否则将死机,所以在中断处理程序里不能运行太多的代码,也不能调用与C相关的函数,如sound,delay等。编写新的INT1CH中断程序的方法如下:1.设置一个中断类型的函数指针用来保存原先的INT1CH中断向量:voidinterruptfar(*OldInt1chHandler)();2.编写新的INT1CH中断程序:voidfarinterruptNewInt1ch(void)/*我们的中断程序*/3.保存原来的INT1CH中断向量:OldInt1chHandler=getvect(0x1c);4.设置新的INT1CH中断向量:setvect(0x1c,NewInt1ch);5.恢复旧的INT1CH中断程序:setvect(0x1c,OldInt1chHandler);看了这些后我想你应该明白怎么做了。下面是一个简单的带背景音乐的动画程序,你看看有没有不明白的:(只要看怎样设置中断处理来添加背景音乐就行了)#include#include#include#include#include#defineN164#defineN232#defineN416#defineN88#defineN164#defineEND0voidinterrupt(*handler)();voidinterruptmusic();inthandle,control;enumNOTESC10=131,D10=147,E10=165,F10=175,G10=196,A10=220,B10=247,C0=262,D0=296,E0=330,F0=349,G0=392,A0=440,B0=494,C1=523,D1=587,E1=659,F1=698,G1=784,A1=880,B1=988,C2=1047,D2=1175,E2=1319,F2=1397,G2=1568,A2=1760,B2=1796song=E1,N4,E1,N8,E1,N8,F1,N4,G1,N4,F1,N4,F1,N4,E1,N4,D1,N4,C1,N4,C1,N4,D1,N4,E1,N4,E1,N4,D1,N4,D1,N4,E1,N4,E1,N8,E1,N8,F1,N4,G1,N4,G1,N4,F1,N4,E1,N4,D1,N4,C1,N4,C1,N4,D1,N4,E1,N4,D1,N4,D1,N4,C1,N4,D1,N4,D1,N8,D1,N8,E1,N4,C1,N4,D1,N4,E1,N8,F1,N8,E1,N4,C1,N4,D1,N4,E1,N8,F1,N8,E1,N4,C1,N4,C1,N4,D1,N4,G0,N4,E1,N4,E1,N4,E1,N8,F1,N4,G1,N4,G1,N4,F1,N4,E1,N4,D1,N4,C1,N4,C1,N4,D1,N4,E1,N4,E1,N4,D1,N4,C1,N4,D1,N4,END,END;main()intgdriver=VGA,gmode=1,i;initgraph(&gdriver,&gmode,);handler=getvect(0x1c);setvect(0x1c,music);cleardevice();setbkcolor(BLUE);setcolor(YELLOW);setfillstyle(SOLID_FILL,RED);sector(200,150,50,120,70,50);bar3d(400,150,500,200,10,5);setactivepage(1);sector(200,150,50,170,70,50);bar3d(400,200,500,250,10,5

温馨提示

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

评论

0/150

提交评论