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

;===================================================================

[ 上一頁 ]