first commit

This commit is contained in:
2025-05-27 16:03:52 +08:00
commit 2d22d07f60
223 changed files with 5842 additions and 0 deletions

BIN
Lab/Lab5/material/1.1.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
Lab/Lab5/material/1.3.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
Lab/Lab5/material/2.1.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 KiB

View File

@@ -0,0 +1,229 @@
![cover](cover.png)
<h1><center><strong>实验五 8259中断实验</strong></center></h1>
### 一、实验目的
该实验使学生掌握$8259$向量中断方式的硬件连接和软件编程的方法,同时使同学掌握中断和其它接口芯片配合来完成某一特定任务的方法。
### 二、实验内容
手动产生单脉冲作为中断请求信号连接到$\rm {MIRQ}_3$(对应中断号$\rm 0BH$)上和$\rm {SIRQ}_{10}$(对应中断号$\rm 72H$)上。每按一次开关产生一次中断,某$\rm LED$灯就亮或灭一次(上次亮,当前就灭;上次灭,当前就亮),中断$10$次后程序退出。其中,主$8259$的端口地址为$\rm 20H$,从片$8259$的端口地址为$\rm 0A0H$。
<img src="1.1.png" alt="1.1" style="zoom: 25%;" />
连线:总线$\rm {MIRQ}_x$接单脉冲$1$正脉冲,总线$\rm {SIRQ}_x$接单脉冲$2$正脉冲。
### 三、流程图
<img src="graph.drawio.svg" alt="graph" style="zoom: 60%;" />
### 四、实验过程与分析
首先连好接线如图4-1所示。单脉冲$1$连$\rm {MIRQ}_{3}$,单脉冲$2$连$\rm {SIRQ}_{10}$$8255$芯片连$\rm 280H$$8255$的$\rm {PC}_0$连$\rm {LED}_7$。
<img src="2.1.jpg" alt="4-1" style="zoom: 20%;" />
<center>图4-1 硬件连接图</center>
按动任意的单脉冲$1/2$,就会触发中断程序,$\rm LED$就会将当前状态取反,并将触发计数加$1$。
主程序不断检测触发计数,当触发计数超过$10$时,退出程序。
因此按单脉冲$10$次之后,$\rm LED$不会再有任何变化。
### 五、实验总结
通过本实验,我掌握$8259$向量中断方式的硬件连接和软件编程的方法,同时掌握了中断和其它接口芯片(如$8255$芯片)配合来完成某一特定任务的方法。
### 六、思考题
> 如何理解采用中断方式进行实时控制,请举一些可能的应用例子。
如图6-1所示当中断引脚检测到触发信号时若中断屏蔽开放$\rm CPU$会从当前主程序或中断服务中跳出立即执行相应的中断服务程序因此实现了实时控制。如果没有中断系统CPU就只能按照原来的程序编写的先后顺序对各个外设进行查询和处理这样实际工作效率很低不能及时响应紧急事件。
<img src="1.3.png" alt="6-1" style="zoom:25%;" />
<center>图6-1 中断程序运行流程图</center>
应用例子:
1. 当出现一些不合法的、可能会损害计算机的程序时,可以立即跳转到中断程序进行修复或是终止程序,以免计算机损坏。比如除$0$操作。
2. 进行系统调用,如从键盘获取信息等。
### 源代码附录
```assembly
DATA SEGMENT
INT_OFF1 DW 0 ; 存储主片原来中断向量的偏移地址
INT_SEG1 DW 0 ; 存储主片原来中断向量的段地址
INT_OFF2 DW 0 ; 存储从片原来中断向量的偏移地址
INT_SEG2 DW 0 ; 存储从片原来中断向量的段地址
LED_STATE DW 00000001B ; 0|xxx|0(B组0方式)|000(指定PC0引脚)|1(置位)
DATA ENDS
STACK SEGMENT
DW 100 DUP (0) ; 定义堆栈段大小为100字节
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
MOV AX, DATA ; 将数据段地址存入AX寄存器
MOV DS, AX ; 将AX中的值装载到DS寄存器
MOV ES, AX ; 将AX中的值装载到ES寄存器
MOV AX, STACK ; 将堆栈段地址存入AX寄存器
MOV SS, AX ; 将AX中的值装载到SS寄存器
CLI ; 清除中断标志,禁止中断,防止在修改中断向量表过程中有中断触发
; 保存主片原来的中断向量
MOV AX, 350BH ; 获取原来的中断号为0BH的中断向量
INT 21H ; 将中断向量的偏移地址存在BX段地址存在ES
MOV INT_OFF1, BX ; 分别将原来中断向量的偏移地址和段地址保存
MOV BX, ES
MOV INT_SEG1, BX
; 向主片装填新的中断向量
MOV DX, SEG SW_INT ; 将主片新中断向量的段地址存入DX
MOV DS, DX ; 再装到DS
MOV DX, OFFSET SW_INT ; 将主片新中断向量的偏移地址存入DX
MOV AX, 250BH ; 装填到中断向量表里中断号为0BH的中断向量
INT 21H
MOV AX, DATA ; 重新加载数据段地址
MOV DS, AX
; 保存从片原来的中断向量
MOV AX, 3572H ; 获取原来的中断号为72H的中断向量
INT 21H ; 将中断向量的偏移地址存在BX段地址存在ES
MOV INT_OFF2, BX ; 分别将原来中断向量的偏移地址和段地址保存
MOV BX, ES
MOV INT_SEG2, BX
; 向从片装填新的中断向量
MOV DX, SEG SW_INT ; 将从片新中断向量的段地址存入DX
MOV DS, DX ; 再装到DS
MOV DX, OFFSET SW_INT ; 将从片新中断向量的偏移地址存入DX
MOV AX, 2572H ; 装填到中断向量表里中断号为72H的中断向量
INT 21H
MOV AX, DATA ; 重新加载数据段地址
MOV DS, AX
; 取消主片MIRQ3的中断屏蔽
IN AL, 21H ; 读取主片中断屏蔽寄存器
AND AL, 11110111B ; 将第3位设置为0
OUT 21H, AL ; 将修改后的值写入主片中断屏蔽寄存器
; 取消从片SIRQ10的中断屏蔽
IN AL, 0A1H ; 读取从片中断屏蔽寄存器
AND AL, 11111011B ; 将第2位设置为0
OUT 0A1H, AL ; 将修改后的值写入从片中断屏蔽寄存器
; 主程序
MOV DX, 283H ; 8255芯片的命令口
MOV AL, 10000000B ; 1|00(A组0方式)|0(PA输出)|0(PC4-7输出)|0(B组0方式)|0(PB输出)|0(PC0-3输出)
OUT DX, AL
MOV DX, 283H ; 8255芯片的命令口
MOV AX, LED_STATE ; 输出控制LED的状态
OUT DX, AL
XOR DX, DX ; 将DX置0
L1: STI ; 设置中断标志
CMP DX, 10 ; 判断中断是否已触发了10次
JNE L1
CLI ; 清除中断标志,禁止中断,防止在修改中断向量表过程中有中断触发
; 恢复主片原来的中断向量
MOV DX, INT_SEG1 ; 将主片原中断向量的段地址存入DX
MOV DS, DX ; 再装到DS
MOV DX, INT_OFF1 ; 将主片原中断向量的偏移地址存入DX
MOV AX, 250BH ; 装填到中断向量表里中断号为0BH的中断向量
INT 21H
MOV AX, DATA ; 重新加载数据段地址
MOV DS, AX
; 恢复从片原来的中断向量
MOV DX, INT_SEG2 ; 将从片原中断向量的段地址存入DX
MOV DS, DX ; 再装到DS
MOV DX, INT_OFF2 ; 将从片原中断向量的偏移地址存入DX
MOV AX, 2572H ; 装填到中断向量表里中断号为72H的中断向量
INT 21H
MOV AX, DATA ; 重新加载数据段地址
MOV DS, AX
; 设置主片的中断屏蔽
IN AL, 21H ; 读取主片中断屏蔽寄存器
OR AL, 00001000B ; 将第3位设置为1
OUT 21H, AL ; 将修改后的值写入主片中断屏蔽寄存器
; 设置从片的中断屏蔽
IN AL, 0A1H ; 读取从片中断屏蔽寄存器
OR AL, 00000100B ; 将第2位设置为1
OUT 0A1H, AL ; 将修改后的值写入从片中断屏蔽寄存器
STI ; 设置中断标志
; 返回DOS
MOV AX, 4C00H
INT 21H
; 中断服务程序
SW_INT PROC NEAR
PUSH AX ; 保护主程序运行状态
CLI ; 清除中断标志,禁止中断程序执行过程中跳转到其他中断程序
INC DX ; 触发计数加1
PUSH DX ; 保护DX
MOV AX, LED_STATE
ADD AX, DX ; DX的末位会随着其增加交替为0和1
AND AX, 00000001B ; 取末位控制PC0为0或1
MOV DX, 283H ; 从而实现灯的亮灭交替
OUT DX, AL
POP DX ; 恢复DX
MOV AL, 20H ; 向主片发送EOI指令
OUT 20H, AL
MOV AL, 62H ; 向从片发送EOI指令
OUT 0A0H, AL
STI ; 设置中断标志,允许跳转到中断程序
POP AX ; 恢复主程序运行状态
IRET
SW_INT ENDP
CODE ENDS
END START
```

BIN
Lab/Lab5/material/code.EXE Executable file

Binary file not shown.

192
Lab/Lab5/material/code.LST Executable file
View File

@@ -0,0 +1,192 @@
Turbo Assembler Version 5.3 06-02-23 10:20:14 Page 1
code.asm
1 0000 DATA SEGMENT
2 0000 0000 INT_OFF1 DW 0
3 0002 0000 INT_SEG1 DW 0
4 0004 0000 INT_OFF2 DW 0
5 0006 0000 INT_SEG2 DW 0
6 0008 0001 LED_STATE DW 00000001B
7 000A DATA ENDS
8
9 0000 STACK SEGMENT
*Warning* code.asm(9) Reserved word used as symbol: STACK
10 0000 64*(0000) DW 100 DUP (0)
11 00C8 STACK ENDS
12
13 0000 CODE SEGMENT
14 ASSUME CS:CODE, DS:DATA, SS:STACK
15 0000 START:
16 0000 B8 0000s MOV AX, DATA
17 0003 8E D8 MOV DS, AX
18 0005 8E C0 MOV ES, AX
19 0007 B8 0000s MOV AX, STACK
20 000A 8E D0 MOV SS, AX
21
22 ; save main chip's original interruption vector
23 000C B8 350B MOV AX, 350BH
24 000F CD 21 INT 21H
25 0011 89 1E 0000r MOV INT_OFF1, BX
26 0015 8C C3 MOV BX, ES
27 0017 89 1E 0002r MOV INT_SEG1, BX
28
29 ; load main chip's new interruption vector
30 001B FA CLI
31 001C BA 0000s MOV DX, SEG SW_INT
32 001F 8E DA MOV DS, DX
33 0021 BA 00ADr MOV DX, OFFSET SW_INT
34 0024 B8 250B MOV AX, 250BH
35 0027 CD 21 INT 21H
36 0029 B8 0000s MOV AX, DATA
37 002C 8E D8 MOV DS, AX
38
39 ; save slave chip's original interruption vector
40 002E B8 3572 MOV AX, 3572H
41 0031 CD 21 INT 21H
42 0033 89 1E 0004r MOV INT_OFF2, BX
43 0037 8C C3 MOV BX, ES
44 0039 89 1E 0006r MOV INT_SEG2, BX
45
46 ; load slave chip's new interruption vector
47 003D FA CLI
48 003E BA 0000s MOV DX, SEG SW_INT
49 0041 8E DA MOV DS, DX
50 0043 BA 00ADr MOV DX, OFFSET SW_INT
51 0046 B8 2572 MOV AX, 2572H
52 0049 CD 21 INT 21H
53 004B B8 0000s MOV AX, DATA
54 004E 8E D8 MOV DS, AX
55
56 ; open main chip's interruption mask
Turbo Assembler Version 5.3 06-02-23 10:20:14 Page 2
code.asm
57 0050 E4 21 IN AL, 21H
58 0052 24 F7 AND AL, 11110111B
59 0054 E6 21 OUT 21H, AL
60
61 ; open slave chip's interruption mask
62 0056 E4 A1 IN AL, 0A1H
63 0058 24 FB AND AL, 11111011B
64 005A E6 A1 OUT 0A1H, AL
65
66 ; main code
67 005C BA 0283 MOV DX, 283H
68 005F B0 80 MOV AL, 10000000B
69 0061 EE OUT DX, AL
70 0062 BA 0283 MOV DX, 283H
71 0065 A1 0008r MOV AX, LED_STATE
72 0068 EE OUT DX, AL
73
74 0069 33 D2 XOR DX,DX
75 006B FB L1: STI
76 006C 83 FA 0A CMP DX, 10
77 006F 75 FA JNZ L1
78
79 ; reload main chip's original interruption vector
80 0071 FA CLI
81 0072 8B 16 0002r MOV DX,INT_SEG1
82 0076 8E DA MOV DS,DX
83 0078 8B 16 0000r MOV DX,INT_OFF1
84 007C B8 2572 MOV AX,2572H
85 007F CD 21 INT 21H
86 0081 B8 0000s MOV AX,DATA
87 0084 8E D8 MOV DS,AX
88
89 ; reload slave chip's original interruption vector
90 0086 FA CLI
91 0087 8B 16 0006r MOV DX,INT_SEG2
92 008B 8E DA MOV DS,DX
93 008D 8B 16 0004r MOV DX,INT_OFF2
94 0091 B8 2572 MOV AX,2572H
95 0094 CD 21 INT 21H
96 0096 B8 0000s MOV AX,DATA
97 0099 8E D8 MOV DS,AX
98
99 ; close main chip's interruption mask
100 009B E4 21 IN AL, 21H
101 009D 0C 08 OR AL, 00001000B
102 009F E6 21 OUT 21H, AL
103
104 ; close slave chip's interruption mask
105 00A1 E4 A1 IN AL, 0A1H
106 00A3 0C 04 OR AL, 00000100B
107 00A5 E6 A1 OUT 0A1H, AL
108 00A7 FB STI
109
110 ; return to DOS
111 00A8 B8 4C00 MOV AX,4C00H
112 00AB CD 21 INT 21H
113
Turbo Assembler Version 5.3 06-02-23 10:20:14 Page 3
code.asm
114 ; interruption service proccess
115 00AD SW_INT PROC NEAR
116 00AD 50 PUSH AX
117 00AE FA CLI
118 00AF 42 INC DX
119
120 00B0 52 PUSH DX
121 00B1 A1 0008r MOV AX, LED_STATE
122 00B4 03 C2 ADD AX, DX
123 00B6 25 0001 AND AX, 00000001B
124 00B9 BA 0283 MOV DX, 283H
125 00BC EE OUT DX, AL
126 00BD 5A POP DX
127
128 00BE B0 20 MOV AL, 20H
129 00C0 E6 20 OUT 20H, AL
130 00C2 B0 62 MOV AL, 62H
131 00C4 E6 A0 OUT 0A0H, AL
132 00C6 FB STI
133 00C7 58 POP AX
134 00C8 CF IRET
135 00C9 SW_INT ENDP
136
137
138 00C9 CODE ENDS
139 END START
Turbo Assembler Version 5.3 06-02-23 10:20:14 Page 4
Symbol Table
Symbol Name Type Value
??DATE Text "06-02-23"
??FILENAME Text "code "
??TIME Text "10:20:14"
??VERSION Number 0503
@CPU Text 0101H
@CURSEG Text CODE
@FILENAME Text CODE
@WORDSIZE Text 2
INT_OFF1 Word DATA:0000
INT_OFF2 Word DATA:0004
INT_SEG1 Word DATA:0002
INT_SEG2 Word DATA:0006
L1 Near16 CODE:006B
LED_STATE Word DATA:0008
START Near16 CODE:0000
SW_INT Near16 CODE:00AD
Groups & Segments Bit Size Align Combine Class
CODE 16 00C9 Para none
DATA 16 000A Para none
STACK 16 00C8 Para none
Turbo Assembler Version 5.3 06-02-23 10:20:14 Page 5
Error Summary
*Warning* code.asm(9) Reserved word used as symbol: STACK

8
Lab/Lab5/material/code.MAP Executable file
View File

@@ -0,0 +1,8 @@
LINK : warning L4021: no stack segment
Start Stop Length Name Class
00000H 00009H 0000AH DATA
00010H 000D7H 000C8H STACK
000E0H 001A8H 000C9H CODE
Program entry point at 000E:0000

BIN
Lab/Lab5/material/code.OBJ Executable file

Binary file not shown.

136
Lab/Lab5/material/code.asm Executable file
View File

@@ -0,0 +1,136 @@
DATA SEGMENT
INT_OFF1 DW 0 ; 存储主片原来中断向量的偏移地址
INT_SEG1 DW 0 ; 存储主片原来中断向量的段地址
INT_OFF2 DW 0 ; 存储从片原来中断向量的偏移地址
INT_SEG2 DW 0 ; 存储从片原来中断向量的段地址
LED_STATE DW 00000001B ; 0|xxx|0(B组0方式)|000(指定PC0引脚)|1(置位)
DATA ENDS
STACK SEGMENT
DW 100 DUP (0) ; 定义堆栈段大小为100字节
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
MOV AX, DATA ; 将数据段地址存入AX寄存器
MOV DS, AX ; 将AX中的值装载到DS寄存器
MOV ES, AX ; 将AX中的值装载到ES寄存器
MOV AX, STACK ; 将堆栈段地址存入AX寄存器
MOV SS, AX ; 将AX中的值装载到SS寄存器
CLI ; 清除中断标志,禁止中断,防止在修改中断向量表过程中有中断触发
; 保存主片原来的中断向量
MOV AX, 350BH ; 获取原来的中断号为0BH的中断向量
INT 21H ; 将中断向量的偏移地址存在BX段地址存在ES
MOV INT_OFF1, BX ; 分别将原来中断向量的偏移地址和段地址保存
MOV BX, ES
MOV INT_SEG1, BX
; 向主片装填新的中断向量
MOV DX, SEG SW_INT ; 将主片新中断向量的段地址存入DX
MOV DS, DX ; 再装到DS
MOV DX, OFFSET SW_INT ; 将主片新中断向量的偏移地址存入DX
MOV AX, 250BH ; 装填到中断向量表里中断号为0BH的中断向量
INT 21H
MOV AX, DATA ; 重新加载数据段地址
MOV DS, AX
; 保存从片原来的中断向量
MOV AX, 3572H ; 获取原来的中断号为72H的中断向量
INT 21H ; 将中断向量的偏移地址存在BX段地址存在ES
MOV INT_OFF2, BX ; 分别将原来中断向量的偏移地址和段地址保存
MOV BX, ES
MOV INT_SEG2, BX
; 向从片装填新的中断向量
MOV DX, SEG SW_INT ; 将从片新中断向量的段地址存入DX
MOV DS, DX ; 再装到DS
MOV DX, OFFSET SW_INT ; 将从片新中断向量的偏移地址存入DX
MOV AX, 2572H ; 装填到中断向量表里中断号为72H的中断向量
INT 21H
MOV AX, DATA ; 重新加载数据段地址
MOV DS, AX
; 取消主片MIRQ3的中断屏蔽
IN AL, 21H ; 读取主片中断屏蔽寄存器
AND AL, 11110111B ; 将第3位设置为0
OUT 21H, AL ; 将修改后的值写入主片中断屏蔽寄存器
; 取消从片SIRQ10的中断屏蔽
IN AL, 0A1H ; 读取从片中断屏蔽寄存器
AND AL, 11111011B ; 将第2位设置为0
OUT 0A1H, AL ; 将修改后的值写入从片中断屏蔽寄存器
; 主程序
MOV DX, 283H ; 8255芯片的命令口
MOV AL, 10000000B ; 1|00(A组0方式)|0(PA输出)|0(PC4-7输出)|0(B组0方式)|0(PB输出)|0(PC0-3输出)
OUT DX, AL
MOV DX, 283H ; 8255芯片的命令口
MOV AX, LED_STATE ; 输出控制LED的状态
OUT DX, AL
XOR DX, DX ; 将DX置0
L1: STI ; 设置中断标志
CMP DX, 10 ; 判断中断是否已触发了10次
JNE L1
CLI ; 清除中断标志,禁止中断,防止在修改中断向量表过程中有中断触发
; 恢复主片原来的中断向量
MOV DX, INT_SEG1 ; 将主片原中断向量的段地址存入DX
MOV DS, DX ; 再装到DS
MOV DX, INT_OFF1 ; 将主片原中断向量的偏移地址存入DX
MOV AX, 250BH ; 装填到中断向量表里中断号为0BH的中断向量
INT 21H
MOV AX, DATA ; 重新加载数据段地址
MOV DS, AX
; 恢复从片原来的中断向量
MOV DX, INT_SEG2 ; 将从片原中断向量的段地址存入DX
MOV DS, DX ; 再装到DS
MOV DX, INT_OFF2 ; 将从片原中断向量的偏移地址存入DX
MOV AX, 2572H ; 装填到中断向量表里中断号为72H的中断向量
INT 21H
MOV AX, DATA ; 重新加载数据段地址
MOV DS, AX
; 设置主片的中断屏蔽
IN AL, 21H ; 读取主片中断屏蔽寄存器
OR AL, 00001000B ; 将第3位设置为1
OUT 21H, AL ; 将修改后的值写入主片中断屏蔽寄存器
; 设置从片的中断屏蔽
IN AL, 0A1H ; 读取从片中断屏蔽寄存器
OR AL, 00000100B ; 将第2位设置为1
OUT 0A1H, AL ; 将修改后的值写入从片中断屏蔽寄存器
STI ; 设置中断标志
; 返回DOS
MOV AX, 4C00H
INT 21H
; 中断服务程序
SW_INT PROC NEAR
PUSH AX ; 保护主程序运行状态
CLI ; 清除中断标志,禁止中断程序执行过程中跳转到其他中断程序
INC DX ; 触发计数加1
PUSH DX ; 保护DX
MOV AX, LED_STATE
ADD AX, DX ; DX的末位会随着其增加交替为0和1
AND AX, 00000001B ; 取末位控制PC0为0或1
MOV DX, 283H ; 从而实现灯的亮灭交替
OUT DX, AL
POP DX ; 恢复DX
MOV AL, 20H ; 向主片发送EOI指令
OUT 20H, AL
MOV AL, 62H ; 向从片发送EOI指令
OUT 0A0H, AL
STI ; 设置中断标志,允许跳转到中断程序
POP AX ; 恢复主程序运行状态
IRET
SW_INT ENDP
CODE ENDS
END START

BIN
Lab/Lab5/material/cover.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

109
Lab/Lab5/material/graph.drawio Executable file
View File

@@ -0,0 +1,109 @@
<mxfile host="Electron" modified="2023-06-02T12:55:25.933Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.2.8 Chrome/112.0.5615.165 Electron/24.2.0 Safari/537.36" etag="95Rm5XCTjJJJ0MgO01JQ" version="21.2.8" type="device">
<diagram name="第 1 页" id="Ghm6eOXCY3Oxz9aPBUkc">
<mxGraphModel dx="1241" dy="744" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="PA3ascb84F3rLPraz_4V-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-1" target="PA3ascb84F3rLPraz_4V-3" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-1" value="程序开始" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="320" y="80" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-2" target="PA3ascb84F3rLPraz_4V-4" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-2" value="将新的中断程序的地址&lt;br&gt;写入主片和从片的对应的中断号" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="320" y="240" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-3" target="PA3ascb84F3rLPraz_4V-2" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-3" value="获取并保存主片和从片的原中断向量" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="320" y="160" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-4" target="PA3ascb84F3rLPraz_4V-5" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-4" value="打开主片和从片相应的中断屏蔽" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="320" y="320" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-5" target="PA3ascb84F3rLPraz_4V-6" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-5" value="初始化8255芯片" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="320" y="400" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-6" target="PA3ascb84F3rLPraz_4V-9" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-6" value="开中断" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="320" y="480" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-18" value="Y" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-9" target="FDWMo__iFbWUBXxNi3Jb-6" edge="1">
<mxGeometry x="-0.5" y="10" relative="1" as="geometry">
<mxPoint as="offset" />
<mxPoint x="340" y="620" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-19" value="N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-9" edge="1">
<mxGeometry x="-0.8889" y="-10" relative="1" as="geometry">
<mxPoint x="420" y="540" as="targetPoint" />
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-9" value="判断计数是否达到10次" style="rhombus;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="320" y="560" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-11" value="程序结束" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="320" y="800" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-20" target="PA3ascb84F3rLPraz_4V-22" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-20" value="收到高脉冲,中断程序开始" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="320" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-21" target="PA3ascb84F3rLPraz_4V-24" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-21" value="将LED灯状态取反" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="560" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-22" target="PA3ascb84F3rLPraz_4V-23" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-22" value="状态压栈,关中断" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="400" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-23" target="PA3ascb84F3rLPraz_4V-21" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-23" value="计数加1" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="480" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-24" target="PA3ascb84F3rLPraz_4V-25" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-24" value="向主从、片发送EOI命令开中断状态退栈" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="640" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="PA3ascb84F3rLPraz_4V-25" value="中断程序结束" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="720" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="FDWMo__iFbWUBXxNi3Jb-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="FDWMo__iFbWUBXxNi3Jb-6" target="FDWMo__iFbWUBXxNi3Jb-7">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="FDWMo__iFbWUBXxNi3Jb-6" value="恢复主片和从片的原中断向量" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="320" y="640" width="200" height="40" as="geometry" />
</mxCell>
<mxCell id="FDWMo__iFbWUBXxNi3Jb-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="FDWMo__iFbWUBXxNi3Jb-7" target="PA3ascb84F3rLPraz_4V-11">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="FDWMo__iFbWUBXxNi3Jb-7" value="关闭主片和从片相应的中断屏蔽" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="320" y="720" width="200" height="40" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 25 KiB