现代计算机接口实验 (三)8255实验
;8255cs 288H~28BH
;pc7凹
;pB7~pB0-L7~L0
;pa7~pa0-k7~k0
;
;
DATA SEGMENT
PA EQU 288H
PB EQU 289H
PC EQU 28AH
CTL55 EQU 28BH
LTABLE DB 10 DUP(?)
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP(0)
STACK1 ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV CX,10
MOV SI,0
MOV DX,CTL55
MOV AL,10011000B
OUT DX,AL
WAT:
MOV DX,PC ;读C口
IN AL,DX
AND AL,80H ;检测PC7
JNZ WAT
MOV DX,PA ;PC7=0,读A口
IN AL,DX
MOV DX,PB ;送B口
OUT DX,AL
MOV LTABLE[SI],AL;将读取的开关值存放到内存单元TABLE中
INC SI
WAT1:
MOV DX,PC ;读C口
IN AL,DX
AND AL,80H ;检测PC7
JZ WAT1
LOOP WAT
MOV AH,4CH
INT 21H
CSEG ENDS
END START
2、A 口工作在方式0 输入方式,接8 个开关,B 口工作在方式0 输出方式,接
8 个LED, PC0 接产生1s脉冲的8253, 8253 输入负脉冲时,读一次A 口,同时在B 口显示。
;8255cs 288H~28BH
;8253cs-280H~283H
;CLK0-2MHZ ; CLK1-OUT0; OUT1-PC0;
;pB7~pB0-L7~L0
;pa7~pa0-k7~k0
;
;
DATA SEGMENT
T0 EQU 280H ;T0--CTL为计数器0--控制寄存器的地址
T1 EQU 281H
T2 EQU 282H
CTL1 EQU 283H
PA EQU 288H
PB EQU 289H
PC EQU 28AH
CTL55 EQU 28BH
LTABLE DB 10 DUP(?)
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP(0)
STACK1 ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DX,CTL55
MOV AL,10010001B;PC上输出PC下输入
OUT DX,AL
CALL Init_8253
WAT:
MOV DX,PC ;读C口
IN AL,DX
AND AL,01H ;检测PC0
JNZ WAT
MOV DX,PA ;PC7=0,读A口
IN AL,DX
MOV DX,PB ;送B口
OUT DX,AL
WAT1:
MOV DX,PC ;读C口
IN AL,DX
AND AL,01H ;检测PC0
JZ WAT1
JMP WAT
MOV AH,4CH
INT 21H;初始化8253
Init_8253 PROC
PUSH DX
PUSH AX
;/*8253产生1s的连续方波
MOV DX,CTL1
MOV AL,00100101B ;选择通道0,写入高字节,方式2,用BCD码
OUT DX,AL
MOV DX,T0
MOV AL,20H
OUT DX,AL
MOV DX,CTL1
MOV AL,01100111B ;选择通道1,写入高字节,方式3,用BCD码
OUT DX,AL
MOV DX,T1
MOV AL,10H
OUT DX,AL
;8253产生1S的连续方波*/
POP AX
POP DX
RET
Init_8253 ENDP
CSEG ENDS
END START
3、A 口工作在方式0,输入,接8 个开关,B 口工作在方式0,输出,接八段
显示器;由8253 产生1S 的脉冲,PC7 接该脉冲,来个脉冲将读取A 口,显示在
屏幕上,同时;显示在八段显示器上,PC0,PC1 作为位码信号。
;8253cs-280H~283H
;8255cs288H~28BH
;8255pa7pa0-k7-k0;pb6~b0-gfedcba
;CLK0-2MHZ ; CLK1-OUT0; OUT1-PC7;PC0-S0;PC1-S1;
;
DATA SEGMENT
T0 EQU 280H ;T0--CTL为计数器0--控制寄存器的地址
T1 EQU 281H
T2 EQU 282H
CTL1 EQU 283H
PA EQU 288H
PB EQU 289H
PC EQU 28AH
CTL EQU 28BH
LTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
;存储0~F的段码
DAT DB 21H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;主程序
START:
MOV AX,DATA
MOV DS,AX
CALL Init_8253
CALL Init_8255
AGAIN:
CALL READ_PA
CALL DISP_DAT
JMP AGAIN
MOV AH,4CH
INT 21H
;数码显示字符程序
LED_1 PROC
LEA SI,LTABLE
ADD SI,BX
MOV AL,[SI]
AND AL,7FH ;最高位设为0,以不显示小数点
MOV DX,PB
OUT DX,AL
RET
LED_1 ENDP
LED_S PROC
PUSH CX
PUSH BX;保存
MOV DX,PC ;熄位码
MOV AL,0H
OUT DX,AL;数码管熄灭
MOV BH,0
AND BL,0FH ;显示低四位~8421~0-F
CALL LED_1
MOV DX,PC ;选择低四位,即PC0置为1
MOV AL,1H
OUT DX,AL
MOV DX,PC ;熄位码
MOV AL,0H
OUT DX,AL;数码管熄灭
POP BX;调回保存的数,备用
PUSH BX;重新保存
MOV BH,0
MOV CL,4
SHR BL,CL
AND BL,0FH ;显示高四位
CALL LED_1
MOV DX,PC ;选择高四位,即PC1置为1
MOV AL,02H
OUT DX,AL
MOV DX,PC ;熄位码
MOV AL,0H
OUT DX,AL
POP BX
POP CX
RET
LED_S ENDP
;读取A口数据
READ_PA PROC
PUSH DX
PUSH AX
LOOP_CHECK:
MOV BH,0
MOV BL,DAT
CALL LED_S
MOV DX,PC ;8255 C口读入
IN AL,DX
TEST AL,80H ;判断1s脉冲
JNZ LOOP_CHECK
MOV DX, PA
IN AL,DX
MOV DAT,AL
POP AX
POP DX
RET
READ_PA ENDP
;电脑终端显示字符程序
DISP_DAT PROC
PUSH DX
PUSH AX
PUSH CX
MOV AL,DAT
MOV CL,4
SHR AL,CL
AND AL,0FH
CMP AL,0AH;和10比较
JC S1;BCD码 修正 ;〈10直接S1
ADD AL,7H;>9 要+7,用于进位
S1:
ADD AL,30H;加上0的ASCII码
MOV DL,AL ;高四位显示在屏幕上
MOV AH,02H
INT 21H
MOV AL,DAT
AND AL,0FH
CMP AL,0AH
JC S2
ADD AL,7H
S2:
ADD AL,30H
MOV DL,AL ;低四位显示在屏幕上
MOV AH,02H
INT 21H
MOV DL,' ' ;显示空格
MOV AH,02H
INT 21H
POP CX
POP AX
POP DX
RET
DISP_DAT ENDP
;初始化8253
Init_8253 PROC
PUSH DX
PUSH AX
;/*8253产生1s的连续方波
MOV DX,CTL1
MOV AL,00100101B ;选择通道0,写入高字节,方式2,用BCD码
OUT DX,AL
MOV DX,T0
MOV AL,20H
OUT DX,AL
;
MOV DX,CTL1
MOV AL,01100111B ;选择通道1,写入高字节,方式3,用BCD码
OUT DX,AL
MOV DX,T1
MOV AL,10H
OUT DX,AL
;8253产生1S的连续方波*/
POP AX
POP DX
RET
Init_8253 ENDP
;初始化8255
Init_8255 PROC
PUSH DX
PUSH AX
MOV DX,CTL ;8255方式字控制字控制;10011000
MOV AL,98H
OUT DX,AL
POP AX
POP DX
RET
Init_8255 ENDP
CODE ENDS
END START
4、A 口工作在方式0 输入方式,接4 个开关,B 口工作在方式0 输出方式,
接1 个七段显示器,PC7 接单脉冲发生器,输入负脉冲时,读一次A 口,同时
在B 口显示,读16 次结束。
;8253cs-280H~283H
;8255cs288H~28BH
;8255pa3pa0-k3-k0;pb6~b0-gfedcba
;8255PC7-凹,PC0-S1;
;
DATA SEGMENT
T0 EQU 280H ;T0--CTL为计数器0--控制寄存器的地址
T1 EQU 281H
T2 EQU 282H
CTL1 EQU 283H
PA EQU 288H
PB EQU 289H
PC EQU 28AH
CTL EQU 28BH
LTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
;存储0~F的段码
DAT DB 21H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;主程序
START:
MOV AX,DATA
MOV DS,AX
MOV CX,16
CALL Init_8255
AGAIN:
CALL READ_PA
CALL DISP_DAT
LOOP AGAIN
MOV AH,4CH
INT 21H
;数码显示字符程序
LED_1 PROC
LEA SI,LTABLE
ADD SI,BX
MOV AL,[SI]
AND AL,7FH ;最高位设为0,以不显示小数点
MOV DX,PB
OUT DX,AL
RET
LED_1 ENDP
LED_S PROC
PUSH CX
PUSH BX;保存
MOV DX,PC ;熄位码
MOV AL,0H
OUT DX,AL;数码管熄灭
MOV BH,0
AND BL,0FH ;显示低四位~8421~0-F
CALL LED_1
MOV DX,PC ;选择低四位,即PC0置为1
MOV AL,1H
OUT DX,AL
MOV DX,PC ;熄位码
MOV AL,0H
OUT DX,AL;数码管熄灭
; POP BX;调回保存的数,备用
; PUSH BX;重新保存
POP BX
POP CX
RET
LED_S ENDP
;读取A口数据
READ_PA PROC
PUSH DX
PUSH AX
PUSH CX
LOOP_CHECK:
MOV BH,0
MOV BL,DAT
CALL LED_S
MOV DX,PC ;8255 C口读入
IN AL,DX
TEST AL,80H ;判断PC7
JNZ LOOP_CHECK
MOV DX,PA
IN AL,DX
MOV DAT,AL
LOOP_C:
MOV BH,0
MOV BL,DAT
CALL LED_S
MOV DX,PC ;8255 C口读入
IN AL,DX
TEST AL,80H ;判断PC7
JZ LOOP_C
POP CX
POP AX
POP DX
RET
READ_PA ENDP
;电脑终端显示字符程序
DISP_DAT PROC
PUSH DX
PUSH AX
PUSH CX
MOV AL,DAT
MOV CL,4
SHR AL,CL
AND AL,0FH
CMP AL,0AH;和10比较
JC S1;BCD码 修正 ;〈10直接S1
ADD AL,7H;>9 要+7,用于进位
S1:
ADD AL,30H;加上0的ASCII码
MOV DL,AL ;高四位显示在屏幕上
MOV AH,02H
INT 21H
MOV AL,DAT;DFFGGFG
AND AL,0FH
CMP AL,0AH
JC S2
ADD AL,7H
S2:
ADD AL,30H
MOV DL,AL ;低四位显示在屏幕上
MOV AH,02H
INT 21H
MOV DL,' ' ;显示空格
MOV AH,02H
INT 21H
POP CX
POP AX
POP DX
RET
DISP_DAT ENDP
;初始化8255
Init_8255 PROC
PUSH DX
PUSH AX
MOV DX,CTL ;8255方式字控制字控制;10011000
MOV AL,98H
OUT DX,AL
POP AX
POP DX
RET
Init_8255 ENDP
CODE ENDS
END START