单片机控制8255按键控制8个发光二极管程序编程

单片机控制8255按键控制8个发光二极管程序编程,第1张

设定:8255PA、PC口为输入、PB作输出(均为方式0)罩和闷.

MOV DPTR, #0FF2BH 假设命令口地址FF2BH

MOV A, #10011001B 命令字.

MOVX @DPTR, A

……

忘了棚缺问了物弯,你的8255的地址,是不是FF2BH?

.MODEL TINY

COM_ADD EQU 0F003H

PA_ADD EQU 0F000H

PB_ADD EQU 0F001H

PC_ADD EQU 0F002H

.STACK 100

.DATA

LED_Data DB 01111101B

DB 11111101B

DB 10111101B

DB 11010111B

DB 11011111B

DB 11011011B

.CODE

START: MOV AX,@DATA

MOV DS,AX

NOP

MOV DX,COM_ADD

MOV AL,80H

OUT DX,AL

MOV DX,PA_ADD

MOV AL,0FFH

OUT DX,AL

LEA BX,LED_Data

START1: MOV AL,0

XLAT

OUT DX,AL

CALL DL5S

MOV CX,6

START2: MOV AL,1

XLAT

OUT DX,AL

CALL DL500ms

MOV AL,0

XLAT

OUT DX,AL

CALL DL500ms

LOOP START2

MOV AL,2

XLAT

OUT DX,AL

CALL DL3S

MOV AL,3

XLAT

OUT DX,AL

CALL DL5S

MOV CX,6

START3: MOV AL,4

XLAT

OUT DX,AL

CALL DL500ms

MOV AL,3

XLAT

OUT DX,AL

CALL DL500ms

LOOP START3

MOV AL,5

XLAT

OUT DX,AL

CALL DL3S

JMP START1

DL500ms PROC NEAR

PUSH CX

MOV CX,60000

DL500ms1: LOOP DL500ms1

POP CX

RET

DL500ms ENDP

DL3S PROC NEAR

PUSH CX

MOV CX,6

DL3S1: CALL DL500ms

LOOP DL3S1

POP CX

RET

ENDP

DL5S PROC NEAR

PUSH CX

MOV CX,10

DL5S1: CALL DL500ms

LOOP DL5S1

POP CX

RET

ENDP

END START

这个败汪就是流水灯的程序,不过是在开发箱上历衡做察烂仔的。

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 AXB口状态进栈暂存或野

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 AXB口状态出栈

RET返回主程序

PRC1 ENDP 子程序定义完毕或斗

PRC2 PROC NEAR "暂停" *** 作 子程序定义

PUSH AXB口状态进栈暂存

TEST AL,00000010B 检测PB1输入状态

JZ RT2若PB1低电平,表示K2断,不暂停

PAUS:OUT 60H,AL 若PB1高电平,表示K2通,PA1输出高电平,暂停

RT2: POP AXB口状态出栈

RET返回主程序

PRC2 ENDP 子程序定义完毕

PRC3 PROC NEAR "换向" *** 作 子程序定义

PUSH AXB口状态进栈暂存

TEST AL,00000100B 检测PB2输入状态

JZ RT3若PB2低电平,表示K3断,不换向

CHG: MOV AL,00000101B 若PB2高电平,表示K3通

OUT 60H,AL PA2、PA0输出高电平、换向,灯保持亮

RT3: POP AXB口状态出栈

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 子程序定义完毕

CSEGENDS代码段定义完毕

END START 主程序结束


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12468779.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存