微原硬件实验
ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX PLAY DO,DO1,DO_T,01H PLAY RE,RE1,RE_T,01H PLAY MI,MI1,MI_T,01H PLAY FA,FA1,FA_T,01H PLAY SO,SO1,SO_T,01H PLAY LA,LA1,LA_T,01H PLAY SI_1,SI1_1,SI_T,01H PLAY DO_2,DO1_2,DO_2_T,01H MOV DX,283H MOV AL,00111110B OUT DX,AL ;8253,送出控制字,计数器0,先读最低8位,再读高八位,方式3,二进制 MOV DX,280H ;DX指向8283的0号计数器 MOV AL,0 ;蜂鸣器消音 OUT DX,AL MOV AX,4C00H INT 21H CODE ENDS END BEGIN
(二)提高部分:
DATA SEGMENT TMP DB ? ;用于存放键盘的按下记录 TMP1 DB ? TMP2 DB ? A DB ?
第31页
微原硬件实验
C1 DB ? C2 DB ? DO DB 42H ;原始分频为1M,通过改变计数器的初值储存晶振频率/音符频率的值 RE DB 90H ;因为数据线是8位宽度,所以分成两部分传送 MI DB 35H FA DB 75H SO DB 2CH LA DB 28H SI_1 DB 23H DO_2 DB 0A1H DO1 DB 0FH ;原始分频为1M,通过改变计数器的初值储存晶振频率/音符频率的值 RE1 DB 0DH MI1 DB 0CH FA1 DB 0BH SO1 DB 0AH LA1 DB 09H SI1_1 DB 08H DO1_2 DB 07H DO_T DB 06H ;储存每个音符的七段数码管显示码 RE_T DB 5BH MI_T DB 4FH FA_T DB 66H SO_T DB 6DH LA_T DB 7DH SI_T DB 07H DO_2_T DB 06H DATA ENDS
STACK SEGMENT STACK 'STACK' DB 100 DUP(?) STACK ENDS
CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK
RUN PROC MOV DX,283H MOV AL,00111110B ;初始化8253的工作状态
第32页
微原硬件实验
OUT DX,AL MOV CX,0FH
AGAIN:MOV BX,0004H AGAIN1: MOV DX,280H ;设置8253的计数器控制字 MOV AL,C1 ;C存储音符的计数初值,控制蜂鸣器 OUT DX,AL MOV AL,C2 OUT DX,AL MOV DX,289H ;设置位选通信号,用8255的B口 MOV AL,01H OUT DX,AL MOV DX,288H ;设置段选通信号,用8255的A口 MOV AL,A OUT DX,AL MOV AL,0 OUT DX,AL DEC BX CMP BX,0 JNZ AGAIN1 LOOP AGAIN MOV DX,283H MOV AL,00111110B ;初始化8253的工作状态,同上一个实验 OUT DX,AL MOV DX,280H ;设置8253的计数器控制字 MOV AL,0 ;C存储音符的计数初值,控制蜂鸣器 OUT DX,AL RET RUN ENDP
BEGIN: MOV AX,DATA MOV DS,AX MOV DX,283H MOV AL,00011110B ;初始化8283的工作状态,同上一个实验 OUT DX,AL
第33页
微原硬件实验
;读入c口的高四位输入 MOV DX,28BH MOV AL,10001000B OUT DX,AL
GOON1: MOV DX,28AH IN AL,DX MOV TMP1,AL CMP AL,00F0H JZ GOON1
;读入c口的低四位输入 MOV DX,28BH MOV AL,10000001B OUT DX,AL
GOON2:MOV DX,28AH IN AL,DX MOV TMP2,AL CMP AL,000FH JZ GOON2 OR AL,TMP1 MOV TMP,AL CMP TMP,01110111B JZ PLAY1 CMP TMP,01111101B JZ PLAY2 CMP TMP,01111110B JZ PLAY3 CMP TMP,10110111B JZ PLAY4 CMP TMP,10111011B JZ PLAY5 CMP TMP,10111101B JZ AA2 CMP TMP,10111110B JZ AA1
PLAY1:MOV AL,DO MOV C1,AL MOV AL,DO1
;设置8255的控制字
;设置A口出,C口高4位输入,低4位输出
;设置8255控制字,C口低4位输入,高4位输出
;组合高位和低位放在TMP ;DO ;RE ;MI ;FA ;SO ;LA ;SI
;记录DO的计数初值
第34页
微原硬件实验
MOV C2,AL MOV AL,DO_T ;记录DO的段选通信号 MOV A,AL CALL RUN ;调用响声及显示子程序 JMP BEGIN
PLAY2: MOV AL,RE ;记录RE的计数初值 MOV C1,AL MOV AL,RE1 MOV C2,AL MOV AL,RE_T ;记录RE的段选通信号 MOV A,AL CALL RUN JMP BEGIN
PLAY3:MOV AL,MI MOV C1,AL MOV AL,MI1 MOV C2,AL MOV AL,MI_T MOV A,AL CALL RUN JMP BEGIN
PLAY4:MOV AL,FA MOV C1,AL MOV AL,FA1 MOV C2,AL MOV AL,FA_T MOV A,AL CALL RUN JMP BEGIN
AA2: JMP PLAY6 ;因为JMP超过了最大范围,所以加了几个JMP中转 PLAY5:MOV AL,SO MOV C1,AL MOV AL,SO1 MOV C2,AL MOV AL,SO_T MOV A,AL CALL RUN JMP BEGIN AA1: JMP PLAY7
第35页