• 现代计算机接口实验 (五)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

  • 相关阅读:
    eclipse常用快捷键
    angularJS学习(三)——搭建学习环境
    node.js的安装
    AngularJS学习(二)——Angular应用的解析
    MTK如何烧录IMEI码(俗称串号)
    飞思卡尔IMX515评估板系统烧录和启动
    __asm__ __volatile__("": : :"memory")
    MTK6577+Android4.0之增加重启功能
    WinCE系统声音定制
    介绍一种很棒的wince 如何替换系统声音的方法
  • 原文地址:https://www.cnblogs.com/xujiayu/p/5041685.html
Copyright © 2020-2023  润新知