📄 mcs-51
字号:
;********************************************************************
;以下的程序是一些关于数据转换与计算的子程序.
;函数名 说 明
;BIN3toBCD4 三字节二进制整数--->>BCD码四字节转换
;SIBITD 单字节二进制整数-->>BCD码转换子程序
;ADDM1 三字节加法子程序并显示和值
;SUBM 多字节减法子程序
;SUBM4 四字节乘四字节乘法子程序
;CHU3 五字节除五字节除法子程序
;CHU4 双字节除单字节除法子程序
;CHU5 双字节除单字节商为双字节除法子程序
;CHU6 三字节除单字节商为三字节除法了程序
;CHU7 三字节除双字节商为三字节除法子程序
;CHU8 四字节除双字节商为二字节除法子程序
;CHU9 三字节或二字节的倒数结果为三字节除法子程序
;CHU10 带符号双字节除单字节除法子程序
;SQRT 双字节平方根子程序
;BCDAD1 单字节BCD码加法子程序
;BCDAD2 四字节BCD码加法子程序
;BCDSUB3 单字节BCD码减法子程序
;DSUB2 四字节BCD码减法子程序
;BCDSUB4 单字节BCD码乘法子程序
;DCHFA 十进制数8位乘8位(四字节BCD码乘四字节BCD码)乘法子程序
;DCHU1 单字节BCD码除法子程序
;DCHU2 四字节BCD码除法子程序
;DSQR1 单字节BCD码平方根子程序
;DSQR2 双字节BCD码平方根子程序
;DSQR3 三字节BCD码平方根子程序
;ASBIN1 ASCII码--->>二进制数转换子程序
;EXASC1 十六进制--->>ASCII码转换子程序
;BCDAS1 BCD码--->>ASCII码转换子程序
;BINBCD 双字节二进制-->>三字节BCD码转换子程序
;DTOB4 四位BCD码--->>十六位二进制数转换子程序
;BINASC 二进制数--->>ASCII码字符串转换子程序
;BCH 二进制数--->>十六进制数转换子程序
;ASCBCD ASCII码-->>BCD码转换子程序
;ASCHEX ASCII码-->>十六进制数转换子程序
;BCDBIN BCD码--->>二进制数转换子程序
;EXASC3 十六进制数-->>ASCII码转换子程序
;********************************************************************
;********************************************************************
;Name: BIN3toBCD4
;Func: 三字节二进制整数--->>BCD码四字节转换(Comped BCD)
;Input: 二进制数人低字节到高字节存放在内部RAM50H,51H,52H单元中
;Output: BCD码人低位到高位分别存放在内部RAM53H,54H,55H,56H单元中
;USE: R7-R0, 56H-50H
;********************************************************************
;PASSED
BIN3toBCD4:
LENG1 EQU 24
LENG2 EQU 4
LENG3 EQU 3
NUMB1 EQU 50H
NUMB2 EQU 53H
;;;For test
MOV 50H, #00H
MOV 51H, #0FFH
MOV 52H, #0FFH
;;;;;;;;;;
ACALL MUBTD
RET
;;LOOP: SJMP LOOP
MUBTD: MOV R0, #NUMB2
MOV R7, #LENG2
CLR A
LOOP1: MOV @R0, A
INC R0
DJNZ R7, LOOP1
MOV R7, #LENG1
LOOP4: MOV R1, #NUMB1
MOV R6, #LENG3
CLR C
LOOP2: MOV A, @R1
RLC A
MOV @R1, A
INC R1
DJNZ R6, LOOP2
MOV R5, #LENG2
MOV R0, #NUMB2
LOOP3: MOV A, @R0
ADDC A, @R0
DA A
MOV @R0, A
INC R0
DJNZ R5, LOOP3
DJNZ R7, LOOP4
MOV R0, 53H
MOV R1, 54H
MOV R2, 55H
MOV R3, 56H
RET ; end of BIN3toBCD4
;********************************************************************
;_____________________________________________________________________________
; Name: SIBITD
;Func: 单字节二进制整数-->>BCD码转换子程序
;Input: 二进制数放在内部RAM20H单元
;OutPut: 转换后的BCD码高位放在内部RAM22H
;_____________________________________________________________________________
LENG1 EQU 8 ;二进制数位数
LENG2 EQU 2 ;BCD码字节数
NUMB1 EQU 20H ;二进制数地址
NUMB2 EQU 21H ;BCD码首址
ORG 2000H
AJMP MAIN
MAIN: MOV R0, #NMB1
MOV R1, #NUMB2
MOV R7, #LENG1
ACALL SIBTD
SJMP $
SIBTD: CLR A
MOV 21H, A
MOV 22H, A
LOOP3: CLR C
MOV A, @R0
RLC A
MOV @R0, A
MOV R1, #NUMB2
MOV R6, #LENG3
LOOP2: MOV A, #R1
ADDC A, #@R1
DA A
MOV @R1, A
INC R1
DJNZ R6, LOOP2
DJNZ R7, LOOP3
RET
;___________________________________________________________________________
; 二进制数 BCD码
; (20H) (22H 21H)
; FF 2 55
; 7F 1 27
; 80 1 28
;____________________________________________________________________________
;_____________________________________________________________________________
; Name: ADDM1
;Func: 三字节加法子程序并显示和值
;Input: 被加数数据区首址由R0指向内部RAM20H单元.加数数据区首地址由R1指向内部RAM23单元
;OutPut: 和数放在被加数的数据区
;_____________________________________________________________________________
ORG 20H
DATA: DEFB 66H ;被加数低字节
DEFB 77H
EEFB 88H ;被加数高字节
DATAB: DEFB 44H ;加数低字节
DEFB 66H
DEFB 77H; ;加数高字节
COVNT: EQU 03H ;字节数
ORG DAH
DS: DEFS 06H; display BUF
ORG 2000H
AJMP MAIN
MAIN: MOV R3, #COVNT
MOV R0, #DATA
MOV R1, #DATB
ACALL ADDM1
ACALL DSVP0
LOOP0: SJMP LOOP0
ADDM1: CLR A
LOOP: MOV A, @R0
ADDC A, @R1
MOV @R0, A
INC R0
INC R1
DJNZ R3, LOOP1
RET
DSUP0: MOV R0, #DS+5
MOV A, DATA
ACALL PTDS
MOV A, DATA+1
ACALL PTDS
MOV A, DATA+2
ACALL PTDS
MOV R0, #DS
MOV R2, #20H
MOV R3, #00H
MOV DPTR, #SEGPT
DSVP1: MOV A, #0FFH
MOV R1, #0E3H
MOVX @R1, A
MOVX A, @R0
MOVC A, @A+DPTR
MOV R1, #0E1H
MOVX @R, A
MOV A, R2
MOV R1, #0E3H
MOVX @R1, A
DSVP2: DJNZ R3, DSVP2
INC R0
CLR C
MOV A, R2
RRC A
MOV R2, A
JNZ A, DSVP1
LJMP DSVP0
RET
PTDS: MOV R1, A
ACALL PTDS1
MOV A, P1
SWAP
PTDS1: ANL A, #0FH
MOV @R0, A
DEC R0
RET
SEGPT: DEFB 0C0H, 0F9H
DEFB 0A4H, 0B0H
DEFB 99H, 92H
DEFB 82H, 0F8H
DEFB 80H, 90H
DEFB 88H, 83H
DEFB 0C6H, 0A1H
DEFB 86H, 8EH
END
;__________________________________________________________________________
; 被加数 加数 和数
; 22H21H20H 25H24H23H 22H21H20H
; 88 77 66 77 66 44 FF DD AA
; 78 65 44 77 65 98 F0 00 00
;__________________________________________________________________________
;_____________________________________________________________________________
;Name: SUBM
;Func: 多字节减法子程序
;Input: 被减数数据区首址由R0指向内部RAM20H单元.减数数据区首地址由R1指向内部RAM23单元
;OutPut: 差数放在被减数的数据区
;_____________________________________________________________________________
ORG 20H
DATA: DEFB 0FFH ;被减数低字节
DEFB 0FFH
DEFB 0FFH
DEFB 0FFH ;被减数高字节
DATB: DEFB 55H ;减数低字节
DEFB 55H
DEFB 55H
DEFB 55H ;减数高字节
COVNT: EQU 04H ;字节数
ORG 2000H
AJMP MAIN
MAIN: MOV R3, #COVNT
MOV R0, #DATA
MOV R1, #DATB
ACALL SUBM
LOOP: SJMP LOOP
SUMB: CLR C
CLR A
LOOP1: MOV A, @R0
SUBB A, @R1
MOV @R0, A
INC R0
INC R1
DJNZ R3, LOOP1
RET
END
;__________________________________________________________________________
; 被减数 减数 差数
; 23H22H21H20H 27H26H25H24H 23H22H21H20H
; FF FF FF FF 55 55 55 55 AA AA AA AA
; AA AA AA AA 55 55 55 55 55 55 55 55
; 12 34 56 78 12 34 56 79 FF FF FF FF
;__________________________________________________________________________
;_____________________________________________________________________________
;Name: SUBM4
;Func: 四字节乘四字节乘法子程序
;Input:被乘数和乘数分别放在内部RAM20H--27H单元中,乘数位数放在2AH单元中
;OutPut: 乘积放在内部RAM61H-68H单元中.
;_____________________________________________________________________________
ORG 20H
DATA1 DEFB 0FFH 被乘数低字节
DATA2 DEFB 0FFH
DATA3 DEFB 0FFH
DATA4 DEFB 7FH 被乘数高字节
DATB1 DEFB 0FFH 乘数低字节
DATB2 DEFB 0FFH
DATB3 DEFB 0FFH
DATB4 DEFB 7FH 乘数高字节
COVNT EQU 20H
ORG 2000H
AJMP MAIN
MAIN: MOV R0, DATA1
MOV R1, DATA2
MOV R2, DATA3
MOV R3, DATA4
MOV R4, DATB1
MOV R5, DATB2
MOV R6, DATB3
MOV R7, DATB4
MOV 2AH, #COVNT
CLR A
MOV 61H, A
MOV 62H, A
MOV 63H, A
MOV 64H, A
MOV 65H, A
MOV 66H, A
MOV 67H, A
MOV 68H, A
ACALL CHENG6
LOOP0: SJMP LOOP0
ORG 2200H
CHENG6: MOV A, 61H
ADD A, 61H
MOV 61H, A
MOV A, 62H
ADDC A, 62H
MOV 62H, A
MOV A, 63H
ADDC A, 63H
MOV 63H, A
MOV A, 64H
ADDC A, 64H
MOV 64H, A
MOV A, 65H
ADDC A, 65H
MOV 65H, A
MOV A, 66H
ADDC A, 66H
MOV 66H, A
MOV A, 67H
ADDC A, 67H
MOV 67H, A
MOV A, 68H
ADDC A, 68H
MOV 68H, A
MOV A, R4
ADD A, R4
MOV R4, A
MOV A, R5
ADD A, R5
MOV R5, A
MOV A, R6
ADD A, R6
MOV R6, A
MOV A, R7
ADD A, R7
MOV R7, A
JNC LOOP1
MOV A, 61H
ADD A, R0
MOV 61H, A
MOV A, 62H
ADDC A, R1
MOV A, 63H
ADDC A, R2
MOV 63H, A
MOV A, 64H
ADDC A, R3
MOV 64H, A
MOV A, 65H
ADDC A, #00H
MOV 65H, A
MOV A, 66H
ADDC A, #00H
MOV 66H, A
MOV A, 67H
ADDC A, #00H
MOV 67H, A
MOV A, 68H
ADDC A, #00H
MOV 68H, A
LOOP1: DJNZ 2AH, LOOP2
RET
LOOP2: AJMP CHENG6
END
;__________________________________________________________________________
; 被乘数 乘数 积数
; 23H22H21H20H 27H26H25H24H 68H--61H
; 7F FF FF FF 7F FF FF FF 3F FF FF FF 00 00 01 00
; 00 FF FF FF 00 00 FF FF 00 00 00 FF FE FF 00 01
;__________________________________________________________________________
;_____________________________________________________________________________
;Name: CHU3
;Func: 五字节除五字节除法子程序
;Input: 被除数放在内部RAM20H-24H单元中,除数放在10H-14H单元中.
;OutPut:商数放在25-29单元中,25H单元放最低字节,余数放在20H-24H单元中,20H单元放最低字节
;Use: 用A,C,R0,R1,R2,R3,R6,R7寄存器,其中R0作移位减计数器,使用位地址60H单元作进位位,C作暂存器
;_____________________________________________________________________________
ORG 20H
DATA1: DEFB 21H 被除数最低字节
DATA2: DEFB 43H
DATA3: DEFB 65H
DATA4: DEFB 87H
DATA5: DEFB A9H 被除数最高字节
ORG 10H
DATB1: DEFB 9AH 除数最低字节
DATB2: DEFB 78H
DATB3: DEFB 56H
DATB4: DEFB 34H
DATB5: DEFB 12H 除数最高字节
ORG 2000H
AJMP MAIN
MAIN: ACALL CHU3
LOOP: SJMP LOOP
CHU3: MOV R0, #DATB1
MOV R7, #04H ;检查除数为零停止运算
LOOP1: MOV A, @R0
JNC R0
ORL A, @R0
JNZ A, LOOP0
DJNZ R7, LOOP1
AJMP LOOP2
LOOP0: CLR A
MOV R0, #25H
MOV R7, #05H
LOOP3: MOV @R0, A
INC R0
DJNZ R7, LOOP6
MOV R6, #28H ;移位计数器
LOOP8: MOV R0, #DATA1 ;与商连在一起左移
MOV R7, #0AH
LOOP4: MOV A, @R0
RLC A
MOV @R0, A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -