![]() | 第4章 奇妙的声音 | -59- | |||||||||||||||||||
了91,算出循环终止时的计数值并保存到BX寄存器中。而后在一个循环中反复取计数值,并将低16位同BX中的计数终值相比较,当两者相等时说明已经到了5秒,此时退出循环关闭定时器通道3。这样就完成了5秒钟的发声。 和用LOOP指令定时相比,这种新的定时方法有很大的优越性:首先这种方法编程方便;其次这种方法在不同的机型上延迟时间都相等,因为PC系列机的08H中断都是每秒18.2次。此方法唯一的不足是最短延迟时间是55Ms,如果想获得更短的延迟时间只能提高08H中断的产生频率,这样的问题比较复杂,本书将不再讨论。 掌握了控制频率和时间的方法,就可以编制出演奏音乐的程序了。请看下面的乐谱: |
|||||||||||||||||||||
![]() |
|||||||||||||||||||||
识谱的朋友马上就能唱出这段旋律,将程序MUSIC.ASM编译并运行,计算机也会为你奏出这首动听的歌。 | |||||||||||||||||||||
MUSIC.ASM DATA FREQ NOTE DL_TIME DATA CODE MAIN |
SEGMENT ASSUME DS:DATA DW 0,4552,4029,3617,3415 DW 3042,2710,2415,2279 DB 3,2,1,2,3,3,3,2,2,2 DB 3,5,5,3,2,1,2,3,3,3 DB 3,2,2,3,2,1,-1 DB 4,4,4,4,4,4,8,4,4,8 DB 4,4,8,4,4,4,4,4,4,4 DB 4,4,4,4,4,8 ENDS SEGMENT ASSUME CS:CODE PROC FAR MOV AX,DATA MOV DS,AX MOV AL,10110110B OUT 43H,AL |
;定义各频率对应的N值 ;定义乐谱,-1表示结束 ;定义各音符的节拍 ;取数据段地址 ;设定DS ;初始化8253 TIMER 2 |
|||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |