现代计算机接口实验 (三)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

时间: 2025-01-06 18:34:32

现代计算机接口实验 (三)8255实验的相关文章

2017-2018-1 20155235 实验三 实时系统 实验内容

2017-2018-1 20155235 实验三 实时系统 实验内容 一.并发程序-1 二.并发程序-2 三.并发程序-3 实验步骤 一.并发程序-1 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 客户端传一个文本文件给服务器 服务器返加文本文件中的单词数 wc命令的学习 Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项

实验三 指令实验(一)

实验三  指令实验(一) [实验目的] 1.掌握指令的含义,进一步加深对指令的认识: 2.掌握用Turbo Debugger调试程序的方法. [实验内容] 1.改写例3.81,找到result单元存1,未找到存0. 3.81 有一串L个字符的字符串存储于首地址为ASCII_STR的存储区中.如要求在字符串中找"空格"(ASCII码为20H)字符,找到则继续执行(NUM单元置1):如未找到则转到NOT_FOUND(NUM单元置0)去执行,编制实现这一要求的程序如下: MOV    CX,

1202实验三 进程调度实验

一.实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 二.实验内容和要求 1.要求:设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序. 进程调度算法:“时间片轮转法”调度算法对N个进程进行调度. 2.完成两个算法(简单时间片轮转法.多级反馈队列调度算法)的设计.编码和调试工作,完成实验报告. 1) 每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. 2) 每个进程的状

实验三进程调度实验

1. 目的和要求 实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 实验要求 设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序. 进程调度算法:“时间片轮转法”调度算法对N个进程进行调度. 2. 实验内容 完成两个算法(简单时间片轮转法.多级反馈队列调度算法)的设计.编码和调试工作,完成实验报告. 1) 每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. 2) 每个进

20145301&20145321&20145335实验三

20145301&20145321&20145335实验三 这次实验我的组员为:20145301赵嘉鑫.20145321曾子誉.20145335郝昊 实验内容详见:实验三

《软件测试》实验三

实验三 白盒测试 实验目的 (1)       学习白盒测试方法 (2)       掌握语句覆盖.条件覆盖.分支覆盖等逻辑覆盖方法 (3)       掌握Java代码分析工具的使用 实验内容 1. 计算整数X和整数Y的最大公约数.(不允许采用课堂上所用的方式实现) l  请用类和方法实现(定义一个类,在类中定义一个求最大公约数的方法),命名时请按照规范命名. l  在main方法中获取用户输入的两个整数,调用之前写的方法,输出它们的最大公约数. l  利用FindBugs查找程序中是否存在b

2017-2018-1 20155229 实验三 实时系统

2017-2018-1 20155229 实验三 实时系统 实验目的 了解实时系统的信息.特点等内容. 学习客户端和服务器之间的工作原理,并编写代码实现. 实验步骤 实验三-并发程序-1 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 客户端传一个文本文件给服务器 服务器返加文本文件中的单词数 wc命令的功能: 统计指定文件中的字节数.字数.行数,并将统计结果显示输出.该命令统计指定文件中的字节数.字数.行数.如果没有

2017-2018-1 20155311 实验三 实时系统

2017-2018-1 20155311 实验三 实时系统 实验内容 任务一 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位155203)和客户端 客户端传一个文本文件给服务器 服务器返加文本文件中的单词数 实现mywc Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 命令格式:wc[选项]文件... 命令功能:统计指定文件中的字节数.字数.行数,并将统计结果

2017-2018-1 20155227 实验三 实时系统

2017-2018-1 20155227 实验三 实时系统 实验目的,实验步骤 实验过程如下. 实验三-并发程序-1 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 客户端传一个文本文件给服务器 服务器返加文本文件中的单词数 上方提交代码 附件提交测试截图,至少要测试附件中的两个文件 client.c: #include<netinet/in.h> // sockaddr_in #include<sys/typ

2017-2018-1 20155218 实验三 实时系统

2017-2018-1 20155205 实验三 实时系统 实验一: 要求: (1)学习使用Linux命令wc(1) (2)基于Linux (3)Socket程序设计实现wc(1)服务器(端口号 是你学号的后6位)和客户端 (4)客户端传一个文本文件给服务器 (5)服务器返加文本文件中的单词数 过程: 使用man来查看wc(1) 按照要求,我们需要实现-w的功能: 按照要求实现wc(1)的功能: int mywc(FILE *fp) { char buffer[LEN]; int i=0,cou