下面的情况我要如何测试呢
在测试仪器连接完毕,各个位置配置好以后,在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
在测试仪器连接完毕,各个位置配置好以后,在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
解决方案 »
- 请教Devexpress VCL中打印预览的问题
- 读DAT文件的错误 EinoutError
- spcomm接收数据函数
- 控件开发问题,求教!
- 急!!!在线等待---请问win2k下怎么实现对串口(端口)的读写?
- 在DELPHI中如何解决绑定数据的空格去除??????
- 怎样让MDIChild的窗体打开时,出现闪动,即刚开始出现时较小,紧跟着最大化。
- 如何在本地模拟网络应用程序的运行!
- DELPHI 中的饼图控件为何各部份的百分比之和不等于100%呢?
- 不能执行外部命令?以前有不少分的,怎么突然变没有了。
- 我的程序在运行的过程中出现一个错误提示.....
- 怎么制作用Delphi6做的数据库系统的安装盘啊,数据库是SQL Server2000
..
..
end;
是可以加入的 ,不过伪指令有点问题,编译的时候好多的问题,
应该是不要加入吧, 可是我不知道怎么修改
通过COM1口进行通信
可以采用WinIO.dll.
我玩过8255A的总线通讯..8251也是接口芯片么..
我估计8251和8255差不多吧,要用并行口地!根据8251的DataSheet连接到并行总线或者ISA总线来测试。
然后利用高级语言对它进行测试。
问题是我在利用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
如果不使用汇编的话 要怎样处理?望指教
你的问题并不是什么8251测试啊
你只是delphi的串口编程问题
根据外部设备的通讯协议,写写串口编程就可以了
这部分文章网上还是比较多的
不过还是谢谢大家
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;
请参考?
在 Delphi中要如何实现呢,我就一直被这样一个问题困扰,还有就是段地址的定义与实现是一个很大的困难。eg:DATAS SEGMENT ;数据段
STRING DB 'hello,world!',13,10,'$'
DATAS ENDS
如果说我在下面的程序中有使用到段地址的首地址的时候就无法在Delphi中解决了。
mov ax DATAS
mov ds ax
这个时候就有提示段地址没有定义