雙機(jī)并口通信
一、設(shè)計(jì)內(nèi)容及要求
a)通過8255芯片進(jìn)行雙機(jī)通信
b)通過一個(gè)機(jī)器的鍵盤輸入,另一個(gè)機(jī)器的數(shù)碼管進(jìn)行輸出,每次傳輸一個(gè)數(shù)字,可以連續(xù)傳輸
二、設(shè)計(jì)思想
雙機(jī)均使用8255實(shí)現(xiàn)數(shù)據(jù)的讀入和輸出。
發(fā)送端使用A端口方式0輸入來接收鍵盤上的值,C口高四位輸入,B口方式1輸出(B口通過數(shù)據(jù)線與接收端的B口相連,實(shí)現(xiàn)兩個(gè)機(jī)器之間的通信)
接收端使用B端口方式1輸入,接收來自發(fā)送端的數(shù)據(jù),然后通過A端口方式0輸出到數(shù)碼管,控制數(shù)碼管顯示傳輸來的數(shù)字,C口高四位輸出。
三、所用芯片的工作原理
8255A并行接口芯片
8255A 是 Intel 公司生產(chǎn)的通用并行 I/O 接口芯片,它具有 A、B、C 三個(gè)并行接口,用+5V 單電源供電,能在以下三種方式下工作:
方式 0—基本輸入輸出 方式 1—選通輸入輸出 方式 2—雙向選通工作方式
8255A 的引腳圖,工作方式控制字和 C 口按位置位復(fù)位控制字格式如下所示

四、系統(tǒng)接線圖


五、軟件設(shè)計(jì)
總體設(shè)計(jì)分為「發(fā)送端」和「接收端」兩個(gè)程序;
「發(fā)送端:」
SEND:發(fā)送子程序,通過B口讀取鍵盤值,然后通過C口檢測(cè)接收端是否目前是否空閑,空閑則可以發(fā)送數(shù)據(jù),然后跳轉(zhuǎn)回初始狀態(tài); CCSCAN:鍵盤掃描子程序,不停的進(jìn)行鍵盤掃描,如果有輸入則暫停,發(fā)送到8255中; 主程序:當(dāng)鍵盤掃描子程序檢測(cè)到按鍵按下時(shí),將數(shù)據(jù)通過B口進(jìn)來,放進(jìn)3000-3003緩沖區(qū),然后判斷按鍵值為多少,判斷完成后調(diào)用SEND子程序?qū)⒕彺鎱^(qū)中的數(shù)據(jù)發(fā)送出去。
「接收端:」
RECEIVE:接收子程序,首先讀取C口數(shù)據(jù),當(dāng)輸入緩沖區(qū)有數(shù)據(jù)時(shí)就講數(shù)據(jù)送往B口,調(diào)用顯示子程序,并向發(fā)送端發(fā)送回應(yīng)信號(hào),表示數(shù)據(jù)已經(jīng)送往外設(shè)。 DIS:顯示子程序,將接收到的數(shù)據(jù)顯示到數(shù)碼管上。
六、運(yùn)行結(jié)果及分析


七、心得體會(huì)
通過本次課程設(shè)計(jì),我們實(shí)際動(dòng)手設(shè)計(jì)了雙機(jī)并口通信和計(jì)算器,深入理解了微機(jī)原理與接口這門課程的使用性,實(shí)踐出真知,在這次課程設(shè)計(jì)中,我們出現(xiàn)了很多問題,遇到了很多困難,在不斷的失敗不斷的嘗試中,我們終于成功完成了這兩個(gè)設(shè)計(jì)。
通過這學(xué)期的學(xué)習(xí)和實(shí)踐,我們對(duì)匯編語(yǔ)言,各種芯片的作用有了比較深入的理解,對(duì)計(jì)算機(jī)的運(yùn)行機(jī)制有了更加深入的認(rèn)識(shí),我們將繼續(xù)努力學(xué)習(xí)相關(guān)知識(shí),希望可以在專業(yè)領(lǐng)域更上一層樓!
八、程序源代碼
Send
IOY0 EQU 0600H ;片選IOY0對(duì)應(yīng)的端口始地址
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辥??o,C高四位輸入,B口方式1輸出
OUT DX,AL
MOV DX,MY8255_CON
MOV AL,05H ;使ACK置1,數(shù)據(jù)未送外設(shè),即PC2=1
OUT DX,AL
BEGIN:
CALL DALLY
CALL CCSCAN ;掃描
JNZ INK1
JMP BEGIN
INK1:
CALL DALLY
CALL CCSCAN
JNZ INK2 ;有鍵按下,轉(zhuǎn)到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 ;鍵盤值發(fā)送
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
;發(fā)送子程序:將3000-3005緩沖區(qū)的內(nèi)容發(fā)送給接收機(jī)
SEND:
MOV DX,MY8255_B
OUT DX,AL ;把鍵盤值送端口B
MOV DX,MY8255_C
IN AL,DX ;讀端口C中的數(shù)據(jù)
AND AL,04H ;測(cè)試ACK=0?
JZ KRET ;ACK為0跳轉(zhuǎn),表示數(shù)據(jù)已送到外設(shè),可以再次輸入
MOV DX,MY8255_A
MOV AL,00H ;將OBF置0,表明已向指定的端口輸出了數(shù)據(jù),
OUT DX,AL ;等待外設(shè)取走數(shù)據(jù)
CALL DALLY
ret ;無(wú)條件跳轉(zhuǎn)到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 ;延時(shí)子程序
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對(duì)應(yīng)的端口始地址
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口數(shù)據(jù)
IN AL,DX
AND AL,40H ;測(cè)試STB=0?
JNZ RECEIVE ;STB為1則跳轉(zhuǎn),表明輸入緩沖器為空
MOV DX,MY8255_B
IN AL,DX ;接收到的數(shù)據(jù)保存在端口B,讀B口的數(shù)據(jù)
CALL PUTBUF ;數(shù)據(jù)保存到指定緩沖中
CALL DIS ;調(diào)用顯示子程庍
MOV DX,MY8255_CON
MOV AL,01H ;將IBF置1,向發(fā)送端發(fā)送回應(yīng)信號(hào),表明數(shù)據(jù)已送到外設(shè),但尚未取走
OUT DX,AL
CALL DELAY ;延時(shí)
MOV AL,00H ;將IBF重新置0,等待接收新的數(shù)據(jù)被送到外設(shè)
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 ;控制顯示在哪個(gè)數(shù)碼管,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口輸出,顯示在數(shù)碼管
OUT DX,AL
CALL DELAY
;INC SI
POP DX
;MOV AL,DL
;TEST AL,04H ;2?μ?λ£?????????o???
;JZ OUT1
;ROR AL,1
;MOV DL,AL
;JMP AGAIN
;OUT1:
POP AX
RET
PUTBUF:
;MOV SI,DI ;存鍵盤值到相應(yīng)位的緩沖中
MOV [SI],AL
;DEC DI
;CMP DI,2FFFH
;JNZ GOBACK
;MOV DI,3001H
;GOBACK:
RET
DELAY:
PUSH CX ;延時(shí)子程序
MOV CX,0006H
T1:
MOV AX,009FH
T2:
DEC AX
JNZ T2
LOOP T1
POP CX
RET
CODE ENDS
END START
結(jié)語(yǔ)
代碼均為原創(chuàng)
版權(quán)歸原作者所有
僅供小伙伴們學(xué)習(xí)參考使用
請(qǐng)勿用作其余用途!
創(chuàng)作不易
如果您覺得寫得不錯(cuò)的話
「點(diǎn)贊+在看+收藏」 ??
