⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tan.asm

📁 以前自己学习汇编弹琴的一个好东西
💻 ASM
字号:
data segment
    ;对应中音1 ~ 7和高音i的定时器记数初值 
    table dw 2277,2138,1808,1709
          dw 1522,1356,1208,1139
data ends 

code segment
    assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
    
    mov al,0b6h ;设置定时器2工作方式 
    out 43h,al 
again: mov ah,1 ;等待按键 
    int 21h 
    cmp al,'1';判断是否为数字1~8 
    jb next 
    cmp al,'8' 
    ja next 
    sub al,30h  ;1~8的ASCII码转换为二进制数 
    sub al,1    ;再减1,将数字1~8变为0~7,以便查表 
    xor ah,ah   ;ah清0 
    shl ax,1    ;乘以2 
    mov bx,ax   ;记数值表是16位数据,无法采用xlat指令 
    mov ax,table[bx]    ;取出对应的记数值 
    out 42h,al  ;设置定时器2的记数值 
    mov al,ah 
    out 42h,al 
    in al,61h   ;打开扬声器声音 
    or al,03h   ;使D1D0=PB1PB0=11b,其他位不变 
    out 61h,al 
    jmp again   ;连续发声,直到按下另一个键 
next: push ax 
    in al,61h   ;不是数字1~8,则关闭扬声器声音 
    and al,0fch ;使D1D0=PB1PB0=00b,其他位不变  
    out 61h,al 
    pop ax 
    cmp al,1bh  ;判断是否为ESC键(对应ASCII码1bh) 
    jne again   ;不是ESC,继续;否则程序执行结束
code ends
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -