8255地址信息为0378H---037BH,
A B C这三个端口均工作方式0,
A口作为输入口,输入转换后的结果;
B口输出,用来输出通道地址,发出第之所存信号和启动转换信号;
C口低4位为输入口,用来读取转换状态,高4位没有使用。
INIT_8255 PROC NEAR
MOV DX, 037BH ;控制口地址
MOV AL, 91H ;控制字:A B C口均工作方式0,A输入,B输出,C低4位输入
OUT DX, AL ;写入8255
RET
INIT_8255 ENDP
数据采集:
START:
MOV AX, SEG DATA
MOV DS, AX ;设置数据段地址
MOV SI, OFFSET DATA ;设置数据存储首地址
CALL INIT_8255 ;初始化8255
MOV BL, 0 ;AD转换通道号
MOV CX, 8 ;预计循环八次
AGAIN:
MOV AL, BL ;通道号
MOV DX, 0379H ;B口地址
OUT DX, AL ;输出通道号
OR AL, 10H ;D4置一
OUT DX, AL ;输出
AND AL, 0EFH ;D4清零
OUT DX, AL ;输出
;上面四行,发出地址锁存信号和启动转换信号
NOP ;稍等
MOV DX, 037AH ;C口地址
WAIT1:
IN AL, BL ;--有错!改正如下
IN AL, DX ;从C口输入,这是状态
AND AL, 02H ;取出D3
JZ WAIT1 ;为零就是没有转换完,转移,继续读状态
MOV DX, 0379H ;为一,就???
MOV AL, BL ;这三行,看不懂
OR AL, 20H
OUT DX, AL
MOV DX, 0378H ;A口地址
IN AL, DX ;读入转换出来的数据
MOV [SI], AL ;存放
INC SI ;存放的地址加一
INC BL ;通道号码加一
LOOP AGAIN ;循环八次
MOV DX, 0379H ;B口地址
MOV AL, 0
OUT DX, AL ;向B口输出0,大概是关闭转换器
HLT ;停机