【正文】
DB 5,1,2,3,4 DB 5,1,1 DB 6,4,5,6,7 DB 1,1,1 DB 4,5,4,3,2 DB 3,4,3,2,1 DB 7,1,2,3,1 DB 2 DB 5,1,2,3,4 DB 5,1,1 DB 6,4,5,6,7 DB 1,1,1 DB 4,5,4,3,2 DB 3,4,3,2,1 DB 2,3,2,1,7 DB 1 DB 3,1,2,3,1 DB 2,5,6,7,5 DB 1,6,7,1,5 DB 4,3,4,2 DB 2,3,4,5,6,7 DB 1,7,6 DB 7,2,4 DB 5 DB 5,1,7,1 DB 6,1,7,1 DB 5,4,3 DB 2,1,7,1,2 DB 5,6,7,1,2,3 DB 4,3,2 DB 3,5,1,7 DB 1 LEN EQU $BOK 。4One beat。never used TRHY DB 0 COUNT DB 0DATA ENDS。CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK 。control time for dAX, 0FFH*188H for 。Use Counter 0 OUT DX,AL 。BX is the order in BOK/RHY/TON XOR AH,AH MOV SI,AX DEC SI MOV TBOK,AL 。Save counter/timer number RET READ ENDP 。Rhyme, delay time in AX RETRHYME ENDP。Get note char OUT DX,AL MOV AL,00000001B 。Initialize 8253 MOV AL,00010110B 。s length XOR BX,BX 。Music on CALL RHYME 。Keyboard pressed, quit program LOOP LOP 。Reset 8255A MOV DX, 0E801H OUT DX, AL MOV DX, 0E800H OUT DX, AL MOV AH,4CH 。按鍵鍵盤1~7對應音符1~7,按鍵E退出返回DOS,按鍵C清除(保留)。Char code 0~9 NUM DB 0EDH,21H,0F4H,0F1H,39H 。STACK SEGMENT STACK 39。 。 SCAN PROC PUSH SI MOV SI,Offset CAT SHOW 01H,[SI] CALL DELAY1MS SHOW 02H,[SI+1] CALL DELAY1MS SHOW 04H,[SI+2] CALL DELAY1MS SHOW 08H,[SI+3] CALL DELAY1MS SHOW 10H,[SI+4] CALL DELAY1MS SHOW 20H,[SI+5] CALL DELAY1MS POP SI RETSCAN ENDP MAIN PROC FAR MOV AX,DATA MOV DS,AX MOV ES,AX MOV DX,0E823H 。Display notes, can display 6 a time CALL READ 。Set DF direction: DI + 1 DI MOV CX,16 MOV DI,OFFSET ARRAY REPNZ SCASB 。Is the key 0~7? JBE ISNUM 。Key E means Exit the program. JMP NEXT ISNUM: PUSH DX MOV DX,0E8E0H IN AL,DX AND AL,03H CMP AL,01H JE PLOU CMP AL,02H JE PHIG JMP PMIDPLOU: MOV AL,LOU[DI] PUSH AX 。 ADD DI,7 MOV AL,MID[DI] MOV CAT[1],0 。Key pressed! push AX CALL SCAN MOV AL,NUM[DI] MOV CAT[0],AL pop ax CMP AL,0FFH 。Yes:begin to judge the key. MOV DX,0E820H XOR AL,AL OUT DX,AL POP DX 。Store the input number to memory. 。Unknown state, terminate the program.EXIT:MOV AX,4C00H INT 21HCLEAR2: JMP CLEARMAIN ENDP 。Keep info in AL for SCASB POP DX RET READ ENDP。在對每一個版本改進的過程中,我都逐漸加深了對匯編語言的理解,鍛煉了匯編編程及應用的能力。36。 本次實驗也是本學期最后一次實驗,也是我們學到的最多的一次實驗。 CODE ENDS END MAIN五、實驗總結 本次實驗綜合了前兩次實驗所有學習到的東西,我了解并熟悉了實驗臺的結構、功能、使用方法;掌握8253計數器和定時器運用的基本方法;熟練掌握Debug及編寫匯編程序。Read Row info MOV BL,AL MOV DX,0E803H MOV AL,88H OUT DX,AL MOV AL,00H MOV DX,0E802H OUT DX,AL IN AL,DX 。CMP DX,6 。MOV SI,DX 。No:wait until it is released。Counter 0 OUT DX,AL 。ADD DI,14 MOV AL,HIG[DI] MOV CAT[1],3DH 。reserve for future use. CMP DI,12 JE CLEAR 。Usually this is not going to 。No Key pressed ? JE NEXT 。Record how many digits has been stored MOV CX,6 MOV AL,0 XOR SI,SILOPC: MOV CAT[SI],AL 。 。 DB 100 DUP(0)STACK ENDS 。6~9 。Store input note char。 CODE ENDS END MAIN四、實驗結果2(擴展部分)程序說明能播放不同音符(1~7)和音階(高中低),SW0=1 SW1=0時低音,SW0=0 SW1=1時高音,其他情況中音。Or go on to playOVER:MOV DX, 0E823H 。Next note MOV AH,0BH 。Read note/rhyme/tone CALL DISP 。initialize 8255 MOV DX,0E803H OUT DX,AL PLAY:MOV CX,LEN 。 MAIN: 。Display note being played MOV DX,0E800H MOV AL,BOK[BX] 。Control rhyme MOV AL,TRHY MOV AH,0FFH 。Save rhym