现代计算机接口实验 (五)0809实验

一、 实验内容

将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

原文地址:https://www.cnblogs.com/xujiayu/p/5041685.html