當前位置:首頁 » 編程軟體 » 8255編程

8255編程

發布時間: 2022-09-28 19:57:36

㈠ 微機原理8255編程

;;8255硬體連接及軟體設置:
;;B口方式0輸入,PB0~PB3分別連接K1~K4;
;;A口方式0輸出,PA0~PA3外接驅動電路控制燈的4種動作;
;;驅動電路,可由74LS06、ULN2003作反相電流放大驅動繼電器或固體繼電器組成;
;;C口閑置;
;;按以上設置,8255方式控制字是82H ;
;;在PC機作主機的系統中,8255的4個寄存器地址是:
;;A口60H,B口61H,方式控制寄存器63H。

;;匯編程序如下:

SSEG SEGMENT PARA STACK ;堆棧段定義
DW 30H DUP(?)
SSEG ENDS

CSEG SEGMENT ;代碼段定義
ASSUME CS:CSEG,DS:CSEG

ORG 200h ;主程序首址
START: MOV AL, 82H ;方式控制字
MOV DX, 63H
OUT DX, AL ;方式控制字送入方式控制寄存器
Scan: IN AL,61H ;掃描從B口讀入的K1~K4狀態
CALL PRC1 ;開燈、關燈
CALL PRC2 ;是否暫停
CALL PRC3 ;是否換向
CALL PRC3 ;是否移動
JMP Scan ;主程序循環

PRC1 PROC NEAR ;"開/關燈"操作 子程序定義
PUSH AX ;B口狀態進棧暫存
TEST AL,00000001B ;檢測PB0輸入狀態
JZ CloseL ;若PB0低電平,表示K1斷,轉CloseL處執行
OpenL: OUT 60H,AL ;若PB0高電平,表示K1通,PA0輸出高電平,開燈
JMP RT1 ;轉RT1處指令返回
CloseL: MOV AL,00000000B ;PA0輸出低電平
OUT 60H,AL ;關燈
RT1: POP AX ;B口狀態出棧
RET ;返回主程序
PRC1 ENDP ;子程序定義完畢

PRC2 PROC NEAR ;"暫停"操作 子程序定義
PUSH AX ;B口狀態進棧暫存
TEST AL,00000010B ;檢測PB1輸入狀態
JZ RT2 ;若PB1低電平,表示K2斷,不暫停
PAUS: OUT 60H,AL ;若PB1高電平,表示K2通,PA1輸出高電平,暫停
RT2: POP AX ;B口狀態出棧
RET ;返回主程序
PRC2 ENDP ;子程序定義完畢

PRC3 PROC NEAR ;"換向"操作 子程序定義
PUSH AX ;B口狀態進棧暫存
TEST AL,00000100B ;檢測PB2輸入狀態
JZ RT3 ;若PB2低電平,表示K3斷,不換向
CHG: MOV AL,00000101B ;若PB2高電平,表示K3通
OUT 60H,AL ;PA2、PA0輸出高電平、換向,燈保持亮
RT3: POP AX ;B口狀態出棧
RET ;返回主程序
PRC3 ENDP ;子程序定義完畢

PRC4 PROC NEAR ;"移動"操作 子程序定義
TEST AL,00001000B ;檢測PB3輸入狀態
JZ RT4 ;若PB3低電平,表示K4斷,不移動
MOVE: MOV AL,00001001B ;若PB3高電平,表示K4通
OUT 60H,AL ;PA3、PA0輸出高電平、移動,燈保持亮
RT4: RET ;返回主程序
PRC4 ENDP ;子程序定義完畢

CSEG ENDS ;代碼段定義完畢
END START ;主程序結束

㈡ 8255編程

RESET:復位輸入線,當該輸入端外於高電平時,所有內部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成輸入方式。
CS:晶元選擇信號線,當這個輸入引腳為低電平時,即/CS=0時,表示晶元被選中,允許8255與CPU進行通訊;/CS=1時,8255無法與CPU做數據傳輸.
RD:讀信號線,當這個輸入引腳為低電平時,即/RD=0且/CS=0時,允許8255通過數據匯流排向CPU發送數據或狀態信息,即CPU從8255讀取信息或數據。
WR:寫入信號,當這個輸入引腳為低電平時,即/WR=0且/CS=0時,允許CPU將數據或控制字寫入8255。
D0~D7:三態雙向數據匯流排,8255與CPU數據傳送的通道,當CPU 執行輸入輸出指令時,通過它實現8位數據的讀/寫操作,控制字和狀態信息也通過數據匯流排傳送。
PA0~PA7:埠A輸入輸出線,一個8位的數據輸出鎖存器/緩沖器, 一個8位的數據輸入鎖存器。
PB0~PB7:埠B輸入輸出線,一個8位的I/O鎖存器, 一個8位的輸入輸出緩沖器。
PC0~PC7:埠C輸入輸出線,一個8位的數據輸出鎖存器/緩沖器, 一個8位的數據輸入緩沖器。埠C可以通過工作方式設定而分成2個4位的埠, 每個4位的埠包含一個4位的鎖存器,分別與埠A和埠B配合使用,可作為控制信號輸出或狀態信號輸入埠。'
A0,A1:地址選擇線,用來選擇8255的PA口,PB口,PC口和控制寄存器.
當A0=0,A1=0時,PA口被選擇;
當A0=0,A1=1時,PB口被選擇;
當A0=1,A1=0時,PC口被選擇;
當A0=1.A1=1時,控制寄存器被選擇.

㈢ 用匯編語言編程,使用8255

;******* 假設8255的基地址為BaseAddress **************************
;******* 則定義其它各個埠地址如下 **************************
#define BaesAddress_8255 BaseAddress
#define Address_A BaesAddress_8255 + 0
#define Address_B BaesAddress_8255 + 1
#define Address_C BaesAddress_8255 + 2
#define Address_Ctrl BaesAddress_8255 + 3

#define Letter_A 65
#define Letter_Z 90

#define L0_ON L0_ON
#define L0_OFF L0_OFF

;******* 假設8255A口為方式0輸出,B口為方式0輸入
;******* 則晶元初始化程序如下 *********************
init:
push ax

push dx

mov al, 82H
mov dx, Address_Ctrl
out dx, al
pop dx
pop ax
ret

;************** 以下代碼可以讓程序暫停一小會兒 ****************
Wait_a_while:
push ax

push dx

xor ax,ax

mov dx,ax

Dly1:
dec ax
jnz ax,Dly1
dec dx
jnz dx,Dly1

pop dx
pop ax
ret

;*************** 主程序開始 **********************
start:
call init
start1:
mov dx, Address_B
in al, dx

cmp al, Letter_Z + 1

jb Light_L0 ;讀取到的值小於91,為大寫字母,轉到Light_L0執行點亮L0

;*************** 讓L0閃爍3次 ***********************
Flash_L0: ;讀取到的值大於91,為小寫字母,執行以下代碼閃爍L0
mov cx, 0x3

Flash_Loop:
mov dx, Address_A
mov al, L0_ON
out dx, al ;點亮L0

call Wait_a_while ;暫停一下
mov dx, Address_A
mov al, L0_OFF
out dx, al ;關閉L0

call Wait_a_while ;暫停一下
loop Flash_Loop
jmp Function_End ;跳轉至程序結束

;**************** 點亮L0 ******************
Light_L0:
mov dx, Address_A
mov al, L0_ON
out dx, al ;點亮L0

Function_End: ;程序結束
ret

熱點內容
位元組和存儲位元組 發布:2025-05-15 07:32:10 瀏覽:520
linux應用開發工程師 發布:2025-05-15 07:32:07 瀏覽:260
sqldcl 發布:2025-05-15 07:29:18 瀏覽:199
canvas的圖像上傳 發布:2025-05-15 07:29:17 瀏覽:102
離線緩存為什麼點不動 發布:2025-05-15 07:27:17 瀏覽:829
釘鼎伺服器出口ip 發布:2025-05-15 07:13:08 瀏覽:279
移動硬碟和光碟哪個存儲時間長 發布:2025-05-15 07:04:25 瀏覽:489
壓縮一定 發布:2025-05-15 06:57:30 瀏覽:289
進棧演算法 發布:2025-05-15 06:56:02 瀏覽:215
安卓和緩存 發布:2025-05-15 06:56:02 瀏覽:428