DATA SEGMENT
CR EQU 0DH
LF EQU 0AH
MES DB 'electronic organ 1-7:L Q-U:M A-J:H',CR,LF,'$'
DATA1 DW 5444D,4849D,4324D,4074D,3629D,3237D,2886D
DW 2722D,2424D,2162D,2040D,1817D,1618D,1441D
DW 1361D,1212D,1080D,1019D,909D,809D,721D
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START :MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MES
MOV AH,9
INT 21H;显示字符
CLI
MOV AL,10110110B
OUT 43H,AL
MOV BX,10H
MOV AL,BL
OUT 42H,AL
MOV AL,BH
OUT 42H,AL;8253初始化
MOV AL,99H
OUT 63H,AL
MOV AL,80H
OUT 61H,AL
MOV AL,40H
OUT 61H,AL;8255初始化
MOV AL,11H
OUT 20H,AL
JMP SHORT $+2
MOV AL,8
OUT 21H,AL
JMP SHORT $+2
MOV AL,04H
OUT 21H,AL
MOV BX,00H;清除发声状态
JMP PLAY
DEL_50MS:MOV CX,10ECH
NEXT2:NOP
NOP
LOOP NEXT2;延时50ms
MAIN ENDP
KEYINTERRUPT PROC NEAR
PUSH DS
PUSH AX
PUSH CX
PUSH DX
BEGIN: IN AL,60H
PUSH AX
IN AL,61H
MOV AH,AL
OR AL,80H
OUT 61H,AL
XCHG AH,AL
OUT 61H,AL
POP AX
MOV AH,AL
CMP AH,25H
CMP AH,25H
JB SSS
SSS: CMP AH,1DH
JG H
CMP AH,17H
JB WWW
WWW:CMP AH,0FH
JG MM
CMP AH,9H
JB L
JMP SHORT $+2
MOV AL,01H
OUT 21H,AL
MOV AL,11H
OUT 0A0H,AL
JMP SHORT $+2
MOV AL,70H
OUT 0A1H,AL
JMP SHORT $+2
MOV AL,02H
OUT 0A1H,AL
JMP SHORT $+2
MOV AL,01H
OUT 0A1H,AL;8259初始化
PLAY:PUSH DS
MOV AX,SEG KEYINTERRUPT
MOV DS,AX
MOV DX,OFFSET KEYINTERRUPT
MOV AL,09H
MOV AH,25H
INT 21H
POP DS
STI;中断向量表
IN AL,21H
AND AL,11111100B
OUT 21H,AL;开中断
PPP:CMP BX,0FH
JZ NEXT
JNZ PPP;判断是否在发声状态
NEXT: MOV BX,20
L_20TIMES:CALL DEL_50MS
DEC BX
JNZ L_20TIMES;延时
IN AL,61H
AND AL,0FCH
OUT 61H,AL;停止发声
H: SUB AH,10H
H1: MOV AL,AH
MOV AH,0
SHL AX,1
MOV SI,OFFSET DATA1
ADD SI,AX
JMP NEXT1
MM:SUB AH,9H
JMP H1
L: SUB AH,2H
JMP H1
NEXT1: MOV BX,0FH;置发声状态
MOV BX,[SI]
MOV AL,BL
OUT 42H,AL
MOV AL,BH
OUT 42H,AL;8253初始化
MOV AH,AL
MOV AL,01100001B
OUT 20H,AL;执行EIO
IN AL,61H
OR AL,03H
OUT 61H,AL;启动扬声器
POP DX
POP CX
POP AX
POP DS
IN AL,21H
AND AL,11111100B
OUT 21H,AL;开中断
IRET
KEYINTERRUPT ENDP
CODE ENDS
END START
CR EQU 0DH
LF EQU 0AH
MES DB 'electronic organ 1-7:L Q-U:M A-J:H',CR,LF,'$'
DATA1 DW 5444D,4849D,4324D,4074D,3629D,3237D,2886D
DW 2722D,2424D,2162D,2040D,1817D,1618D,1441D
DW 1361D,1212D,1080D,1019D,909D,809D,721D
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START :MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MES
MOV AH,9
INT 21H;显示字符
CLI
MOV AL,10110110B
OUT 43H,AL
MOV BX,10H
MOV AL,BL
OUT 42H,AL
MOV AL,BH
OUT 42H,AL;8253初始化
MOV AL,99H
OUT 63H,AL
MOV AL,80H
OUT 61H,AL
MOV AL,40H
OUT 61H,AL;8255初始化
MOV AL,11H
OUT 20H,AL
JMP SHORT $+2
MOV AL,8
OUT 21H,AL
JMP SHORT $+2
MOV AL,04H
OUT 21H,AL
MOV BX,00H;清除发声状态
JMP PLAY
DEL_50MS:MOV CX,10ECH
NEXT2:NOP
NOP
LOOP NEXT2;延时50ms
MAIN ENDP
KEYINTERRUPT PROC NEAR
PUSH DS
PUSH AX
PUSH CX
PUSH DX
BEGIN: IN AL,60H
PUSH AX
IN AL,61H
MOV AH,AL
OR AL,80H
OUT 61H,AL
XCHG AH,AL
OUT 61H,AL
POP AX
MOV AH,AL
CMP AH,25H
CMP AH,25H
JB SSS
SSS: CMP AH,1DH
JG H
CMP AH,17H
JB WWW
WWW:CMP AH,0FH
JG MM
CMP AH,9H
JB L
JMP SHORT $+2
MOV AL,01H
OUT 21H,AL
MOV AL,11H
OUT 0A0H,AL
JMP SHORT $+2
MOV AL,70H
OUT 0A1H,AL
JMP SHORT $+2
MOV AL,02H
OUT 0A1H,AL
JMP SHORT $+2
MOV AL,01H
OUT 0A1H,AL;8259初始化
PLAY:PUSH DS
MOV AX,SEG KEYINTERRUPT
MOV DS,AX
MOV DX,OFFSET KEYINTERRUPT
MOV AL,09H
MOV AH,25H
INT 21H
POP DS
STI;中断向量表
IN AL,21H
AND AL,11111100B
OUT 21H,AL;开中断
PPP:CMP BX,0FH
JZ NEXT
JNZ PPP;判断是否在发声状态
NEXT: MOV BX,20
L_20TIMES:CALL DEL_50MS
DEC BX
JNZ L_20TIMES;延时
IN AL,61H
AND AL,0FCH
OUT 61H,AL;停止发声
H: SUB AH,10H
H1: MOV AL,AH
MOV AH,0
SHL AX,1
MOV SI,OFFSET DATA1
ADD SI,AX
JMP NEXT1
MM:SUB AH,9H
JMP H1
L: SUB AH,2H
JMP H1
NEXT1: MOV BX,0FH;置发声状态
MOV BX,[SI]
MOV AL,BL
OUT 42H,AL
MOV AL,BH
OUT 42H,AL;8253初始化
MOV AH,AL
MOV AL,01100001B
OUT 20H,AL;执行EIO
IN AL,61H
OR AL,03H
OUT 61H,AL;启动扬声器
POP DX
POP CX
POP AX
POP DS
IN AL,21H
AND AL,11111100B
OUT 21H,AL;开中断
IRET
KEYINTERRUPT ENDP
CODE ENDS
END START