【文章內容簡介】
L DISP 。Display the digits CALL READ 。Read key state CMP AL,0FFH 。No Key pressed ? JE NEXT 。No key pressed 。Key pressed! CLD 。Set: DI + 1 MOV CX,16 MOV DI,OFFSET ARRAY REPNZ SCASB 。Search array to find key code CMP CX,0 JE NFD 。Usually this is not going to 。happen,except sth wrong MOV BX,OFFSET ARRAY SUB DI,BX DEC DI CMP DI,9 。Is the key 0~9? JBE ISNUM 。Key A and B not defined, 。reserve for future use. CMP DI,12 JE CLEAR 。Key C means clear all input digits CMP DI,13 。Key D means delete one digit JE DELETE CMP DI,14 JE EXIT 。Key E means Exit the program. JMP NEXT ISNUM:NOPAGN: CALL READ 。Key pressed! CMP AL,0FFH 。Has the key been released? JNE AGN 。No:wait until it is 。released。Yes:begin to judge the key. MOV AL,KEY[DI] MOV SI,DX MOV ID[SI],AL 。Store the input number to memery. INC DX CALL DISP CMP DX,7 。All display unit has been occupied JE CLEAR JMP NEXTNFD: NOP 。Unknown state,just terminate the program.EXIT:MOV AX,4C00H INT 21HMAIN ENDP 。READ PROC NEAR 。Read keyboard state, return key code PUSH DX MOV DX,0E803H MOV AL,81H OUT DX,AL MOV AL,00H MOV DX,0E802H OUT DX,AL IN AL,DX 。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 。Read Colum info OR AL,BL 。Keep info in AL for SCASB POP DX RET READ ENDP。DISP PROC NEAR 。Display 6 digits PUSH CX PUSH DX PUSH AX MOV BP,000FHLOPP:XOR SI,SI MOV CX,06H MOV DX,0E800H MOV AH,00000001BLOPD:MOV AL,ID[SI] OUT DX,AL MOV AL,AH 。Control which char to display INC DX OUT DX,AL 。Control which LED on DEC DX ROL AH,1 INC SI CALL DELAY 。Every char need to delay LOOP LOPD DEC BP JNZ LOPP POP AX POP DX POP CX RET DISP ENDP。 DELAY PROC 。Delay time PUSH AX PUSH CX MOV AX,0003H 。Outer loopLOP1: MOV CX,00H 。Inner loop LOOP $ DEC AX JNZ LOP1 POP CX POP AX RETDELAY ENDP 。 CODE ENDS END MAIN六、實驗總結 本次實驗比較綜合:在實驗一的基礎上,利用I/O端口芯片進行綜合編程,也為實驗三打下基礎。程序功能較復雜,代碼較繁雜。程序設計時,采用結構程序化方法自頂向下設計,使用結構程序化的思路,編寫多個子程序和宏,互相嵌套組合,實現(xiàn)復雜的功能。在具體實踐中,需掌握:子程序的用法,標號及跳轉的配合,if邏輯、case邏輯、for循環(huán)邏輯、while循環(huán)邏輯在匯編語言中的實現(xiàn)方法,鍛煉了邏輯思維,強化了匯編的能力。實驗三 8253計數(shù)器/定時器的應用一、實驗目的學習掌握8253用作定時器的編程原理。二、實驗任務及內容1.音樂發(fā)生器完成一個音樂發(fā)生器,通過蜂鳴器放出音樂,并在數(shù)碼管上顯示樂譜。根據(jù)計數(shù)器的性質,計數(shù)值音符與計數(shù)值對照(PDF中給出表格有誤)1(do)2(re)3(mi)4(fa)5(so)6(la)7(si)低音1221089791817264中音61544845403632高音302724222018162.擴展部分利用小鍵盤實現(xiàn)彈琴功能,并顯示彈奏的樂譜。三、實驗結果1(音樂發(fā)生器)程序說明完成一個音樂發(fā)生器,循環(huán)播放《小步舞曲》全曲。能在數(shù)據(jù)段存儲:音符(1~7)、音階(高中低)、音長(~3拍),等曲譜信息??梢酝ㄟ^修改代碼中的數(shù)據(jù)段,演奏任意簡單(只有高中低音域)簡譜(1~7)樂曲。數(shù)碼管第一位顯示當前播放的音符(1~7,不區(qū)分高中低音)。電腦鍵盤輸入任意鍵退出程序返回DOS。流程圖源代碼DATA SEGMENT 。Counter/Timer Number LOU DB 122,108,97,91,81,72,64 MID DB 61,54,48,45,40,36,32 HIG DB 30,27,24,22,20,18,16 。SongBooK XiaoBuWuQu BOK 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 。TON 1LOW,2MID,3HIG TON DB 2,2,2,2,2 DB 2,2,2 DB 2,2,2,2,2 DB 3,2,2 DB 2,2,2,2,2 DB 2,2,2,2,2 DB 1,2,2,2,2 DB 2 DB 2,2,2,2,2 DB 2,2,2 DB 2,2,2,2,2 DB 3,2,2 DB 2,2,2,2,2 DB 2,2,2,2,1 DB 2 DB 3,3,3,3,3 DB 3,2,2,2,2 DB 3,2,2,3,2 DB 2,2,2,2 DB 2,2,2,2,2