DATA SEGMENT X0 EQU 155 Y0 EQU 155 ;坐标系原点坐标(X0,Y0) MESS DB PRESS ANY KEY TO RETURN TO DOS ;0DH,0AH;提示信息 TMCTL EQU 2B3H ;8254控制口地址 TMRO EQU 2B0H ;82540通道0地址 INPR EQU 290H ;DAC0832输入寄存器地址 DACR EQU 291H ;DAC8032DAC寄存器地址 DAIN DB ? ;DAC8032的D/A数据 INT3S DW ? ;IRQ的中断向量段地址保存单元 INT3O DW ? ;IRQ的中断向量偏移地址保存单元 IMR DB ? ; ADDR EQU 2A0H ;ADC0809的片段选址 ADDA EQU ? ;ADC0809的采集数据 COUNT DB 0 BUF DB 240 DUP(?) DATA ENDS WRICH MACRO CHAR,WH,COLOR;写出符定调用 MOV AH,02H ;置光标位置功能调用 MOV DX,WH ;光标位置为WH MOV BH 00H INT 10H 09 ;写字符功能调用 MOV AL CHAR ;显示字符送AL MOV BL COLOR ;置字符颜色 MOV CX, 1 ;字符长度为1 INT 10H WRICH END START: MOV AX,DATA MOV DS,AX CLI ;关中断 MOV DX,TMCTL MOV AL,00110110B OUT DX,AL MOV DX,TMRO MOV AL,00H OUT DX,AL MOV AL,0BH MOV A,35H INT 21H ;取IRQ3的中断向量并保存在INT3O MOV INT3S,ES ;和INT3S单元 MOV INT3O,BX PUSH DS MOV DX,OFFSET ADINT MOV BX,SEG ANINT MOV DS,BX MOV AL,OBH MOV AH,25H INT 21H ;设置新的IRQ3中断向量 POP DS IN AL,21H MOV IMR,AL ;保存中断屏蔽字 AND AL,11110111B OUT 21H,AL ;开放IRQ3中断 MOV SI,OFFSET BUFF CALL INIT ;屏幕图形初始化 MOV DAIN,80H ;锯齿波初植80H送DIAN BEGIAN: MOV AL,DAIN MOV DX,INPR OUT DX,AL ;锯齿波值送DAC0832输入寄存器 MOV DX,DACR OUT DX,AL ;锯齿波值送DAC0832DAC寄存器 INC DAIN JNZ QQQ MOV DAIN,80H QQQ: STI ;开中断 MOV DX,ADDR OUT DX,AL ;启动一次A/D转换 HLT 等待中断 CLI INC COUNT ; 采集数据个数+1 MOV AL,ADDA ;取A/D采集数据 MOV BX,COUNT MOV BYTEPTR[SI+BX],AL ;将A/D采集数据送数据缓冲区 CMP COUNNP,240 JB DRAW MOV BX,1 ;从采集数据缓冲区的第一个数据开始处理 BUFDR: MOV AL,OO ;点的颜色为黑色 CALL DPT ;从显示器抹掉第一个点 MOV AL,BYTEPTR[SI+BX+1] MOV BYTEPTR[SI+BX],AL ;将采集数据缓冲区的数据 MOV ALL,OFFH ;将前移前移一个位置,并置点的 CALL DPT ;颜色为白色,调用画点子程序 INC BX CMP BX,240 JNE BUFDR MOV COUNT,239 JMP NEXT DRAW: MOV AL,0FH ;显示缓冲区未满时, MOV BX,COUNT ;直接显示采集的数据 CALL DPT NEXT MOV AH,06H MOV DL,0FFH ;判断是否有键按下 INT 21H JZ BEGAIN ;没有按键,则继续 OVER: PUSH DS MOV DX,INTSO MOV BX,INT3S MOV DX,BX MOV AL,0BH MOV AH,25H INT 21H ;恢复原IRQ3中断向量 POP DS MOV AL,IMR OUT 21H,AL ;恢复原中断屏蔽字 STI MOV AH,4CH INT 21H ;返回DOS 2) 中断服务子程序 ADINT PROC NEAR ;A/D中断服务程序 PUCH AX PUCH DX PUCH DS MOV AX,DATA MOV DS,AX ;送数据段地址;确保中断服务程序 MOV DS,ADDR ;对数据段中的变量正确寻址 INT AL,DX ;读入A/D数据并送ADDA单元 MOV ADDA,AL MOV AL,20H OUT 20H,AL ;送EOI命令 POP DS POP DX POP AX IRTE ;中断返回 ADINT ENDP DPT PROC NEAR ;画点子程序 PUSH AX PUSH BX PUSH CX PUSH DX MOV CX,X0 ;点的列位置(CX)为BX+X0 ADD CX,BX MOV DU,00 MOV DL,BYTEPTR[DI+BX];取缓冲区的数据 SHR DX,1 ;DX/2 MOV BX,DX ;DX值送BX MOV DX,Y0-1 ;点的位置为YO-1-BX SUB DX,BX ;减1是为了减免将点画到坐标上 MOV AH,0CH ;画点 INT 10H POP DX POP CX POP BX POP AX RET DPT ENDP INIT PROC NEAR ;初始化屏幕子程序 MOV AH00 ;设置显示器工作方式为EGA/VGA MOV AL,0EH ;显示模式为640*200*16 INT 10H WRICH '^',0112H,0FH ;显示坐标系的两个箭头 WRICH '>',124CH,0FH MOV AH,0CH ;写素描功能调用 MOV AL,0FH ;颜色为白色 MOV CX,X0 MOV DX,Y0 DRAX INT 10H ;画坐标系的X轴 INT CX CMP CX,614 JIZ DRAX MOV DX,Y0 MOV CO,X0 DRAY INT 10H 画坐标系Y轴 MOV DX MOV DX,8 JIZ DRAY MOV AH,0CH 以下为显示坐标系X,Y轴的刻度 MOV AL,OFH MOV CX,X0-4 ;给定Y轴刻度初植,画第一个 MOV DX,25 ;刻度,长度为4点 YBJ: INT 10H INC CX CMP CX,X0 JNZ YBJ MOV CX,X0-4 ;在Y轴画间隔为26 ADD DX,26 ;长度为4点的5条刻度线 CMP DX,Y0 JB YJB MOV CX,X0+80 ;给定X轴刻度初植,画第一个 MOV DX,Y0+2 ;在X轴上画间隔为80 ADD CX,80 ;长度为2点的7条刻度 CMP CX,600 JB XJB WRICH 'V',0112H,0FH ;显示坐标系的Y轴标识V, ;行列位置为(01H,12H), ;白色 WRICH'0',1412H,0FH ;显示原点标识 WAICH'T',144CH,0FH ;显示X轴标识T WAICH'1',14Ldh,0FH ;示X轴的刻度 WAICH'2',1427H,0FH WAICH'3',1431H,0FH WAICH'4',143BH,0FH WAICH'5',1445H,0FH; WAICH'2',0D12H,0FH ;示Y轴的刻度值 WAICH'5',0312H,0FH PUSH DS POP ES MOV AX,1200H ;显示字符功能调用 LEA BP,MESS ;ES:BP指向提示信息 MOV CX,35 ;提示信息长度 MOV BL,0FH ;黑底,白字 MOV DX,1600H ;从16H行00列开始 INT 10H ;显示功能调用 RET INT ENDP CODE ENDS END START |