以十进制数形式从键盘输入脉冲高度、脉冲宽度和颜色参数后,以屏幕中间行为脉冲中间行,从左到右、满屏画出相应的脉冲波图形。
DATAS SEGMENT
;此处输入数据段代码
Prompt_Str1 db 'Please input hight: $' ;提示输入脉冲高度
Prompt_Str2 db 'Please input width: $' ;提示输入脉冲宽度
Prompt_Str3 db 'Please input line colour: $' ;提示输入波线颜色
Hight_Pulse dw ? ;脉冲高度
Width_Pulse dw ? ;脉冲宽度
Colou_Pulse db ? ;波线颜色
result dw ?
XU DW ? ;画线的参考坐标
YU DW ?
XU1 DW ?
YU1 DW ?
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
Shu PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
;竖线
mov cx,XU1 ;X坐标
mov bx,YU1 ;终止y坐标
mov dx,YU ;Y坐标
;int 10h
pshu:
mov al,Colou_Pulse ;淡红色
mov ah,0ch ;写入点像
inc dx
cmp dx,bx
int 10h
jne pshu
POP DX
POP CX
POP BX
POP AX
ret
Shu EndP
Hen PROC NEAR
PUSH BX
PUSH CX
PUSH DX
;横线
mov cx,XU ; x坐标
mov bx,XU1 ; 终点x坐标
mov dx,AX ; y坐标
;int 10h
pheng:
mov al,Colou_Pulse ; 淡红色
mov ah,0ch ;写入点像
inc cx
cmp cx,bx
int 10h
jne pheng
POP DX
POP CX
POP BX
ret
Hen EndP
; 回车换行
Enter_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Enter_CTLF endp
; 输入十进制数化为2进制存在result中
Input_Digit PROC NEAR
push BX
push AX
PUSH CX
MOV BX,0
REP1: MOV AH,1
INT 21H
SUB AL,30H
JL EXIT
CMP AL,9
JG EXIT
CBW
XCHG AX,BX
MOV CX,10
MUL CX
ADD BX,AX
JMP REP1
EXIT:
MOV result,BX
POP CX
POP AX
POP BX
RET
Input_Digit ENDP
START:
MOV AX,DATAS
MOV DS,AX
rep1:
Output Prompt_Str1 ;提示输入脉冲高度
call Input_Digit ;键盘输入一个3位的十进制数字,将其转换成二进制数并保存在指定的内存单元
MOV AX,result
CMP AX,200
JA rep1
MOV Hight_Pulse,AX
call Enter_CTLF ;输出一个回车、换行
Output Prompt_Str2 ;提示输入脉冲宽度
call Input_Digit
MOV AX,result
MOV Width_Pulse,AX
call Enter_CTLF ;输出一个回车、换行
Output Prompt_Str3 ;提示输入波线颜色
call Input_Digit
MOV AL,byte Ptr result
MOV Colou_Pulse,AL
;先设置屏幕显示模式(640*480*16),再采用描点画图,通过INT10中断来描点画
MOV AH,0
MOV AL,13H
INT 10H
MOV XU,0 ; 画中心线
MOV XU1,320
MOV AX,100
CALL Hen
;xu,xu1,yu,yu1相当于当前画的位置
;下面是初始位置
;XU = 0
;XU1 = Width_Pulse
;YU = 100-Width_Pulse/2
;YU1 = YU+Width_Pulse
MOV XU,0
MOV AX,Width_Pulse
MOV XU1,AX
MOV AX,Hight_Pulse
MOV BX,2
DIV BX
MOV CX,100
SUB CX,AX
MOV YU,CX
MOV AX,YU
ADD AX,Hight_Pulse
MOV YU1,AX
mov cx,YU1 ; 用于横线位置的上下交替
mov dx,YU
again:
MOV AX,CX
call Hen
CALL Shu
MOV AX,XU1 ; 画横线的起点横坐标等于终点横坐标
MOV XU,AX
ADD AX,Width_Pulse ; 横线的终点横坐标加上宽度
MOV XU1,AX
XCHG cx,dx ; 用于横线位置的上下交替
CMP XU1,320 ; 判断终点横坐标是否大于边界
JBE again ; 没有超界则继续画图
MOV XU1,320 ; 超界则将终点坐标设为边界横坐标
MOV AX,CX
CALL Hen
;MOV AH,4CH
;INT 21H
CODES ENDS
END START