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

📄 dianziqin.asm

📁 电子琴
💻 ASM
字号:
;*******************************;
;*         电子琴实验          *;
;*******************************;

data segment
io8255a        equ 288h
io8255c        equ 28ah
io8255b        equ 28bh
io8253a     equ 280h
io8253b        equ 283h
table dw 660,660,698,784,784,698,660,588,524,524,588,660,660,588,588;高音的
table1 dw 784,784,698,660,588,588,588,660,698,660;低音的
K     db ?
mydata  dw ?
mysign db ?
msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'
data ends

code segment
assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax

    mov dx,offset msg
    mov ah,9
    int 21h              ;显示提示信息
    
    mov dx,io8255b          ;设置8255 A口输出
    mov al,10000001B
    out dx,al
    mov byte ptr[mysign],00000000b
    
restart:
    mov cx,0
    mov dx,io8255c
    in  al,dx
    and al,00000011b
    cmp al,00000000b
    je  restart
    cmp al,00000001b
    je  sing
    cmp al,00000010b
    je  song2
    cmp al,00000011b
    je  change

change:
    mov byte ptr[mysign],00000001b
sing:  
    mov byte ptr[K],00000001b
    mov word ptr [mydata],30
    ;mov ah,7
    ;int 21h              ;从键盘接收字符,不回显
    ;cmp al,1bh
    ;je finish            ;若为ESC键,则转finish
    ;cmp al,'1'
    ;jl  sing
    ;cmp al,'8'
    ;jg sing              ;若不在'1'-'8'之间转sing
    
    ;sub al,31h
    ;shl al,1             ;转为查表偏移量
    ;mov bl,al            ;保存偏移到bx
    ;mov bh,0
    mov bx,cx
    
    mov ax,4240H         ;计数初值 = 1000000 / 频率, 保存到AX
    mov dx,0FH
    div word ptr[table+bx]
    mov bx,ax
    jmp output
    
song2:
    mov byte ptr[K],00000010b
    mov word ptr [mydata],20    
    mov bx,cx
    
    mov ax,4240H         ;计数初值 = 1000000 / 频率, 保存到AX
    mov dx,0FH
    div word ptr[table1+bx]
    mov bx,ax
output:    mov dx,io8253b          ;设置8253计时器0方式3, 先读写低字节, 再读写高字节
    mov al,00110110B
    out dx,al

    mov dx,io8253a         
    mov ax,bx
    out dx,al            ;写计数初值低字节
    
    mov al,ah
    out dx,al            ;写计数初值高字节
    
    mov dx,io8255a            
    mov al,03h
    out dx,al            ;置PA1PA0 = 11(开扬声器)
    call delay           ;延时
    mov al,0h
    out dx,al            ;置PA1PA0 = 00(关扬声器)
    
    inc cx
    inc cx
    cmp cx,mydata
    je changesign
    
    cmp K,00000001b
    je  sing
    cmp K,00000010b
    je  song2
    
    ;jmp sing
changesign:
     cmp mysign,00000001b
     je reset
     cmp cx,mydata
     je restart1

reset:
    mov cx,0
    jmp song2
restart1: jmp restart 

finish:
    mov ax,4c00h
    int 21h
    
delay proc near          ;延时子程序
    push cx
    push ax
    mov ax,15
x1: mov cx,0ffffh
x2: dec cx
    jnz x2
    dec ax
    jnz x1
    pop ax
    pop cx
    ret
delay endp
code ends
end start

⌨️ 快捷键说明

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