实验七 基于8255的开关状态显示实验
1、编写程序,设定8255的PA口为开关量输入,PC口为开关量输出,要求能随时将PA口的开关状态通过PC口的发光二极管显示出来。
8255芯片:
CPU对8255的读/写操作,是对哪个端口的读/写操作,是通过CS,A1和A0三个引脚的状态来识别的,读写操作是通过WR和RD信号控制的。
8255有三种基本工作方式,A组可采用方式0到方式2,而B组只能采用方式0和方式1,这是由8255的方式控制寄存器控制。
题目分析:
假设8255的端口地址为0200H(端口A),0202H(端口B),0204H(端口C),0206H(控制端口)。CPU地址线A2连接8255引脚A1,CPU地址线A1连接8255引脚A0。
a) 设置8255引脚A1=1,A0=1,当D0—D7输入为1001 0000B,即为90H时,控制方式为A组工作方式为方式0,表示基本的输入/输出操作。A口表示输入,C口表示输出。
b) 设置8255引脚A1=0,A0=0,选中端口A,接受输入,D0—D7为A端口输入值。
c) 设置8255引脚A1=1,A0=0,选中端口C,D0—D7的值将在端口C输出。
CPU不断改变输出的地址,以便达到将端口A读入数据输出到端口C的目的。
由于发光二极管采用共阳极接法,故将端口A读入数据取反后输出到端口C。
汇编代码:
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、用8255A实现一电子秒表,计时范围0-99.99秒,应具有“START”,“STOP”,“CLEAR”三个按键,分别完成开始,停止,清零功能。
题目分析:
假设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时,数码管上的数字全部清零,重新开始计时。
电路连接说明:
程序流程图:
汇编代码:
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
电路连接图:
实验部分过程截图:
参考文献:
《微型计算机原理及应用(第三版)》李伯成、侯伯亨等编著