一、 实验内容
将INT0—INT7 分别连接到2 个可变电阻器上,每秒采集一次0809 转换的数字量,
要求:
1、将转换后的数字量和路号同时送往8 段显示器和CRT 上显示,采集10 个循环
后结束。
2、将采集到的数据送往内存TABLE 开始的240 个单元中存放。
;8255输入输出缓存.A-B-C-KZ--280H~283H;8255CS-280H`287H;PC7-0809-EOC;PC0--8253out1;PA--7 段数码管; PB4--数码管的 S0; PB5--数码管的 S1;PA7-PA0--DPGA
;0809数字信号改模拟信号.0809CS-290H~297H;ADDC-ADDB-ADDA选择INT000~INT111;INT0`INT7接直流电流那边的可变电阻;启动时EOC变低电平;
;8253时间计数.28BH~28EH;8253CS--288H-28FH;GATE0-GATE1-VCC;OUT0-CLK1;CLK0-1MHZ
;可变电阻.INT0INT7
;CRT电脑屏幕.
;LIGHT_LED八段数码管.;
DATA SEGMENT
TABLE_LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,58H,5CH,79H,71H;八段数码管对应的编码0~F
DB 80H
TABLE_CRT DB 30H,31H,32H,33H,34H,35H,36H,37H;01234567--ARCII码
DB 38H,39H,41H,42H,43H,44H,45H,46H;89ABCDEF--ARCII码
TABLE_KONG DW 0,290H,291H,292H,293H,294H,295H,296H,297H;--端口
NUM1 DB 10H
NUM2 DW 1010H
TABLE_CUN DB 240 DUP(0)
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 40H DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS: CODE, DS:DATA, SS:STACK1
START:
MOV AX, DATA;实模式下固定两条
MOV DS, AX
CALL Init_8253; 地址: 288-28BH,初始化 8253,使之产生 1s 方波
CALL Init_8255; 地址: 280-283H,初始化 8255, A 口输出, B 输出, C 口高位输入, C 低入
CALL WAIT_INSPACE;等待一个空格
MOV CX, 11
MOV SI, 0;地址偏移
INIT:
MOV DI, 0
READ_INPUT:
CALL LIGHT_LED ;8 段数码管显示
MOV DX,282H ;读 C 口PC0输入;
IN AL,DX
AND AL,01H ;PC0=0?
JZ READ_INPUT ; PC0=0低电平循环,否则出循环;
INC DI
CMP DI,9
JZ NEXT_INPUT ;判断DI==9?跳出大循环:下一条
PUSH DI;保存DI
SHL DI, 1;DI左移一位=DI*2
MOV DX, TABLE_KONG[DI]
POP DI;恢复保存的DI
OUT DX, AL
CALL DELAY
;下面7行处理获得输入的低8位,AX有0000H AL有00H;比如AL=BFH那么变成AH=0BH;AL=0FH;
IN AL, DX
MOV AH, AL ;高位 AH 低位 AL 中
PUSH CX;保存CX
MOV CL,4
SHR AH,CL ;AH中右移四位,AH变成”零ד模式
POP CX;恢复保存的CX
AND AL,0FH ;低位 AL 中,AL变成“零×”模式
MOV NUM2, AX;获取的给NUM2
MOV AX, DI
MOV NUM1, AL;NUM1将在屏幕显示
CALL CRT ; CRT 电脑屏幕显示
CALL SAVE2BUF;放在TABLE_CUN中
WAIT_TIMEOUT:
MOV DX,282H ;读 C 口PC0输入;
IN AL,DX
AND AL, 01H
JNZ WAIT_TIMEOUT ;PC0=1消耗结束高电平 ,前后一个周期
JMP READ_INPUT;跳这个大循环
NEXT_INPUT:
DEC CX
CMP CX,0
JZ FINAL ;CX=0?整个程序结束
JMP INIT;,否则重新程序开始再进行大循环
FINAL:
MOV AH,4CH
INT 21H
;=========函数具体实现==========================
DELAY PROC NEAR
PUSH DX
AGAIN:
MOV DX,282H;读 C 口
IN AL,DX
AND AL,80H ;PC7=0?
JZ AGAIN ;PC7=0
POP DX
RET
DELAY ENDP
LIGHT_LED PROC NEAR
MOV AL,0H ;熄灭
MOV DX,281H
OUT DX,AL
MOV AX, NUM2
LEA BX,TABLE_LED;取地址,低位
XLAT TABLE_LED;AL=TABLE_LED[第AL个字节]等同于AL=[[BX]+AL]
MOV DX,280H
OUT DX,AL
MOV AL,10H;PB4=1,点亮
MOV DX,281H;
OUT DX,AL
MOV AL,0H ;熄灭
MOV DX,281H
OUT DX,AL
MOV AX,NUM2
MOV AL,AH
XLAT TABLE_LED;取高位
MOV DX,280H
OUT DX,AL
MOV AL,20H;送 PB5=1,点亮
MOV DX,281H
OUT DX,AL
MOV AL,0H ;熄灭
MOV DX,281H
OUT DX,AL
;==================
; MOV AL,NUM1
; LEA BX,TABLE_LED;取 DI
; XLAT TABLE_LED
; MOV DX,280H
; OUT DX,AL
; MOV AL,10H;
; MOV DX,281H;送 8 段显示
; OUT DX,AL
; MOV AL,0H ;熄灭
; MOV DX,281H
; OUT DX,AL
RET
LIGHT_LED ENDP
CRT PROC NEAR
MOV AL,NUM1
LEA BX,TABLE_CRT;取这个数组头地址
XLAT TABLE_CRT;取低位
MOV DL,AL;待显示AL中的数字
MOV AH,02H;屏幕显示字符功能
INT 21H
MOV DL,' ';待显示空格
MOV AH,02H;屏幕显示字符功能
INT 21H
MOV AX,NUM2
MOV AL,AH
LEA BX,TABLE_CRT;取高位
XLAT TABLE_CRT;取低位
MOV DL,AL
MOV AH,02H;屏幕显示字符功能
INT 21H
MOV AX,NUM2
XLAT TABLE_CRT;取低位
MOV DL,AL
MOV AH,02H;屏幕显示字符功能
INT 21H
MOV DL,' '
MOV AH,02H;屏幕显示字符功能
INT 21H
MOV DL,' '
MOV AH,02H;屏幕显示字符功能
INT 21H
RET
CRT ENDP
SAVE2BUF PROC NEAR
MOV AL,NUM1
MOV TABLE_CUN[SI],AL
INC SI
MOV AX,NUM2
MOV TABLE_CUN[SI],AH
INC SI
MOV TABLE_CUN[SI],AL
INC SI
RET
SAVE2BUF ENDP
Init_8253 PROC;
MOV DX,28BH ;8253 控制字
MOV AL,00100101B
OUT DX,AL
MOV DX,288H
MOV AL,10H
OUT DX,AL
MOV DX,28BH
MOV AL,01100111B
OUT DX,AL
MOV DX,289H
MOV AL,10H
OUT DX,AL
RET
Init_8253 ENDP
Init_8255 PROC
MOV AL,10001001B;控制字 A 出, B 出, C 高入, C 低入
MOV DX,283H
OUT DX,AL
RET
Init_8255 ENDP
WAIT_INSPACE PROC
NEXT:
MOV AH,01H;输入
INT 21H
CMP AL,20H
JNZ NEXT;输入不是空格?循环:跳出循环;
RET
WAIT_INSPACE ENDP
CODE ENDS
END START