📄 mcs-51
字号:
;_____________________________________________________________________________
ORG 2000H
AJMP MAIN
MAIN: MOV R0, #41H
ACALL ASBIN1
LOOP: SJMP LOOP
ASBIN1: CLR C
MOV A, R0
CJNE A, #30H, LOOP1
LOOP1: JC C, LOOP2
CJNE A, #47H, LOOP3
LOOP3: JNC C, LOOP2
CLR C
MOV A, R6
SUBB A, #30H
MOV R0, A
SUBB A, #0AH
JC C, LOOP4
XCH A, R0
SUBB A, #07H
MOV R0, A
LOOP4: RET
LOOP2: MOV R0, #0FFH
RET
;_____________________________________________________________________________
;数码 寄存器 例1 例2 例3 例4 例5 例6
;ASCII码 R0 41 38 49 29 30 46
;转换结果 R0 0A 08 FF FF 00 0F
;_____________________________________________________________________________
;_____________________________________________________________________________
;Name: EXASC1
;Func: 十六进制--->>ASCII码转换子程序
;Input: 待转换的十六进制放在R0中
;OutPut: 转换后的ASCII码仍放在R0中
;_____________________________________________________________________________
ORG 2000H
AJMP MAIN
MAIN: MOV R0, #04H
ACALL EXASC1
LOOP: SJMP LOOP
EXASC1: MOV A, R0
CJNE A, #0AH, LOOP1
LOOP1: JC C, NEXT0
ADD A, #07H
NEXT0: ADD A, #30H
RET
;_____________________________________________________________________________
;数码 寄存器 例1 例2 例3 例4
;转换结果 R0 04 0E 0F 0A
;ASCII码 R0 34 45 46 41
;_____________________________________________________________________________
;_____________________________________________________________________________
;Name: BCDAS1
;Func: BCD码--->>ASCII码转换子程序
;Input: BCD码数据放在由R0指向内部RAM20H为首地址的单元,BCD码字节数放在R7中
;OutPut: ASCII码数据放在由R1指向内部RAM10H为首地址的10个单元中
;_____________________________________________________________________________
20H EQU 01H
21H EQU 23H
22H EQU 45H
23H EQU 67H
24H EQU 89H
ORG 2000H
AJMP MAIN
SJMP MAIN
MAIN: MOV R0, #20H
MOV R1, #10H
MOV R7, #05H
ACALL BCDAS1
LOOP: SJMP LOOP
BCDAS1: MOV R1, #10H
MOV R6, #0AH
LOOP1: MOV @R0, #00H
INC R1
DJNZ R6, LOOP1
LOOP2: MOV A, @40
MOV R2, A
SWAP A
ANL A, #0FH
ADD A, #30H
MOV @R1, A
INC R1
MOV A, R2
ANL A, #0FH
ADD A, #30H
MOV @41, A
INC R0
INC R1
DJNZ R7, LOOP2
RET
;_____________________________________________________________________________
;Name: BINBCD
;Func: 双字节二进制-->>三字节BCD码转换子程序
;Input: 二进制数放在R0指向内部RAM24H单元为首地址的2个单元中
;OutPut: BCD码放在由R1指向内部RAM21H单元为首地址的3个单元
;_____________________________________________________________________________
DATA EQU 0FFH ;二进制数高字节
DATB EQU 0FFH ;二进制数低字节
ORG 2000H
AJM LOOP
LOOP: MOV R0, #24H
MOV A, #DATB ;送低字节
MOV @R0, A
INC R0
MOV A,F #DATA
MOV @R0, A
ACALL BINBCD
SJMP $
BINBCD: MOV R1, #21H ;BCD码首地址
MOV R5, #03H
CLR A
LOOP1: MOV @R1, A
INC R1
DJNZ R5, LOOP1
MOV R7, #10H
LOOP4: MOV R0, #24H
MOV R6, #02H
LR C
LOOP2: MOV A, @R0
RLC A
MOV @R0, A
INC R0
DJNZ R6, LOOP2
MOV R1, #21H
MOV R5, #03H
NOP
LOOP3: MOV A, @R1
ADDC A, @R1
DA A
MOV @R1, A
INC R1
DJNZ R5, LOOP3
DJNZ R7, LOOP4
RET
;_____________________________________________________________________________
; 二进制数 BCD码
; 25H 24H (23H 22H 21H)
; FF FF 06 55 35
; 00 FF 00 02 55
; 7F FF 03 27 67
;_____________________________________________________________________________
;_____________________________________________________________________________
;Name: DTOB4
;Func: 四位BCD码--->>十六位二进制数转换子程序
;Input: 四位BCD码放在R0指向内部RAM20H单元为首地址的4个单元中,其中20H单元为最高位
;OutPut: 转换结果放在R1R2中,R1放低位
;_____________________________________________________________________________
20H DEFB 02H ;千位
21H DEFB 03H ;百位
22H DEFB 07H ;十位
23H DEFB 06H ;个位
ORG 2000H
AJMP MAIN
MAIN: MOV R7, #03H
MOV R0, #20H
ACALL DTOB4
SJMP $
DTOB4: CLR A
MOV R1, A
MOV R2, A
MOV R4, A
MOV R5, A
MOV R3, A
MOV A, @R0
MOV R1, A
CLR C
LOOP1: MOV A, R1
ADD A, R1
MOV R1, A
MV A, R2
ADDC A, R2
MOV R2, A
MOV A, R1
MOV R3, A
MOV A, R2
MOV R4, A
MOV A, R1
ADD A, R1
MOV R1, A
MOV A, R2
ADDC A, R2
MOV R2, A
MOV A, R1
ADD A, R1;
MOV R1, A
MOV A, R2
ADDC A, R2
MOV R2, A
MOV A, R1
ADD Q, R3
MOV R1, A
MOV A, R2
ADDC A, R4
MOV R2, A
INC R0
MOV A, @R0
MOV R5, A
MOV A, R1
ADD A, R5
MOV R1, A
MOV A, R2
ADDC A, #00H
MOV R2, A
MOV R5, #00H
DJNZ R7, LOOP1
;_________________________________________________________________________
; BCD码 二进制数
; 20H 21H 22H 23H R2 R1
; 01 01 01 01 04 57
; 02 03 07 06 09 48
; 09 09 09 09 27 0F
;_____________________________________________________________________________;_____________________________________________________________________________
;Name: BINASC
;Func: 二进制数--->>ASCII码字符串转换子程序
;Input: 二进制数放在由R0指向内部RAM20H单元
;OutPut: 转换后的ASCII码字符串放在内部RAM21H--28H单元中
;_____________________________________________________________________________
20H DEFB 0AAH ;待转换二进制数
ORG 2000H
AJMP MAIN
MAIN: MOV R0, #20H
MOV R7, #08H
ACALL BINASC
SJMP $
BINASC: MOV A, @R0
LOOP1: INC R0
MOV @R0, #30H
CLR C
RLC A
JNC C, LOOP2
INC @R0
LOOP2: DJNZ R7, LOOP1
RET
;_____________________________________________________________________________
; 二进制数 ASCII码(转换结果)
; (20H) 21H ---------- ------28H
; 0AAH 31 30 31 30 31 30 31 30
;_____________________________________________________________________________
;_____________________________________________________________________________;_____________________________________________________________________________
;Name: BCH
;Func: 二进制数--->>十六进制数转换子程序
;Input: 二进制数末地址为内部RAM21H单元
;OutPut: 十六进制数放在内部RAM2AH单元中
;_____________________________________________________________________________
20H EQU 0A5H ;待转换的二进制数
21H EQU 0D9H
ORG 2000H
AJMP MAIN
MAIN: MOV R0, #21H
MOV R1, #2AH
MOV R7, #02H
ACALL BCH
SJMP $
BCH: MOV A, @R0
RR A
RR A
RR A
RR A
ANL A, #0FH
MOV @R1, A
INC R1
MOV A, @R0
ANL A, #0FH
MOV @R1, A
INC R1
DEC R0
DJNZ R7, BCH
RET
;_____________________________________________________________________________
; 二进制数 十六进制数
; (22H) (20H) (2AH)---(2DH)
; A5 D9 0A 05 0D 09
;_____________________________________________________________________________
;_____________________________________________________________________________
;Name: ASCBCD
;Func: ASCII码-->>BCD码转换子程序
;Input: ASCII码放在由R0指向内部RAM20H单元为首地址的8个单元中,转换字节数放在R7中
;OutPut: BCD码放在由R1指向外部RAM20H单元为首地址的6个单元
;_____________________________________________________________________________
20H EQU 28H
21H EQU 30H
22H EQU 32H
23H EQU 34H
24H EQU 38H
25H EQU 3AH
ORG 2000H
AJMP MAIN
MAIN: MOV R7, #06H
MOV R1, #20H
MOV R0, #20H
ACALL ASCBCD
SJMP $
ASCBCD: MOV A, @R0
CLR C
CJNE A, #30H, CHK1
CHK1: JC C, LOOP1
CJNE A, #3AH, CHK2
CHK2: JNC C, LOOP1
CLR C
SUBB A, #30H
LOOPP2: MOVX @R1, A
INC R0
INC R1
DJNZ R7, ASCBCD
RET
LOOP1: MOV A, @0FFH
MOVX @R1, A
LJMP LOOP2
;_____________________________________________________________________________
;Name: ASCHEX
;Func: ASCII码-->>十六进制数转换子程序
;Input: ASCII码放在由R0指向内部RAM20H单元为首地址的9个单元中,转换个数放在R7中
;OutPut: 转换后的十六进制数放在原ASCII码相应单元
;_____________________________________________________________________________
20H EQU 31H ;待转换的ASCII码
21H EQU 33H
22H EQU 35H
23H EQU 37H
24H EQU 39H
25H EQU 41H
26H EQU 43H
27H EQU 45H
28H EQU 47H
ORG 2000H
AJMP LOOP
LOOP: MOV R7, #09H
MOV R0, #20H
ACALL ASCHEX
LOOP0: SJMP LOOP0
ASCHEX: MOV A, @R
CLR C
SUBB A, #30H
CJNE A, #0AH
CHK1: JC C, LOOP1
SUBB A, #11H
CJNE A, #06H, CHK2
CHK2: JNC C, LOOP2
ADD A, #0AH
LOOP1: MOV @40, A
INC R0
DJNZ R7, ASCHEX
RET
LOOP2: MOV A, #0FFH
MOV @R0, A
LJMP LOOP1
;_____________________________________________________________________________
; 内存单元 (20H )------------------(28H)
; ASCII码 31 33 35 37 39 41 43 45 47
; 十六进制 01 03 05 07 09 0A 0C 0E FF
;_____________________________________________________________________________
;_____________________________________________________________________________
;Name: BCDBIN
;Func: BCD码--->>二进制数转换子程序
;Input: 将两个BCD码放在由R0指向内部RAM20H单元为首址的2个单元
;OutPut: 转换结果放在内部RAM22H中
;_____________________________________________________________________________
20H EQU 04H ;待转换的BCD码
21H EQU 07H
ORG 2000H
AJMP MAIN
MIAN: MOV R0, #20H
ACALL BCDBIN
LOOP: SJMP LOOP
BCDBIN: MOV A, @R0
ADD A, @R0
AMOV R2, A
ADD A, R2
ADD A, A
ADD A, R2
INC R0
ADD A, @R0
INC R0
ADD A, @R0
MOV 22H, A
RET
;_____________________________________________________________________________
; BCD码 二进制数
; (20H)(21H) (22H)
; 04 07 2F
; 06 03 3F
; 09 09 63
;_____________________________________________________________________________
;_____________________________________________________________________________
;Name: EXASC3
;Func: 十六进制数-->>ASCII码转换子程序
;Input: 十六进制数首址由R0指向内部RAM20H单元,转换的个数放在R7中
;OutPut: 转换后的ASCII放在原十六进制数的数据区
;_____________________________________________________________________________
ORG 2000H
AJMP MAIN
MAIN: MOV R0, #20H
MOV R7, #08H
ACALL EXASC3
SJMP $
EXASC3: MOV A, @R0
CJNE A, #0AH, LOOP1
LOOP1: INC C, NEXT0
ADD A, #30H
MOV @R0, A
INC R0
DJNZ R7, EXASC3
RET
NEXT0: ADD A, #37H
SJMP LOOP1
END
;___________________________________________________________________________
; 内存单元 20H------------------27H
; 十六进制数 02 03 05 06 0E 0F 0A 09
; ASCII码 32 33 35 36 45 46 41 39
;____________________________________________________________________________
;_____________________________________________________________________________
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -