当前位置:首页 » 编程软件 » 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

热点内容
sql2008服务器 发布:2025-05-15 11:03:27 浏览:305
我的世界pe服务器创造 发布:2025-05-15 10:51:17 浏览:608
移动端打吃鸡要什么配置 发布:2025-05-15 10:48:16 浏览:756
我的世界哪五个服务器被炸了 发布:2025-05-15 10:36:16 浏览:994
ehcache存储对象 发布:2025-05-15 10:35:31 浏览:528
搭建虚拟电脑的服务器 发布:2025-05-15 10:29:31 浏览:270
湖人双核配置哪个最好 发布:2025-05-15 10:09:48 浏览:980
手机热点密码怎么查看 发布:2025-05-15 09:54:47 浏览:109
生意发力云存储 发布:2025-05-15 09:54:45 浏览:617
编写一个shell脚本添加用户 发布:2025-05-15 09:54:43 浏览:506