汇编实现乐曲演奏《两只老虎》
1.原理(1)定義音符和節拍:音符根據表格。 節拍根據12,25,50存入,根據公式計算脈沖和持續時間。 (2)通過不斷變換端口61h第一位的值,控制開關電路發出一串脈沖。 2.代碼datas segment ;定義音頻表 freq? dw??? 2 dup(262,294,330,262) ????? dw????? 2 dup(330,349,392) ????? dw????? 2 dup(392,440,392,349,330,262) ????? dw??? ??2 dup(294,196,262) ;定義節拍表??? 一個數字為一拍(25),56加下劃線為每一個數字半個節拍(12)? 5 ——為兩個節拍(50) beat??? dw????? 10 dup(25),50 ??????? dw????? 2 dup(25),50,4 dup(12),25,25,4 dup(12),25,25 ????? dw??? 25,25,50,25,25,50 datas ends codes segment main proc far ?? assume cs:codes,ds:datas ?? org 100h ?? start: ???????? mov ax,datas ????? ?mov ds,ax ????? ?mov cx,32d ????? ?lea si,freq ????? ?lea di,beat ?? play: ?? ???? push cx ????? ?call player ????? ?add si,2d ????? ?add di,2d ????? ?pop cx ????? ?loop play ????? ?mov al,48h ????? ?out 61h,al ????? ? ????? ?mov ah,4ch ????? ?int 21h main endp ;播放一個字符 player? proc? near ????? ;將音符的頻率轉化為控制脈沖寬度的計數值?? 75頁 脈寬 = 2801 * 50 / freq ?? ? mov ax,2801 ?? ? mov bx,50 ?? ? mul bx?? ?? ? mov bx,[si] ;取出在freq中的對應的音符的頻率 ?? ? div bx;計算脈寬 ?? ? mov dx,ax? ;存放脈寬 ?? ? ?? ? push dx? ;16位的乘法,結果放在ax? dx中 ?? ? ;計算節拍? 節拍決定了各音頻持續的時間 ?? ??mov bx,[di] ?? ? mov ax,120? ;? 8太快 ?? ? mul bx?? ;16位的乘法,結果放在ax bx中 ?? ? mov bx,ax ?? ? ;位觸發模式發聲?? ?? ? in al,61h ?? ? mov ah,al ?? ? and al,11111100b ?? ? ?? ? pop dx ?? silent: ?? ? xor al,2 ?? ? out 61h,al ?? ? mov cx,dx ?? wait1: ?? ? loop wait1 ?? ? dec bx ?? ? jnz silent ?? ? ?? ? mov al,ah ?? ? out 61h,al ?? ? ret ?? ? player endp ? codes ends ???? end start |
總結
以上是生活随笔為你收集整理的汇编实现乐曲演奏《两只老虎》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 倒计时、定时器的五种方式,有这篇就够了
- 下一篇: 1998年11月11日,马化腾和同学张志