现代计算机接口实验 (三)8255实验

1、A 口工作在方式0 输入方式,接8 个开关,B 口工作在方式0 输出方式,接
8 个LED, PC7 接单脉冲发生器,输入负脉冲时,读一次A 口,存在TABLE 单
元中,同时在B 口显示,读10 次结束。

;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

原文地址:https://www.cnblogs.com/xujiayu/p/4947211.html