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

📄 88.txt

📁 电子琴的设计
💻 TXT
字号:
DATA     SEGMENT                     ;DATA1为正弦波数据,TIME为发不同音时8253的计数初值
DATA1    DB      80H,96H,0AEH,0C5H,0D8H,0E9H,0F5H,0FDH   ;数据区
         DB      0FFH,0FDH,0F5H,0E9H,0D8H,0C5H,0AEH,96H
         DB      80H,66H,4EH,38H,25H,15H,09H,04H
         DB      00H,04H,09H,15H,25H,38H,4EH,66H
TIME     DB      120,106,94,89,79,70,63,59
MSG      DB      'PRESS 1,2,3,4,5,6,7,8,ESC:',0DH,0AH,'$'
NUM      DB      ?                   ;NUM为8253计数器初值序号
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                  ;显示提示信息
SSS:     MOV    AH,7
         INT    21H                  ;从键盘接收字符,不回显
         CMP    AL,1BH
         JE     EXIT                 ;若为ESC键,则转EXIT
         CMP    AL,31H
         JL     SSS
         CMP    AL,38H
         JG     SSS                  ;若不在'1'-'8'之间则转SSS
         SUB    AL,31H
         MOV    NUM,AL               ;求出相应的时间常数的序号
         MOV    CX,60                ;取60次32个正弦波数据
DDD:     MOV    SI,0
LLL:     MOV    AL,DATA1[SI]         ;取正弦波数据
         MOV    DX,0DC00H
         OUT    DX,AL                ;放音
         CALL   DELAY                ;调延时子程序
         INC    SI
         CMP    SI,32                ;是否取完32个数据
         JL     LLL                  ;若没有,则继续
         LOOP   DDD                  ;总循环次数60是否完,没有则继续
         JMP    SSS
EXIT:    MOV    AH,4CH
         INT    21H
DELAY    PROC   NEAR                 ;延时子程序
CCC:     MOV    BX,OFFSET TIME
         MOV    DX,0DC43H              ;置8253通道0为方式0工作
         MOV    AL,10H   
         out    DX,AL
         MOV    DX,0DC60H                 ;设8255A口输入
         MOV    AL,9BH
         OUT    DX,AL
         MOV    AL,NUM               ;取相应的时间常熟
         XLAT
         MOV    DX, 0DC43H
         OUT    DX,AL                ;向8253通道0输出
KKK:     MOV    DX,0DC60H
         IN     AL,DX                ;从8255A口读一字节
         TEST   AL,01                ;判断PA0口是否为1
         JZ     KKK                  ;若不为1,则转KKK
         RET                         ;子程序返回
DELAY    ENDP
CODE     ENDS
         END    START
    

⌨️ 快捷键说明

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