仿真环境: proteus
编译环境:Masm
8255A有A、B、C三个8位输入/输出端口
A口:PA7~PA0
B口:PB7~PB0
C口:PC7~PC0
接口编程第一步:确定A、B、C三个口的地址以及控制口地址.
设置工作方式控制字来实现对方式0、方式1、方式2的选择:
第一位固定为1
A组:PS0~PA7; PC4~PC7
B组:PB0~PB7; PC0~PC3
接下来就是看图,一般开关控制为输入 置1,下图中由PB0~PB7控制开关 D1 = 1,其他默认为0,即控制字为:10000010B
8255初始化:
MOV AL,控制字
OUT 口地址,AL
//方法二
MOV DX,口地址
MOV AL,控制字1
OUT DX,AL
MOV AL,控制字2
OUT DX,AL
读写控制信号:
IN AL,口地址
OUT 口地址,AL
确定A、B、C口以及控制口地址
片外地址:
A15 | A14 | A13 | A12 | A11 | A10 | A9 | A8 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
片内地址:
A15 | A14 | A13 | A12 | A11 | A10 | A9 | A8 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | × | × |
端口A地址:
A15 | A14 | A13 | A12 | A11 | A10 | A9 | A8 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
端口B地址:
A15 | A14 | A13 | A12 | A11 | A10 | A9 | A8 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
端口C地址:
A15 | A14 | A13 | A12 | A11 | A10 | A9 | A8 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
控制口地址:
A15 | A14 | A13 | A12 | A11 | A10 | A9 | A8 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
编程实例1:
当开关合上,16个LED灯从上而下依次循环发光,每次只能点亮一个LED灯;
当开关打开,保持当前LED灯的点亮状态不变,下次开关合上时,从当前的LED灯开始点亮。
IOCON EQU 02D6H ;控制口地址
IOA EQU 02D0H ;A口地址
IOB EQU 02D2H ;B口地址
IOC EQU 02D4H ;C口地址
CODE SEGMENT
ASSUME CS:CODE
START: MOV AL, 10000001B ;8255初始化,端口C为输入即 控制字 最后一位为1
MOV DX, IOCON ;初始化控制口
OUT DX, AL
MOV BX, 1
AGAIN: MOV DX, IOC ;置C口
IN AL, DX ;读取PC口检测开关状态
TEST AL, 00000010B ;检测PC1是否等于0
JNZ AGAIN ;PC1=0
MOV AL,BL
MOV DX,IOA ;A口输出数据
OUT DX,AL
MOV AL,BH
MOV DX, IOB ;B口输出数据
OUT DX, AL
CALL DELAY ;延时
ROL BX,1
JMP AGAIN
DELAY PROC ;延时函数开始标志
MOV CX,0FFFFH
NEXT: NOP
LOOP NEXT
RET ;返回DOS
DELAY ENDP ;延时函数结束标志
CODE ENDS
END START