ToC
实验内容
- 程序开始时
LED
灯D7-D0
全亮。 - 按下单脉冲开关
KK1
,响应IR6
中断请求,使绿灯(D3-D0
)亮,红灯(D7-D4
)灭。 - 按下单脉冲开关
KK2
,响应IR7
中断请求,使红灯(D7-D4
)亮,绿灯(D3-D0
)灭。
实验接线
LED
连接 8255
的 B
口,KK1+
连接 MIR6
,KK2+
连接 MIR7
。如下图所示:
代码
1CODE SEGMENT2ASSUME CS:CODE3
4START:5 MOV AX, 06 MOV DS, AX7
8 ;; INIT 82559 MOV DX, 0646H10 MOV AL, 90H ;; 10010000B, INPUT FROM A & OUTPUT TO B11 OUT DX, AL12
13 ;; MIR614 MOV AX, OFFSET MIR6 ;; PUT CS:IP TO INTERRUPT VECTOR ADDRESS15 ;; 6: 38H - 3BH16 ;; IP -> 38H17 ;; CS -> 3AH18 MOV SI, 38H19 MOV [SI], AX20 MOV AX, CS21 MOV SI, 3AH22 MOV [SI], AX23
24 ;; MIR725 MOV AX, OFFSET MIR7 ;; 7: 3CH - 3FH26 ;; IP -> 3CH27 ;; CS -> 3AH28 MOV SI, 3CH29 MOV [SI], AX30 MOV AX, CS31 MOV SI, 3EH32 MOV [SI], AX33
34 ;; --------------------------------------------------35 ;; INIT 825936 CLI ;; DISABLE INTERRUPT37 MOV AL, 11H ;; ICW1 00010001B38 ;; ----A-BC39 ;; A: 1=HIGH, 0=UPPER EDGE40 ;; B: 1=SINGLE, 0=MULTIPLE41 ;; C: NEED ICW442 OUT 20H, AL43 MOV AL, 08H ;; ICW2 00001000B44 ;;45 OUT 21H, AL46 MOV AL, 04H ;; ICW3 00000100B47 ;; -----AB-48 ;; A: 1 = INNER SUB 8259 CONNECTED TO IR249 ;; 0 = NOT USED50 ;; B: ANY 8259 CONNECTED TO MAIN IR151 OUT 21H, AL52 MOV AL, 07H ;; ICW4 00000111B53 ;; ----ABC-54 ;; A: 1 = BUFFERED55 ;; 0 = NOT BUFFERED56 ;; B: 1 = MAIN57 ;; 0 = SUB58 ;; C: 1 = AUTO INTERRUPT STOP59 ;; 0 = NOT AUTO60 OUT 21H, AL61 MOV AL, 2FH ;; OCW1 00101111B62 ;; M7 - M063 ;; 0 = ALLOWED64 ;; 1 = DISABLED65 ;; IR4 IS USED TO COMMUNICATE WITH PC66 OUT 21H, AL67 STI ;; ALLOW INTERRUPT68 ;; --------------------------------------------------69
70AA1: ;; MAIN71 MOV DX, 0642H72 MOV AL, 0FFH73 OUT DX, AL74 JMP AA175
76MIR6:77 MOV DX, 0642H78 MOV AL, 0FH ;; GREEN LIGHT79 OUT DX, AL80 CALL DELAY81 IRET82
83MIR7:84 MOV DX, 0642H85 MOV AL, 0F0H86 OUT DX, AL ;; RED LIGHT87 CALL DELAY88 IRET89
90DELAY PROC NEAR91 MOV CX, 0FFFFH92 LOOP $93 MOV CX, 0FFFFH94 LOOP $95 MOV CX, 0FFFFH96 LOOP $97 MOV CX, 0FFFFH98 LOOP $99 RET100DELAY ENDP101
102CODE ENDS103END START
选做实验 1
描述
使用单脉冲开关控制 LED
的移动方向,初始状态仅点亮 D7
。
当 KK1
按下时,LED
灯向右移动;当 KK2
按下时,LED
灯向左移动;当 LED
灯移动到单侧边界时,停止移动。
分析
需要保存当前移动的状态,使得中断嵌套执行完后原中断不继续执行。
代码
1CODE SEGMENT2ASSUME CS:CODE3
4START:5 ;; BH: MODIFIED6 ;; BL: STATUS7 MOV BX, 0080H8
9 ;; INIT 825510 MOV DX, 0646H11 MOV AL, 90H ;; 10010000B, INPUT FROM A & OUTPUT TO B12 OUT DX, AL13
14 ;; MIR615 MOV AX, OFFSET MIR6 ;; PUT CS:IP TO INTERRUPT VECTOR ADDRESS16 ;; 6: 38H - 3BH17 ;; IP -> 38H18 ;; CS -> 3AH19 MOV SI, 38H20 MOV [SI], AX21 MOV AX, CS22 MOV SI, 3AH23 MOV [SI], AX24
25 ;; MIR726 MOV AX, OFFSET MIR7 ;; 7: 3CH - 3FH27 ;; IP -> 3CH28 ;; CS -> 3AH29 MOV SI, 3CH30 MOV [SI], AX31 MOV AX, CS32 MOV SI, 3EH33 MOV [SI], AX34
35 ;; --------------------------------------------------36 ;; INIT 825937 CLI ;; DISABLE INTERRUPT38 MOV AL, 11H ;; ICW1 00010001B39 ;; ----A-BC40 ;; A: 1=HIGH, 0=UPPER EDGE41 ;; B: 1=SINGLE, 0=MULTIPLE42 ;; C: NEED ICW443 OUT 20H, AL44 MOV AL, 08H ;; ICW2 00001000B45 ;;46 OUT 21H, AL47 MOV AL, 04H ;; ICW3 00000100B48 ;; -----AB-49 ;; A: 1 = INNER SUB 8259 CONNECTED TO IR250 ;; 0 = NOT USED51 ;; B: ANY 8259 CONNECTED TO MAIN IR152 OUT 21H, AL53 MOV AL, 07H ;; ICW4 00000111B54 ;; ----ABC-55 ;; A: 1 = BUFFERED56 ;; 0 = NOT BUFFERED57 ;; B: 1 = MAIN58 ;; 0 = SUB59 ;; C: 1 = AUTO INTERRUPT STOP60 ;; 0 = NOT AUTO61 OUT 21H, AL62 MOV AL, 2FH ;; OCW1 00101111B63 ;; M7 - M064 ;; 0 = ALLOWED65 ;; 1 = DISABLED66 ;; IR4 IS USED TO COMMUNICATE WITH PC67 OUT 21H, AL68 STI ;; ALLOW INTERRUPT69 ;; --------------------------------------------------70
71AA1: ;; MAIN72 MOV DX, 0642H73 MOV AL, BL74 OUT DX, AL75 JMP AA176
77MIR6:78 STI79 MOV BH, 180 MOV DX, 0642H81
82IR6_RIGHT:83 CMP BL, 1 ;; MOST RIGHT84 JE IR6_STOP85 SHR BL, 186 MOV AL, BL87 OUT DX, AL88 CALL DELAY89 CMP BH, 1 ;; CHECK WHETHER NESTED INTERRUPT HAPPENED90 JNE IR6_STOP91 JMP IR6_RIGHT92
93IR6_STOP:94 MOV BH, 095 IRET96
97MIR7:98 STI99 MOV BH, 1100 MOV DX, 0642H101
102IR7_LEFT:103 CMP BL, 80H ;; MOST LEFT104 JE IR7_STOP105 SHL BL, 1106 MOV AL, BL107 OUT DX, AL108 CALL DELAY109 CMP BH, 1 ;; CHECK WHETHER NESTED INTERRUPT HAPPENED110 JNE IR7_STOP111 JMP IR7_LEFT112
113IR7_STOP:114 MOV BH, 0115 IRET116
117DELAY PROC NEAR118 MOV CX, 0FFFFH119 LOOP $120 MOV CX, 0FFFFH121 LOOP $122 MOV CX, 0FFFFH123 LOOP $124 MOV CX, 0FFFFH125 LOOP $126 RET127DELAY ENDP128
129CODE ENDS130END START
选做实验 2
描述
在选做实验 1 的基础上,增加:
- 在向左移动过程中,如果要求其向右移动,则立即改变方向,向右移动。到最右侧后,向左移动到最左侧。
- 在向右移动中,如果要求其向左移动,不立即改变方向,等到移动到最右侧后再开始向左移动。
分析
在当前移动状态的基础上,增加是否需要向左移动的标志。在向右移动中断处理程序(MIR6
)的最后,当需要向左移动时,则调用向左移动中断处理程序(MIR7
)。
代码
1CODE SEGMENT2ASSUME CS:CODE3
4START:5 ;; BH: MODIFIED6 ;; 00 = IDLE7 ;; 01 = GOING_LEFT8 ;; 10 = GOING_RIGHT9 ;; 11 = GOING_RIGHT(DEFER GO RIGHT)10 ;; BL: STATUS11 MOV BX, 0080H12
13 ;; INIT 825514 MOV DX, 0646H15 MOV AL, 90H ;; 10010000B, INPUT FROM A & OUTPUT TO B16 OUT DX, AL17
18 ;; MIR619 MOV AX, OFFSET MIR6 ;; PUT CS:IP TO INTERRUPT VECTOR ADDRESS20 ;; 6: 38H - 3BH21 ;; IP -> 38H22 ;; CS -> 3AH23 MOV SI, 38H24 MOV [SI], AX25 MOV AX, CS26 MOV SI, 3AH27 MOV [SI], AX28
29 ;; MIR730 MOV AX, OFFSET MIR7 ;; 7: 3CH - 3FH31 ;; IP -> 3CH32 ;; CS -> 3AH33 MOV SI, 3CH34 MOV [SI], AX35 MOV AX, CS36 MOV SI, 3EH37 MOV [SI], AX38
39 ;; --------------------------------------------------40 ;; INIT 825941 CLI ;; DISABLE INTERRUPT42 MOV AL, 11H ;; ICW1 00010001B43 ;; ----A-BC44 ;; A: 1=HIGH, 0=UPPER EDGE45 ;; B: 1=SINGLE, 0=MULTIPLE46 ;; C: NEED ICW447 OUT 20H, AL48 MOV AL, 08H ;; ICW2 00001000B49 ;;50 OUT 21H, AL51 MOV AL, 04H ;; ICW3 00000100B52 ;; -----AB-53 ;; A: 1 = INNER SUB 8259 CONNECTED TO IR254 ;; 0 = NOT USED55 ;; B: ANY 8259 CONNECTED TO MAIN IR156 OUT 21H, AL57 MOV AL, 07H ;; ICW4 00000111B58 ;; ----ABC-59 ;; A: 1 = BUFFERED60 ;; 0 = NOT BUFFERED61 ;; B: 1 = MAIN62 ;; 0 = SUB63 ;; C: 1 = AUTO INTERRUPT STOP64 ;; 0 = NOT AUTO65 OUT 21H, AL66 MOV AL, 2FH ;; OCW1 00101111B67 ;; M7 - M068 ;; 0 = ALLOWED69 ;; 1 = DISABLED70 ;; IR4 IS USED TO COMMUNICATE WITH PC71 OUT 21H, AL72 STI ;; ALLOW INTERRUPT73 ;; --------------------------------------------------74
75AA1: ;; MAIN76 MOV DX, 0642H77 MOV AL, BL78 OUT DX, AL79 JMP AA180
81;; --------------------------------------------------82MIR6: ;; INTEND TO GO RIGHT83 STI84 MOV DX, 0642H85
86 ;; PRESS KK1 WHEN GOING RIGHT87 TEST BH, 10B88 JNZ IR6_EXIT_IRET89
90 ;; BH MUST BE 0 OR 191 ;; BH = 0 ==> MOV BH, 10B92 ;; BH = 1 ==> MOV BH, 11B93 OR BH, 10B94
95IR6_RIGHT:96 CMP BL, 1 ;; MOST RIGHT97 JE IR6_LEFT98 SHR BL, 199 MOV AL, BL100 OUT DX, AL101 CALL DELAY102 JMP IR6_RIGHT103
104IR6_LEFT:105 TEST BH, 1 ;; NEED TO GO LEFT106 JZ IR6_EXIT107 MOV BH, 1 ;; SET MODE TO GOING_LEFT108 JMP MIR7109IR6_EXIT: ;; NORMAL EXIT110 MOV BH, 0111IR6_EXIT_IRET:112 IRET113
114;; --------------------------------------------------115MIR7: ;; INTEND TO GO LEFT116 STI117 TEST BH, 10B ;; GOING TO RIGHT NOW118 JNZ IR7_IRET ;; EXIT119 MOV BH, 1120 MOV DX, 0642H121
122IR7_LEFT:123 CMP BL, 80H ;; MOST LEFT124 JE IR7_STOP125 SHL BL, 1126 MOV AL, BL127 OUT DX, AL128 CALL DELAY129 CMP BH, 1 ;; WHETHER TO CONTINUE GOING LEFT130 JNE IR7_STOP131 JMP IR7_LEFT132
133IR7_STOP:134 MOV BH, 0 ;; BACK TO IDLE135 IRET136IR7_IRET:137 OR BH, 01B ;; GO TO LEFT AFTER RIGHT FINISHED138 IRET139
140DELAY PROC NEAR141 MOV CX, 0FFFFH142 LOOP $143 MOV CX, 0FFFFH144 LOOP $145 MOV CX, 0FFFFH146 LOOP $147 MOV CX, 0FFFFH148 LOOP $149 RET150DELAY ENDP151
152CODE ENDS153END START