0054 CSFO XCH A,B ;(A)=b3,(B)=b2
0056 CB XCH A,R3 ;(A)=R3(b1),(R3)=b3
0057 75F00A MOV B,#10
005 A4 MUL AB ;(A)=(bl X l0)L,(B)=(bl X l0)H
005B 2B ADD A,R3 ;A=[(bl X 1O)L+b3]
005C FB MOT R3,A ;此时R3×10,R4×10已经完成
005D 08 INC R0 ;取下一位BCD码
005E EC MOV A,R4 ;(R4+下一位BCD码数值)送B4
005F 26 ADD A,@RO
0060 FC MOV R4, A
0061 EB MOV A,R3 ;进位加到高8位
0062 3400 ADDC A,#0
0064 FB MOV R3.A
0065 DAE7 DJNZ R2,LOOP ;循环(n-1)次
0067 D0F0 POP B ;恢复现场
0069 D0E0 POP ACC
006B D0D0 POP PSW
006D 22 RET ;返回
例如:4位.BCD数为6553,依次存入内存单元20 H、21 H、22 H和23 H中。转换结果为19 9H,依次存人R3和R4中。
【4-19】将外部RAM的40 H单元中的一个字节拆成2个ASCII码,分别存入内部数据存储器40 H和41 H单元中。试编写以子程序形式给出的转换程序,说明调用该子程序的入口条件和出口功能。加上必要的伪指令,并对源程序加以注释。
【答】子程序的入口条件、出口功能及源代码如下:
子程序人口条件:准备拆为2个ASCII码的数存入外部RAM的40 H单元中。
子程序出口功能:完成外部RAM单元一个字节拆成2个ASCII码,分别存入内部数据存储器40 H和41 H单元中。
ORG 1 000H
B_TO_A:MOV DPTR,#40H ;外部RAM40H单元
很难找到
MOV R0,#40H
MOVX A,@DPTR ;取数
PUSH A
ANL A,#0FH ;低4位转换为ASCII码
LCALL. CHANGE
MOV @RO,A
INC R0
POP A ’
SWAP A
ANL A,#0FH ;高4位转换为ASCII码
LCALL CHANGE
MOV @R0,A
RET
CHANGE:CJNE A,#0AH,NEXT ;转换子程序
NEXT: JNC NEXT2 ;≥0AH,转移
ADD A,#3 0H ;≤9,数字0-9转化为ASCII码
RET
NEXT2: ADD A,#37H ;字母A~F转化为ASCII码
RET
END
设外部(40 H)=12 H。
执行程序B_TO_A后:内部(40 H)=31 H,(41 H)=32 H。
设外部RAM(40 H)=ABH。
执行程序B_TO_A后,内部(40 H)=41 H,(41 H)=42 H。
【4-20】请编写中值数字滤波子程序FILLE,加上必要的伪指令,并对源程序加以注释。 入口条件:3次采集数据分别存储在内部存储器的20 H、21 H和22 H中。出口结果:中值在R0寄存器中。
【答】程序如下:
ORG 00H
0000 0130 AJMP LIZI
ORG 30H
0030 752056 LIZI:MOV 20H,#56H ;3次采集数据
0033 752184 MOV 21H,#84H
0036 752212 MOV 22H,#12H
0039 113D ACALL FILLE
003B 013B AJMP $ ;中值数字滤波子程序FILLV.
003D COD0 FILLE:PUSH PSW ;PSW及ACC保护入栈
003F COE0 PUSH ACC
.0041 E520 MOV A,20H ;取第一个数
0043 C3 CLR C
0044 9521 SUBB A,21H ;与第二个数比较
0046 5006 JNC LOB1 ;第一个数比第二个大,转LOBl
0048 E520 MOV A,20H ;第一个数比第二个小,交换位置
004A C521 XCH A,21H
很难找到
004C F520 MOV 20H,A
004E E522 LOB1l: MOV A,22H
0050 C3 CLR C
0051 9520 SUBB A,20H ;第三个数与前二个数中的较大数比较 0053 500F JNC LOB3 ;第三个数大于前二个中的较大数,转LOB3 0055 E522 MOV A,22H
0057 C3 CLR C
0058 9521 SUBB A,21H ;第三个数与前二个数中的较小数比较 005A 500D JNC IOB4
005C E521 MOV A,21H .
005E F8 MOV R0,A ;存入中值
005F D0E0 LOB2:POP ACC ;恢复ACC和PSW
0061 D0D0 POP PSW
0063 22 RET
0064 E520 LOB3: MOV A,20H
0066 F8 MOV R0,A
0067 015F AJMP LOB2
0069 E522 LOB4: MOV A,22H
006B F8 MOV R0,A ;存入中值
006C 015F AJMP LOB2
执行结果为(RO)=56 H。
【4-21】根据8100 H单元中的值X,决定P1口引脚输出为:
加上必要的伪指令,并对源程序加以注释。 .
【答】程序如下:
ORG 0000H
SJMP BEGIN
ORG 0030H
BEGIN: MOV DPTR,#8100H
MOVX A,@DPTR
MOV R2,A
JB ACC.7,SMALLER;有符号数<0
SJMP UNSIGNED ;无符号数≥0
SMALLER:DEC A ;X<0,输出-X(先减1,再取反)
CPL A
MOV P1,A
SJMP OK
UNSIGNED:CJNE A,#00H,BIGGER ;不等于0即大于0
MOV P1,#80H ;X等于0,输出80H
SJMP OK
BIGGER: CLR C ;X大于0,输出A×2
RLC A ;A×2
很难找到
MOV P1,A
OK: SJMP $
END
例如:输入55 H,P1口引脚输出AAH;输入00 H,P1口引脚输出80 H;输入F1(一1 5的补码),P1口引脚输出0FH。
【4-22】将4000 H~40FF H中256个ASCII码加上奇校验后从P1口依次输出。加上必要的伪指令,并对源程序加以注释。
【答】注意:ASCII码的有效位为7位,其最高位D7可与程序状态字PSW中的奇偶校验 位P配合进行校验。
ORG 0000H
SJMP BEGIN
ORG 0030H
BEGIN:
MOV DPTR,#4000H ;首地址
MOV R0,#00H ;发送计数器
LOOP:
MOVX A,@DPTR
MOV C,P
CPL C
MOV ACC.7,C , ;置奇校验