下面的情况我要如何测试呢
在测试仪器连接完毕,各个位置配置好以后,在Delphi语言中如何测试
芯片8251呢?
我只知道伪代码,但是在利用CLICK事件做的时候我不知道怎么将汇编融入到程序中而不出现错误。
希望高手指点
伪代码如下:      DATA51  EQU       208H        ;8251A DATA PORT
      CTRL51  EQU       209H        ;8251A COMMOND PORT
      TIMER2  EQU       202H        ;8253 COUNT2
      TIMCTL  EQU       203H        ;8253 CTRL PORT
       CLK00  EQU       250         ;8251A CLK 250KHZ
       BPS00  EQU       1200        ;BPS=1200
      FACTOR  EQU       16          ;8251A BPS FACTOR=16
        DATA  SEGMENT
        MES1  DB        'NOW YOU CAN PLAY A KEY ON THE CPU_KEYBORD',0AH,0DH
          DB        'IT WILL DISPLAY ON THE TERMINAL_SCREEN!!' ,0AH,0DH
          DB        'END WITH !',0AH,0DH,0AH,0DH,'$'
        MES2  DB        0AH,0DH,0AH,0DH,'NOW YOUR CAN PLAY KEY ON THE TERMINAL',0AH,0DH
          DB        'IT WILL DISPLAY ON THE CPU_SCREEN!   ',0AH,0DH
          DB        'END WITH !',0AH,0DH,0AH,0DH,'$'
        DATA  ENDS
        CODE  SEGMENT
          ASSUME    CS :CODE ,DS:DATA
      INIT51  PROC      NEAR        ;INIT 8251A
          MOV       DX,CTRL51
          XOR       AX,AX
          MOV       CX,03
         LL:  CALL      CHAROUT
          LOOP      LL
          MOV       AL,40H      ;RESET 8251A
          CALL      CHAROUT
          MOV       AL,4EH      ;DATA 8 BIT,STOP 1 BIT,FACTOR=16
          CALL      CHAROUT
          MOV       AL,27H      ;ENABLE INPUT AND OUTPUT
          CALL      CHAROUT
          RET
    CHAROUT:          ;OUTPUT A BYTE
          OUT       DX,AL
          PUSH      CX
          MOV       CX,02
         GG:  LOOP      GG
          POP       CX
          RET
      INIT51  ENDP
     SET_BPS  PROC      NEAR        ;T/R CLOCK FROM TIMER2
          MOV       DX,0
          MOV       AX,CLK00
          MOV       BX,1000     ;COUNT2=CLK00*1000/FACTOR/BPS00
          MUL       BX
          MOV       BX,BPS00
          DIV       BX
          MOV       DX,00
          MOV       BX,FACTOR
          DIV       BX
          MOV       BX,AX
          MOV       DX,TIMCTL   ;TIMER2 IN MODE3
          MOV       AL,0B6H
          OUT       DX,AL
          MOV       DX,TIMER2
          MOV       AX,BX
          OUT       DX,AL
          MOV       AL,AH
          OUT       DX,AL
          RET
     SET_BPS  ENDP        MAIN  PROC      FAR
      START:
          CALL      SET_BPS
          CALL      INIT51
          MOV       AX,DATA     ;DISPLAY MES1
          MOV       DS,AX
          LEA       DX,MES1
          MOV       AH,09
          INT       21H
         M0:
          MOV       AH,01       ;INPUT A CHAR FROM CPU_KEYBORD
          INT       21H
          MOV       BL,AL
          MOV       DX,CTRL51
         M1:  IN        AL,DX       ;IF TXRAY=1 IN 8251A?
          TEST      AL,01
          JZ        M1
          MOV       DX,DATA51
          MOV       AL,BL
          INC       AL
          OUT       DX,AL       ;CPU OUTPUT THE CHAR TO 8251A
          MOV       CX,0FH
        S51:  LOOP      S51
       NEXT:
          MOV       DX,CTRL51   ;IF RXRAY=1 IN 8251A?
          IN        AL ,DX
          TEST      AL,02
          JZ        NEXT
          MOV       DX,DATA51   ;CPU GET A CHAR FROM 8251A
          IN        AL,DX
          MOV       DL,AL       ;CPU PUT THE CHAR ON THE SCREEN
          MOV       AH,02
          INT       21H
          DEC       DL
          CMP       DL,'!'      ;CHAR='!' ,END THE PROGRAM
          JNZ       M0
       OVER:
          MOV       AX,4C00H
          INT       21H
        MAIN  ENDP
        CODE  ENDS
          END       START
   

解决方案 »

  1.   

    我只知道可以在Delphi中嵌入匯編代碼
      

  2.   

    asm
    ..
    ..
    end;
    是可以加入的 ,不过伪指令有点问题,编译的时候好多的问题,
    应该是不要加入吧, 可是我不知道怎么修改
      

  3.   

    此外我测试时,使用的是清华大学提供的TPC1-A型号的测试箱
    通过COM1口进行通信
      

  4.   

    到底是总线通讯还是串口通讯?如果是98以上的MS的OS..是不可以用汇编操作port的...
    可以采用WinIO.dll.
    我玩过8255A的总线通讯..8251也是接口芯片么..
      

  5.   

    用串口怎么测试8251呀?
    我估计8251和8255差不多吧,要用并行口地!根据8251的DataSheet连接到并行总线或者ISA总线来测试。
      

  6.   

    我使用的是清华大学的TPC实验箱,里面集成有8251的芯片,现在通过COM口与计算机连接.
    然后利用高级语言对它进行测试。
    问题是我在利用Delphi的时候这段汇编语言的代码运行老是有问题。
    比如说我要怎样才可以把下面的一段最简单的代码嵌入到Delphi中去呢
     STACKS  SEGMENT   STACK       ;堆栈段
                  DW        128 DUP(?)
          STACKS  ENDS
           DATAS  SEGMENT               ;数据段
          STRING  DB        'hello,world!',13,10,'$'
           DATAS  ENDS
           CODES  SEGMENT               ;代码段
                  ASSUME    CS:CODES,DS:DATAS
          START:  MOV       AX,DATAS    ;初始化
                  MOV       DS,AX
                  MOV       DX,OFFSET STRING        ;显示输出字符串
                  MOV       AH,9
                  INT       21H
                  MOV       AX,4C00H
                  INT       21H         ;自动
           CODES  ENDS
                  END       START
      

  7.   

    如果你的汇编代码没有问题..先用MASM运行一下试试.....如果是串口通讯..也没有必要用汇编...
      

  8.   

    代码是没有问题的,那我要如何在Delphi中实现对8251的测试呢
    如果不使用汇编的话 要怎样处理?望指教
      

  9.   

    delphi中用汇编直接操作串口只有在98下才可以,2000,XP什么的都已经不灵了
    你的问题并不是什么8251测试啊
    你只是delphi的串口编程问题
    根据外部设备的通讯协议,写写串口编程就可以了
    这部分文章网上还是比较多的
      

  10.   

    谢谢各位的帮助了,今天我老师告诉我一个办法,我几乎当场晕倒,她告诉我把可执行的汇编EXE文件调用就算了,亏我一片苦心。
    不过还是谢谢大家
      

  11.   

    汇编代码:
    ByteVar DB ?
    wordVar DW ?
    IntVar DD ?
    ........
         MOV AL,ByteVar
         MOV BX,WordVar
         MOV ECX,IntVar
    转DELPHI代码:
    Var
      ByteVar:Byte;
      WordVar:Word;
      IntVar:Integer;
    ......
    asm
      MOV AL,ByteVar
      MOV BX,WordVar
      MOV ECX,IntVar
    end;
    请参考?
      

  12.   

    这个例子比我以前看到的好,不过汇编代码段的数据定义在Delphi中好象还是不可以实现,比如说。我现在定义一个 STRING db 'hello friend',13,10,'$'
    在 Delphi中要如何实现呢,我就一直被这样一个问题困扰,还有就是段地址的定义与实现是一个很大的困难。eg:DATAS  SEGMENT               ;数据段
          STRING  DB        'hello,world!',13,10,'$'
           DATAS  ENDS
    如果说我在下面的程序中有使用到段地址的首地址的时候就无法在Delphi中解决了。
    mov ax DATAS 
    mov ds ax
    这个时候就有提示段地址没有定义
      

  13.   

    如果我没记错..可以调用用var声明的变量..asm里..