?? recorder final.asm
字號:
;DIGITAL RECORDER DESIGN
;Use nested procedure to program
;Press 'r' to record.
;Press 'p' to play.
;Press ESC to quit.
;72H is an ASCII of 'r'
;70H is an ASCII of 'p'
;1BH is an ASCII of ESC key
;Set flag BL.When BL=1,it means you can play it which you had recorded before,
;otherwise it'll display a message of WARNING
;11*******************************************************************************
DATA SEGMENT
ioport equ 0dd80h-280h
io8253a equ ioport+280h;8253的A口地址
io8253b equ ioport+283h;8253的控制字
io8255a equ ioport+288h;8255的A口地址
io8255b equ ioport+28bh;8255的控制字
io0832a equ ioport+290h;DAC0832入口地址
io0809a equ ioport+29ah;ADC0809的IN2通道的地址
RECMSG1 DB "Press 'r' to record.",0dh,0ah,'$'
RECMSG2 DB 0dh,0ah,"Record complete!Congratulation!",0dh,0ah,0dh,0ah,'$'
PLYMSG1 DB "Press 'p' to play.",0dh,0ah,'$'
PLYMSG2 DB 0dh,0ah,"Play complete!Congratulation!",0dh,0ah,0dh,0ah,'$'
EXITMSG DB "Press ESC to quit.",0dh,0ah,'$'
WARNMSG DB 0dh,0ah,"Haven't record anything yet!",0dh,0ah,"Or wrong input character!",0dh,0ah,0dh,0ah,'$'
BUF DB 60000 DUP(?)
DATA ENDS
;30*******************************************************************************
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;-------------------------------------------------------------------------------
MAIN PROC FAR
START:
PUSH DS
SUB AX,AX
PUSH AX
SUB BX,BX
PUSH BX
;41
MOV AX,DATA
MOV DS,AX
NOTICE:
MOV DX,OFFSET RECMSG1;顯示錄音提示"Press 'r' to record."
MOV AH,09H
INT 21H
MOV DX,OFFSET PLYMSG1;顯示放音提示"Press 'p' to quit."
MOV AH,09H
INT 21H
MOV DX,OFFSET EXITMSG;顯示退出提示"Press ESC to quit."
MOV AH,09H
INT 21H
CONTROL:
MOV AH,1;鍵盤輸入并回顯
INT 21H
CMP AL,72H;小寫'r'的ASCII碼
JE REC;若是'r'則轉AD
CMP AL,70H;小寫'p'的ASCII碼
JE FLAG
CMP AL,1BH;ESC鍵的ASCII碼
JE EXIT;若是ESC鍵,則退出
JNE WARNING
REC:
CALL RECORDING;調用錄音子程序
MOV DX,OFFSET RECMSG2;顯示錄音完畢提示Record complete!Congratulation!
MOV AH,09H
INT 21H
MOV BL,1;BL=1表明程序已經進行了錄音,可以執(zhí)行放音,否則顯示WARNING信息
;MOV AL,0;AL清零
JMP NOTICE
FLAG:
CMP BL,1;判斷BL是否為1
JE PLY;若是1,則轉PLAY
JNE WARNING
PLY:
CALL PLAY;調用放音子程序
MOV DX,OFFSET PLYMSG2;顯示放音完畢提示Play complete!Congratulation!
MOV AH,09H
INT 21H
JMP NOTICE
WARNING:
MOV DX,OFFSET WARNMSG
MOV AH,09H
INT 21H
;顯示警告信息Haven't record anything yet!Or wrong input character!
JMP NOTICE
EXIT:
MOV AH,4CH
INT 21H
RET
MAIN ENDP
;94-------------------------------------------------------------------------------
RECORDING PROC NEAR;錄音子程序
PUSH SI
PUSH AX
PUSH CX
PUSH DX
MOV SI,OFFSET BUF
MOV CX,60000
AD:
MOV DX,io0809a;ADC0809IN2通道地址29ah
OUT DX,AL;啟動一次AD轉換
CALL DELAY;調用延時子程序
IN AL,DX
MOV [SI],AL
INC SI
LOOP AD
POP DX
POP CX
POP AX
POP SI
RET
RECORDING ENDP
;118-------------------------------------------------------------------------------
PLAY PROC NEAR;放音子程序
PUSH DI
PUSH AX
PUSH CX
PUSH DX
MOV DI,OFFSET BUF
MOV CX,60000
MOV DX,io0832a;DAC0832的入口地址
DA:
MOV AL,[DI]
OUT DX,AL
CALL DELAY
INC DI
LOOP DA
POP DX
POP CX
POP AX
POP DI
RET
PLAY ENDP
;141-------------------------------------------------------------------------------
DELAY PROC NEAR;延時子程序
PUSH AX
PUSH DX
MOV DX,io8253b;8253的控制字
MOV AL,00010000B;計數器0以方式0工作,二進制計數
OUT DX,AL
MOV DX,io8253a;8253的A口地址
MOV AL,200
OUT DX,AL
MOV DX,io8255b;8255的控制字
MOV AL,10010000B;8255A方式0,A口輸入
OUT DX,AL
MOV DX,io8255a;8255的A口地址
CHKPA0:
IN AL,DX
TEST AL,00000001B;檢查PA0的狀態(tài)
JZ CHKPA0
POP DX
POP AX
RET
DELAY ENDP
;166-------------------------------------------------------------------------------
CODE ENDS
;*******************************************************************************
END START
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -