资源描述:
《DOS下的中断编程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、typedefunsignedshortWORD;WORDwGlobal_SystemDivide=2;WORDwGlobal_SystemCounter=0;//函数原型:voidChangeSystemTimer(WORDwDivide)//函数作用:改变系统定时器//入口参数:WORDwDivide----分频数,取值在1~16之间//wDivide=1时,每秒中断(18.2*pow(2,1-1)次,即54.94mS中断一次//wDivide=X时,每秒中断(18.2*pow(2,X-1))次//出口参数:无//
2、返回值:无//传递参数时用"wGlobal_SystemDivide"全局变量voidChangeSystemTimer(WORDwDivide){//时钟是1.1931817MHz//计算计数值WORDwTimer=(WORD)((65536L>>(wDivide-1u)));//选择计数器0,先低后高读/写入,模式3,二进制数计数asmmoval,00110110B//36Hasmout43H,al//选择模式asmmovax,wTimerasmout40H,Al//写入低字节asmmoval,ahasmout40
3、H,Al//写入高字节return;}//中断0x1C需要修改voidfarinterruptNewInt1C(){//在中断函数里面不要执行浮点运算,否则需要保护数学协处理器FCU,指令是FSave,FWait和frstorasmmovax,segwGlobal_SystemCounterasmmovds,axif((++wGlobal_SystemCounter)>=(1<<(wGlobal_SystemDivide-1))){wGlobal_SystemCounter=0;//这里调用老的中断1CH}//这里执行
4、您自己的函数//...return;}//需要修改老的delay函数voidNewDelay(WORDwMilloSeconds){for(inti=0;i<(1<<(wGlobal_SystemDivide-1));i++){//这里有错,以后修改::delay(wMilloSeconds);}}首先要学会对8253编程,然后学会中断处理,用后台处理程序!你先看看下面的介绍吧:(一):8253原理及编程PC机采用一块8253定时器芯片计算系统时钟的脉冲,若干个系统时钟周期转换成一个脉冲,这些脉冲序列可以用以计时,也可
5、以送入计算机的扬声器产生特定频率的声音。8253定时器芯片独立于CPU运行,它可以象实时时钟那样,CPU的工作状态对它没有任何影响。 8253芯片有三个独立的通道,每个通道的功能各不相同,三个通道的功能如下:通道0:为系统时钟所用,在启动时由BIOS置入初值,每秒钟约发出18.2个脉冲,脉冲的计数值存放在BIOS数据区的0040:006c储单元中(注意,这个单元的内容对我们非常有用!),通道0的输出脉冲作为申请定时器中断的请求信号,还用于磁盘的某些定时操作,如果改变了通道0的计数值,必须确保在CPU每次访问磁盘以
6、前恢复原来的读数,否则将使磁盘读写产生错误。通道1:用于控制计算机的动态RAM刷新速率,一般情况下不要去改变它。通道2:连接计算机的扬声器,产生单一的方波信号控制扬声器发声。8253定时器芯片的每一个通道含有3个寄存器,CPU通过访问3个端口(通道0为40h,通道1为41h,通道2为42h)来访问各个端口的3个寄存器,8253每个端口有6种工作模式,当通道0用于定时或通道2用于定时或发声时,一般用模式3。在模式3下,计数值被置入锁存器后立即复制到计数器,计数器在每次系统时钟到来时减1,减至0后一方面马上从锁存器中重新读
7、取计数值,另一方面向CPU发出一个中断请求(INT 1CH中断,很有用),如此循环在输出线上高低电平的时间各占计数时间的一半,从而产生方波输出。 对8253定时器芯片编程是通过命令端口寄存器(控制字寄存器)43h来实现,它决定选用的通道、工作模式、送入锁存器的计数值是一字节还是两字节、是二进制码还是BCD码等工作参数,端口43h各位的组合形式如下: 控制字寄存器各位的功能表示 D7 D6 D
8、5 D4 D3 D2 D1 D0 ---------------------------------------------------
9、 SC1 SC0
10、 RL1 RL0
11、 M2 M1 M0
12、