📄 88.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 + -