組合語言編寫:畫脈衝波圖形(詳細要求見內)
- 2022-08-29
畫脈衝波圖形
要求:使用者以十進位制數形式從鍵盤輸入脈衝高度、脈衝寬度和顏色引數(格式同上)後,以螢幕中間行為脈衝中間行,從左到右、滿屏畫出相應的脈衝波圖形。
給出
1。源程式清單(必須包括!)
2。程式總體設計方案 、思路
3。程式設計框圖
如果能在3天內完成,達到要求,令人滿意,會有更多分數奉上,決不食言!
注意,使用匯編語言設計 ,8086系列
看來百度真是無人能回答此題
至於樓下還有人 說給兩百才幫忙做,那你不要來百度。
; 本程式透過編譯,執行正確
; 操作說明:執行開始,首先要輸入4個引數:脈衝高度、脈衝寬度、脈衝間斷寬度和波線顏色。
; 各項取值範圍:
; 脈衝高度:0~239
; 脈衝寬度:0~320
; 脈衝間斷寬度:0~320
; 波線顏色:1~15(參見下方的顏色引數表)
; 數值位數滿3位的,自動結束當前項輸入,不必回車;不足3位數的,須按回車結束當前項輸入
Code Segment
Assume CS:Code,DS:Code
CR EQU 000DH
LF EQU 000AH
KBBack EQU 0008H
; -----------------------------------------
; Dark Colors (Foreground & Background)
; Constant Value
Black EQU 0
Blue EQU 1
Green EQU 2
Cyan EQU 3
Red EQU 4
Magenta EQU 5
Brown EQU 6
LightGray EQU 7
; Light Colors(Foreground)
; Constant Value
DarkGray EQU 8
LightBlue EQU 9
LightGreen EQU 10
LightCyan EQU 11
LightRed EQU 12
LightMagenta EQU 13
Yellow EQU 14
White EQU 15
Blinking EQU 80H
; -----------------------------------------
; 功能:顯示指定地址(Str_Addr)的字串
; 入口:
; Str_Addr=字串地址(要求在資料段)
; 用法: Output Str_Addr
; 用法舉例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:輸出回車換行
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
; -----------------------------------------
; 功能:取游標位置
; 入口:無
; 出口:DH=行號,DL=列號
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -----------------------------------------
; 功能:置游標位置
; 入口:Cursor_Row=行座標; Cursor_Col: 列座標)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -----------------------------------------
; 功能:鍵盤輸入一個N位的十進位制數字,將其轉換成二進位制數並儲存在指定的記憶體單元。
; 入口:N=數字位數;di=儲存輸入的數字首地址
; 出口:轉換後的二進位制數儲存在di所指的單元
Input_Digit Proc Near
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cx,N
push cx
@@Input: call GetCursor ;取游標位置
mov ah,1 ;從鍵盤接受一個字元
int 21h
cmp al,CR ;若鍵入的是回車,已經鍵入的數字不足N位
jz @@ASC_Dec ;轉去處理已經鍵入的數字
cmp al,KBBack
jz @@KB_Back ;若是回空鍵,重新輸入
cmp al,‘0’
jb @@KBBack ;若低於數字‘0’,重新輸入
cmp al,‘9’
ja @@KBBack ;若低於數字‘9’,重新輸入
jmp @@Save_Dig
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: call SetCursor ;置游標位置
jmp @@Input
@@Save_Dig: and al,0fh ;轉換成二進位制數
stosb ;儲存
loop @@Input ;接受下一個數字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ;實際輸入的數字位數
xor bp,bp
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;若直接回車,沒有輸入任何數字,按輸入‘0’處理
dec cx ;實際輸入的數字位數減1,準備把輸入的這一串數字轉換成二進位制數
jcxz @@One_Digit ;若輸入的數字只有一位,轉去直接儲存這個二進位制數
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,bp
mul bx
mov bp,ax
loop @@Mul_Ten
@@One_Digit:lodsb
cbw
add ax,bp
@@Save_Ret: pop di
stosw
pop bx
pop cx
pop dx
ret
@@Save_Tmp db 16 dup(?)
Input_Digit EndP
; -----------------------------------------
Prompt_Str1 db ‘Please input pulse hight: $’ ;提示輸入脈衝高度
Prompt_Str2 db ‘Please input pulse width: $’ ;提示輸入脈衝寬度
Prompt_Str3 db ‘Please input pulse wait time: $’ ;提示輸入間斷時間
Prompt_Str4 db ‘Please input line colour: $’ ;提示輸入波線顏色
N equ 3 ;輸入十進位制數值位數
Hight_Pulse dw ? ;脈衝高度
Width_Pulse dw ? ;脈衝寬度
Wait_Time dw ? ;脈衝間斷寬度
Colou_Pulse dw ? ;波線顏色
Start: push cs
pop ds
push cs
pop es ;使資料段、附加段與程式碼段同段
Output Prompt_Str1 ;提示輸入脈衝高度
lea di,Hight_Pulse ;脈衝高度
call Input_Digit ;鍵盤輸入一個3位的十進位制數字,將其轉換成二進位制數並儲存在指定的記憶體單元
call Enter_CTLF ;輸出一個回車、換行
Output Prompt_Str2 ;提示輸入脈衝寬度
lea di,Width_Pulse ;脈衝寬度
call Input_Digit
call Enter_CTLF ;輸出一個回車、換行
Output Prompt_Str3 ;提示輸入脈衝間斷寬度
lea di,Wait_Time ;脈衝間斷寬度
call Input_Digit
call Enter_CTLF ;輸出一個回車、換行
Output Prompt_Str4 ;提示輸入波線顏色
lea di,Colou_Pulse ;波線顏色
call Input_Digit
mov ax,12h ;設定640x480,16色圖形顯示方式
int 10h
; 以螢幕中間行為脈衝中間行,畫一條橫線
mov bp,640 ;橫向點數
xor bh,bh
xor cx,cx ;橫向起始點
mov dx,480 ;圖形顯示方式,一列480點
shr dx,1 ;縱向起始點
mov ah,0ch
mov al,byte ptr Colou_Pulse ;取畫素顏色
L0: int 10h ;寫一個指定顏色的畫素
inc cx ;橫向向右增值
dec bp
test bp,bp
jnz L0
; 從左到右、滿屏畫出相應的脈衝波圖形。
mov bp,Hight_Pulse ;取脈衝高度
xor cx,cx ;橫向起始點
mov dx,480 ;圖形顯示方式,一列480點
shr dx,1 ;縱向起始點
L1: int 10h ;寫一個指定顏色的畫素
dec dx ;縱向向上減值
dec bp
test bp,bp
jnz L1
Pulse_Wave: mov bp,Width_Pulse ;取脈衝寬度,一個脈衝週期
L2: int 10h ;寫一個指定顏色的畫素
inc cx ;橫向向右增值
cmp cx,639
ja Pause ;若到達螢幕最右邊,跳出迴圈,等待使用者按鍵,結束程式
dec bp
test bp,bp
jnz L2
mov bp,Hight_Pulse ;取脈衝高度
shl bp,1
L3: int 10h ;寫一個指定顏色的畫素
inc dx ;縱向向下增值
dec bp
test bp,bp
jnz L3
mov bp,Wait_Time ;取脈衝間斷寬度
L4: int 10h ;寫一個指定顏色的畫素
inc cx ;橫向向右增值
cmp cx,639
ja Pause ;若到達螢幕最右邊,跳出迴圈,等待使用者按鍵,結束程式
dec bp
test bp,bp
jnz L4
mov bp,Hight_Pulse ;取脈衝高度
shl bp,1
L5: int 10h ;寫一個指定顏色的畫素
dec dx ;縱向向上減值
dec bp
test bp,bp
jnz L5
jmp Pulse_Wave ;一個脈衝週期結束,進行下一個脈衝週期
Pause: mov ah,1 ;暫停,按任意鍵結束程式
int 21h
mov ah,3 ;設定80x25,16色文字顯示方式
int 10h
Exit_Proc: mov ah,4ch ;結束程式
int 21h
Code ENDS
END Start ;編譯到此結束
用定時器啊````很容易的 這個是方波的,請參考,然後自己編:ORG 0000H
LJMP MAIN
ORG 000BH
LJMP DVT0
ORG 0100H
MAIN:MOV TMOD,#01H
MOV TH0,#0FFH
MOV TL0,#0F9H
SETB ET0
SETB EA
SETB TR0
SJMP $
DVT0:CPL P1。0
MOV TH0,#0FFH
MOV TL0,#0F9H
RETI
END
薩子組合語言,沒明白,樓上用MCS51的
“給兩百塊錢可以考慮一下 ”
開個玩笑
用什麼顯示波形呢?
上一篇:造成重型軌道車行駛搖晃的原因
下一篇:珍珠棉材料有害嗎?