双机并口通信
海轰Pro
共 11234字,需浏览 23分钟
·
2021-09-21 18:40
一、设计内容及要求
a)通过8255芯片进行双机通信
b)通过一个机器的键盘输入,另一个机器的数码管进行输出,每次传输一个数字,可以连续传输
二、设计思想
双机均使用8255实现数据的读入和输出。
发送端使用A端口方式0输入来接收键盘上的值,C口高四位输入,B口方式1输出(B口通过数据线与接收端的B口相连,实现两个机器之间的通信)
接收端使用B端口方式1输入,接收来自发送端的数据,然后通过A端口方式0输出到数码管,控制数码管显示传输来的数字,C口高四位输出。
三、所用芯片的工作原理
8255A并行接口芯片
8255A 是 Intel 公司生产的通用并行 I/O 接口芯片,它具有 A、B、C 三个并行接口,用+5V 单电源供电,能在以下三种方式下工作:
方式 0—基本输入输出 方式 1—选通输入输出 方式 2—双向选通工作方式
8255A 的引脚图,工作方式控制字和 C 口按位置位复位控制字格式如下所示
四、系统接线图
五、软件设计
总体设计分为「发送端」和「接收端」两个程序;
「发送端:」
SEND:发送子程序,通过B口读取键盘值,然后通过C口检测接收端是否目前是否空闲,空闲则可以发送数据,然后跳转回初始状态; CCSCAN:键盘扫描子程序,不停的进行键盘扫描,如果有输入则暂停,发送到8255中; 主程序:当键盘扫描子程序检测到按键按下时,将数据通过B口进来,放进3000-3003缓冲区,然后判断按键值为多少,判断完成后调用SEND子程序将缓存区中的数据发送出去。
「接收端:」
RECEIVE:接收子程序,首先读取C口数据,当输入缓冲区有数据时就讲数据送往B口,调用显示子程序,并向发送端发送回应信号,表示数据已经送往外设。 DIS:显示子程序,将接收到的数据显示到数码管上。
六、运行结果及分析
七、心得体会
通过本次课程设计,我们实际动手设计了双机并口通信和计算器,深入理解了微机原理与接口这门课程的使用性,实践出真知,在这次课程设计中,我们出现了很多问题,遇到了很多困难,在不断的失败不断的尝试中,我们终于成功完成了这两个设计。
通过这学期的学习和实践,我们对汇编语言,各种芯片的作用有了比较深入的理解,对计算机的运行机制有了更加深入的认识,我们将继续努力学习相关知识,希望可以在专业领域更上一层楼!
八、程序源代码
Send
IOY0 EQU 0600H ;片选IOY0对应的端口始地址
MY8255_A EQU IOY0+00H*2 ;8255的A口地址
MY8255_B EQU IOY0+01H*2 ;8255的B口地址
MY8255_C EQU IOY0+02H*2 ;8255的C口地址
MY8255_CON EQU IOY0+03H*2 ;8255的控制寄存器地址
SSTACK SEGMENT
DW 256 DUP(?)
SSTACK ENDS
DATA SEGMENT
DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_CON
MOV AL,8DH ;使A端口方式0辥º,C高四位输入,B口方式1输出
OUT DX,AL
MOV DX,MY8255_CON
MOV AL,05H ;使ACK置1,数据未送外设,即PC2=1
OUT DX,AL
BEGIN:
CALL DALLY
CALL CCSCAN ;扫描
JNZ INK1
JMP BEGIN
INK1:
CALL DALLY
CALL CCSCAN
JNZ INK2 ;有键按下,转到INK2
JMP BEGIN
;确定按下键的位置
INK2:
MOV CH,0FEH
MOV CL,00H
COLUM:
MOV AL,CH
MOV DX,MY8255_A
OUT DX,AL
MOV DX,MY8255_C
IN AL,DX
and al,0f0h
L1:
TEST AL,10H ;is L1?
JNZ L2
MOV AL,00H ;L1
JMP KCODE
L2:
TEST AL,20H ;is L2?
JNZ L3
MOV AL,04H ;L2
JMP KCODE
L3:
TEST AL,40H ;is L3?
JNZ L4
MOV AL,08H ;L3
JMP KCODE
L4:
TEST AL,80H ;is L4?
JNZ NEXT
MOV AL,0CH ;L4
KCODE:
ADD AL,CL
CALL SEND ;键盘值发送
KRET:
PUSH AX
KON:
CALL CCSCAN
JNZ KON
POP AX
NEXT:
INC CL
MOV AL,CH
TEST AL,80H
JZ KERR
ROL AL,1
MOV CH,AL
JMP COLUM
KERR:
JMP BEGIN
;发送子程序:将3000-3005缓冲区的内容发送给接收机
SEND:
MOV DX,MY8255_B
OUT DX,AL ;把键盘值送端口B
MOV DX,MY8255_C
IN AL,DX ;读端口C中的数据
AND AL,04H ;测试ACK=0?
JZ KRET ;ACK为0跳转,表示数据已送到外设,可以再次输入
MOV DX,MY8255_A
MOV AL,00H ;将OBF置0,表明已向指定的端口输出了数据,
OUT DX,AL ;等待外设取走数据
CALL DALLY
ret ;无条件跳转到BEGIN
CCSCAN:
MOV AL,00H ;键盘扫描子程序
MOV DX,MY8255_A
OUT DX,AL
MOV DX,MY8255_C
IN AL,DX
NOT AL
AND AL,0F0H
RET
DALLY:
PUSH CX ;延时子程序
MOV CX,0006H
T1:
MOV AX,009FH
T2:
DEC AX
JNZ T2
LOOP T1
POP CX
RET
CODE ENDS
END START
RECEIVE
IOY0 EQU 0600H ;片选IOY0对应的端口始地址
MY8255_A EQU IOY0+00H*2 ;8255的A口地址
MY8255_B EQU IOY0+01H*2 ;8255的B口地址
MY8255_C EQU IOY0+02H*2 ;8255的C口地址
MY8255_CON EQU IOY0+03H*2 ;8255的控制寄存器地址
SSTACK SEGMENT
DW 256 DUP(?)
SSTACK ENDS
DATA SEGMENT
DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV SI,3000H
MOV AL,00H
MOV [SI],AL ;清显示缓冲
;MOV [SI+1],AL
;MOV DI,3001H
MOV DX,MY8255_CON
MOV AL,8EH ;使A端口方式0输出,C高四位输出,B口方式1输入
OUT DX,AL
MOV DX,MY8255_C
MOV AL,40H ;使STB为1,输入缓冲器为空
OUT DX, AL
CALL CLEAR
RECEIVE:
MOV DX,MY8255_C ;读C口数据
IN AL,DX
AND AL,40H ;测试STB=0?
JNZ RECEIVE ;STB为1则跳转,表明输入缓冲器为空
MOV DX,MY8255_B
IN AL,DX ;接收到的数据保存在端口B,读B口的数据
CALL PUTBUF ;数据保存到指定缓冲中
CALL DIS ;调用显示子程庍
MOV DX,MY8255_CON
MOV AL,01H ;将IBF置1,向发送端发送回应信号,表明数据已送到外设,但尚未取走
OUT DX,AL
CALL DELAY ;延时
MOV AL,00H ;将IBF重新置0,等待接收新的数据被送到外设
OUT DX,AL
JMP RECEIVE
CLEAR:
MOV DX,MY8255_A ;清屏子程序
MOV AL,00H
OUT DX,AL
RET
DIS:
CALL CLEAR
PUSH AX ;显示子程序
MOV SI,3000H
;MOV DL,0F7H
;MOV AL,DL
;AGAIN:
PUSH DX
;MOV DX,MY8255_C ;控制显示在哪个数码管,x4-x1
;OUT DX,AL
;MOV SI,DI
MOV AL,[SI]
MOV BX,OFFSET DTABLE
AND AX,00FFH
ADD BX,AX
MOV AL,[BX]
MOV DX,MY8255_A ;A口输出,显示在数码管
OUT DX,AL
CALL DELAY
;INC SI
POP DX
;MOV AL,DL
;TEST AL,04H ;²⊔µڶλ£¬Ő¶ϊǷ½º»
;JZ OUT1
;ROR AL,1
;MOV DL,AL
;JMP AGAIN
;OUT1:
POP AX
RET
PUTBUF:
;MOV SI,DI ;存键盘值到相应位的缓冲中
MOV [SI],AL
;DEC DI
;CMP DI,2FFFH
;JNZ GOBACK
;MOV DI,3001H
;GOBACK:
RET
DELAY:
PUSH CX ;延时子程序
MOV CX,0006H
T1:
MOV AX,009FH
T2:
DEC AX
JNZ T2
LOOP T1
POP CX
RET
CODE ENDS
END START
结语
代码均为原创
版权归原作者所有
仅供小伙伴们学习参考使用
请勿用作其余用途!
创作不易
如果您觉得写得不错的话
「点赞+在看+收藏」 ❤️
评论