一、实验要求
- 二极管控制:设定8255的PA口为开关量输入,PC口为开关量输出,要求能随时将PA口的开关状态通过PC口的发光二极管显示出来。
- 电子秒表实现:用8255A实现一电子秒表,计时范围0-99.99秒,应具有“START”,“STOP”,“CLEAR”三个按键,分别完成开始,停止,清零功能。
二、实验目的
- 学习使用8255各个口的不同工作方式。
三、实验电路
实验1
(1)原理分析:
8255芯片引脚图:
CPU对8255的读/写操作是通过CS,A1和A0三个引脚的状态来识别的,通过WR和RD信号控制的。
8255的寻址:
8255有三种基本工作方式,A组可采用方式0到方式2,而B组只能采用方式0和方式1,这是由8255的方式控制寄存器控制。
假设8255的端口地址为0200H(端口A),0202H(端口B),0204H(端口C),0206H(控制端口)。CPU地址线A2连接8255引脚A1,CPU地址线A1连接8255引脚A0。
- 设置8255引脚A1=1,A0=1,当D0-D7输入为1001 0000B,即为90H时,控制方式为A组工作方式0,表示基本的输入/输出操作。A口表示输入,C口表示输出。
- 设置8255引脚A1=0,A0=0,选中端口A,接受输入,D0-D7为A端口输入值。
- 设置8255引脚A1=1,A0=0,选中端口C,D0—D7的值将在端口C输出。
CPU不断改变输出的地址,以便达到将端口A读入数据输出到端口C的目的。由于发光二极管采用共阳极接法,故将端口A读入数据取反后输出到端口C
(2)电路连接图:
实验2
(1)原理分析:
假设8255的端口地址为0200H(端口A),0202H(端口B),0204H(端口C),0206H(控制端口)。CPU地址线A2连接8255引脚A1,CPU地址线A1连接8255引脚A0。
初始化:设置8255引脚A1=1,A0=1,当D0—D7输入为1000 1001B,即为89H时,控制方式为A组工作方式为方式0,B组为方式0,表示基本的输入/输出操作。A口表示输出,B口表示输出,C口表示输入。
设置端口地址为0202H,即选中端口B时,准备输出AL=40H,数字0。
START:在端口地址0200H,依次输出AL=0001B、0010B、0100B、1000B选中1,2,3,4数码管。在端口地址0202H,依次输出0到9的数字。每一次四个数码管显示结束,都需要判断是否出现进位。
判断按键状态:设置端口地址0204H,读入C端口的数据,从而判断此时按键的状态。
STOP:通过判断C端口的数据,当输入为 0000 0110 时,表示暂停。此时显示当前计时即可。当检测到C端口输入为 0000 0101 时,表示继续计时。
CLEAR:当C端口输入为0000 0011时,数码管上的数字全部清零,重新开始计时。
(2)程序流程图:
(3)电路连接图:
四、实验代码及实验结果
实验1
(1)实验代码:
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AL,90H ;控制A输入C输出
MOV DX,206H
OUT DX,AL
RUN:
MOV AL, 0H
MOV DX, 200H
IN AL, DX ;端口A读入
NOT AL
MOV DX, 204H
OUT DX, AL ;端口C输出
JMP RUN
CODE ENDS
END START
(2)实验结果:
实验2
(1)实验代码:
DATA SEGMENT
NUMBER DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
MIN1 DB 0
MIN2 DB 0
SEC1 DB 0
SEC2 DB 0
CIR DW 800
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AL, 89H
MOV DX, 206H ;初始化
OUT DX, AL ;A,B输出,C输入
MOV BX, 0H
LEA SI, NUMBER
OUTPUT:
MOV AL, 00000001B
MOV DX, 200H ;选中第4个数码管
OUT DX, AL
MOV BL, SEC2 ;输出SEC2
MOV AL, [SI+BX]
MOV DX, 202H
OUT DX, AL
MOV CX, CIR
S4:
LOOP S4
MOV AL, 00000010B
MOV DX, 200H ;选中第3个数码管
OUT DX, AL
MOV BL, SEC1
MOV AL, [SI+BX]
MOV DX, 202H
OUT DX, AL
MOV CX, CIR
S3:
LOOP S3
MOV AL, 00000100B
MOV DX, 200H ;选中第2个数码管
OUT DX, AL
MOV BL, MIN2
MOV AL, [SI+BX]
MOV DX, 202H
OUT DX, AL
MOV CX, CIR
S2:
LOOP S2
MOV AL, 00001000B
MOV DX, 200H ;选中第3个数码管
OUT DX, AL
MOV BL, MIN1
MOV AL, [SI+BX]
MOV DX, 202H
OUT DX, AL
MOV CX, CIR
S1:
LOOP S1
;四个数码管显示结束,判断C端口状态
MOV DX, 204H
IN AL, DX
CMP AL, 06H
JE STOP ;STOP暂停计时
CMP AL, 03H
JE TAIL1 ;CLEAR清零计时
;没有按按键或者按了STRAT,增加秒数并判断是否进位
INC SEC2
CMP SEC2, 10
JNZ OUTPUT
;SEC2 = 10,进位
MOV SEC2, 0H
INC SEC1
CMP SEC1, 10
JNZ OUTPUT
;SEC1 = 10,进位
MOV SEC1, 0H
INC MIN2
CMP MIN2, 10
JNZ OUTPUT
;MIN2 = 10, 进位
MOV MIN2, 0H
INC MIN1
CMP MIN1, 10
JNZ OUTPUT
;MIN1 = 10,清零
MOV MIN1, 0H
JMP OUTPUT
STOP:
MOV AL, 00000001B
MOV DX, 200H ;选中第4个数码管
OUT DX, AL
MOV BL, SEC2
MOV AL, [SI+BX]
MOV DX, 202H
OUT DX, AL
MOV CX, CIR
S8:
LOOP S8
MOV AL, 00000010B
MOV DX, 200H ;选中第3个数码管
OUT DX, AL
MOV BL, SEC1
MOV AL, [SI+BX]
MOV DX, 202H
OUT DX, AL
MOV CX, CIR
S7:
LOOP S7
MOV AL, 00000100B
MOV DX, 200H ;选中第2个数码管
OUT DX, AL
MOV BL, MIN2
MOV AL, [SI+BX]
MOV DX, 202H
OUT DX, AL
MOV CX, CIR
S6:
LOOP S6
MOV AL, 00001000B
MOV DX, 200H ;选中第1个数码管
OUT DX, AL
MOV BL, MIN1
MOV AL, [SI+BX]
MOV DX, 202H
OUT DX, AL
MOV CX, CIR
S5:
LOOP S5
; 判断是继续计时、暂停还是清零
MOV DX, 204H
IN AL, DX
CMP AL, 05H ;START按键按下
JE OUTPUT
CMP AL, 03H ;CLEAR按键按下
JE TAIL2
JMP STOP
TAIL1:
CALL ZERO
JMP OUTPUT
TAIL2:
CALL ZERO
JMP STOP
ZERO PROC
MOV SEC2, 0H
MOV SEC1, 0H
MOV MIN1, 0H
MOV MIN2, 0H
RET
ZERO ENDP
CODE ENDS
END START
(2)实验结果:
五、实验总结
通过本次实验,我对硬件电路设计有了更深一步的了解,也更加熟悉了Proteus的基本使用方法,掌握了8255各个口的不同工作方式。