8051 常用副程式
程式中使用問號 "?" 當位址標記 , 那是因為我使用的組譯器有支援 Local Label Character.
用法是在程式(檔案)的最前端宣告 LLCHAR ?
如果您用的組譯器不支援此項功能,只好自己修改一下了.
;===================================================================
;16 Bit 乘法.
;用法:
; MOV 09H,乘數 Hi Byte
; MOV 08H,乘數 Low Byte
; MOV 0BH,被乘數 Hi Byte
; MOV 0AH,被乘數 Low Byte
; CALL MUL16
;傳回:
;積 = (0FH,0EH,0DH,0CH)
MUL16: ;(09H,08H) * (0BH,0AH) = (0FH,0EH,0DH,0CH)
MOV A,0AH
MOV B,08H
MUL AB
MOV 0CH,A
PUSH B
MOV A,0AH
MOV B,09H
MUL AB
MOV 0EH,B
POP B
ADD A,B
MOV 0DH,A
MOV A,0EH
ADDC A,#0
MOV 0EH,A
MOV A,0BH
MOV B,08H
MUL AB
ADD A,0DH
MOV 0DH,A
MOV A,0EH
ADDC A,#0
MOV 0EH,A
PUSH B
MOV A,0BH
MOV B,09H
MUL AB
MOV 0FH,B
POP B
ADD A,B
ADD A,0EH
MOV 0EH,A
MOV A,0FH
ADDC A,#0
MOV 0FH,A
RET
;============================================================================
;============================================================================
;16 Bit 除法.
;用法:
; MOV 09H,除數 Hi Byte
; MOV 08H,除數 Low Byte
; MOV 0DH,被除數 Hi Byte
; MOV 0CH,被除數 Low Byte
; CALL DIV16
;傳回:
;商數 = (09H-08H)
;餘數 = (0BH-0AH)
DIV16: ;(09H-08H)/(0DH-0CH) = (09H-08H)...(0BH-0AH)
PUSH 0
PUSH 1
PUSH 2
PUSH 3
CLR A
MOV 0AH,A
MOV 0BH,A
MOV R3,#16
CLR C
?2 MOV R1,#8
MOV R2,#4
?3 MOV A,@R1
RLC A
MOV @R1,A
INC R1
DJNZ R2,?3
MOV R0,#0BH
MOV R1,#0DH
MOV R2,#2
?4 MOV A,@R0
MOV B,@R1
CJNE A,B,?5
DEC R0
DEC R1
DJNZ R2,?4
?5 JC ?7
MOV R0,#0AH
MOV R1,#0CH
MOV R2,#2
CLR C
?6 MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,?6
?7 CPL C
DJNZ R3,?2
MOV R1,#8
MOV R2,#2
?8 MOV A,@R1
RLC A
MOV @R1,A
INC R1
DJNZ R2,?8
POP 3
POP 2
POP 1
POP 0
RET
;============================================================================
;============================================================================
;24 Bit 除法.
;用法:
; MOV 13H,除數 Hi Byte
; MOV 14H,除數 Mid Byte
; MOV 15H,除數 Low Byte
; MOV 10H,被除數 Hi Byte
; MOV 11H,被除數 Mid Byte
; MOV 12H,被除數 Low Byte
; CALL DIV16
;傳回:
;商數 = (19H,1AH,1BH)
;餘數 = (16H,17H,18H)
DIV24: ;(13H,14H,15H) / (10H,11H,12H) = (19H,1AH,1BH) ...... (16H,17H,18H)
PUSH 04
MOV R6,#06
MOV R0,#16H
CLR A
?0 MOV @R0,A
INC R0
DJNZ R6,?0
MOV R7,#24
CLR A
?LP0 MOV R0,#15H
MOV R6,#03
?LP1 XCH A,@R0
RLC A
XCH A,@R0
DEC R0
DJNZ R6,?LP1
MOV R0,#18H
MOV R6,#03
?LP2 MOV A,@R0
RLC A
MOV @R0,A
DEC R0
DJNZ R6,?LP2
MOV R3,16H
MOV R4,17H
MOV R5,18H
MOV R6,#03H
CLR C
MOV R1,#12H
MOV R0,#18H
?5 MOV A,@R0
SUBB A,@R1
MOV @R0,A
DEC R0
DEC R1
DJNZ R6,?5
JNC ?10
MOV 16H,R3
MOV 17H,R4
MOV 18H,R5
?10 CPL C
MOV R1,#1BH
MOV R6,#03H
?LP3 XCH A,@R1
RLC A
XCH A,@R1
DEC R1
DJNZ R6,?LP3
DJNZ R7,?LP0
POP 04
RET
;===================================================================
;===================================================================
;8 Bit Binary 轉成 3 位數 BCD
;用法:
; MOV A,#0FFH ;欲轉換的值
; CALL BIN2BCD
;
;傳回: DATA2=02H , DATA1=05H , DATA1=05H
;
BIN2BCD:
PUSH PSW
SETB RS0 ;USE BANK3
SETB RS1
MOV B,#100
DIV AB
MOV DATA2,A
MOV A,#10
XCH A,B
DIV AB
SWAP A
ADD A,B
MOV DATA0,A
ANL DATA0,#0FH
SWAP A
MOV DATA1,A
ANL DATA1,#0FH
POP PSW
RET
;===================================================================
;===================================================================
;16 Bit Binary 轉成 5 位數 BCD
;用法:
; MOV BIN_H,#0FFH ;欲轉換的值 Hi Byte
; MOV BIN_L,#0FFH ;欲轉換的值 Low Byte
; MOV 18H,#BIN_H ;將 BIN_H 的位址傳給 18H
; CALL BIN2BCD
;
;傳回: DATA4=06H , DATA3=05H , DATA2=05H , DATA1=03H , DATA0=05H
;
BIN4BCD:
PUSH PSW
SETB RS0 ;USE BANK3
SETB RS1
MOV R1,#DATA3
MOV R4,#04
?0 MOV @R1,#0
DEC R1
DJNZ R4,?0
MOV R1,#DATA3;;;
MOV R4,#16
?1 MOV R5,#2
PUSH 18H
CLR C
?2 MOV A,@R0
RLC A
MOV @R0,A
DEC R0
DJNZ R5,?2
POP 18H
MOV R5,#3
PUSH 19H
?3 MOV A,@R1
ADDC A,A
DA A
MOV @R1,A
DEC R1
DJNZ R5,?3
POP 19H
DJNZ R4,?1
MOV DATA4,DATA1
MOV DATA0,DATA3
MOV DATA1,DATA0
MOV A,DATA0
ANL A,#0FH
MOV DATA0,A
MOV A,DATA1
SWAP A
ANL A,#0FH
MOV DATA1,A
MOV DATA3,DATA2
MOV A,DATA2
ANL A,#0FH
MOV DATA2,A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,DATA3
SWAP A
ANL A,#0FH
MOV DATA3,A
POP PSW
RET
RET
;===================================================================
[ 上一頁 ]