3-2传送类指令:
4、将外部ram2000h单元内容和内部ram20h单元内容互相交换
MOV DPTR,#2000H;MOVX A,@DPTR;XCH A,20H; MOVX @DPTR,A
5、编程将片内50h单元存放的1~9的数转换成相应的ASC2码。
• (1)MOV A , #30H;XCHD A , 50H;OV 50H , A
• (2) MOV A,50H;ADD A,#30H ;MOV 50H , A
4-1伪指令
例:查内部ram20h-50h单元中出现00h的次数,结果保存在r1中。
mov r0,#20h;mov r2,#31h;mov r1,#0h;bb:mov a,@r0;cjne a,#0,aa;inc r1;aa:inc r0
djnz r2,bb;mov a,r1;sjmp $ CJNE A,#0,feiling ;MOV 20H,#0FFH;sjmp $
feiling: jnc zheng;MOV 20H,#0FFH;SJMP JS;ZHENG: MOV 20H,#0
JS: SJMP $
(1)已知(R0)=20H, (20H ) =10H, (P0) =30H, (R2) =20H, 执行如下程序段后,( 40H ) =____。
MOV @R0 , #11H ;(20h)=11h
MOV A , R2 ;(a)=20h
ADDC A , 20H ;(a)=31h
MOV PSW , #80H ;cy=1
SUBB A , P0 ;(a)-30h-1=0
XRL A , #45H ;(a)=45h
MOV 40H , A ;(40h)=45h
4-2分支程序
例1、编写程序把A中的二进制数转换为3为BCD码,百位十位和各位分别存入30H开始的3个存放单元。(流程图)
如(A)=167
则程序执行后:
(30H)=1, (31H)=6, (32H)=7.
167如何分离出1、6、7三个数字?
● MOV B,#100;DIV AB;MOV 30H,A;MOV A,B;MOV B,#10H;DIV AB
● MOV 31H,A;MOV 32H,B
例2、编程实现将A中两位压缩BCD码转换为ASC2码存入30h和31H单元。
org 0000;mov r0,#30h;mov b,a;start:anl a,#0fh;ADD A,#30H;MOV @R0,A;MOV A,B
ANL A,#0F0H;SWAP A;ADD A,#30H;INC R0;MOV @R0,A;SJMP $;end
2`、编程实现将A中一位16进制数转换为ASC2码存入30h单元。
● org 0000;mov b,a;start:anl a,#0fh;mov r1,a;clr c;subb a,#0ah;jc aa
mov a,r1;add a,#37h;mov 30H,a;sjmp $;aa:mov a,r1;add a,#30h
mov 30H,a;sjmp $;end
例3:求双字节数的补码:该数存放于内部RAM 20H和21H两个单元,高地址存放高字节。要求读出补码后存于30H和31H单元。(流程图)先讲解单字节?
● 思路:先对低字节求补(即取反加1),判定其结果是否为0,若是(即低字节取反加1后有产生进位),则高字节取补(取反加1),否则,高字节取反,不加1。
● ORG 0000;MOV A,21H;JB ACC.7,START;MOV 30H,20H
● MOV 31H,21H;AJMP JIESU
● START:MOV A,20h;CPL A;Add A,#01
● MOV 30h,A;低八位取反加1,A中存放
● MOV A,21h ;表示要加进位的情况;CPL A;addc A,#00h
● BB:SETB ACC.7;MOV 31h,A;JIESU:sjmp $; END
例5:设变量X存放于R2中,函数值Y存放于R3中。试按下式要求给Y赋值。
● 方法1:
● ORG 0100H
● MOV A,R2 ;X→A
● CJNE A,#00H,L1 ;(A)与0比较,不等则转移
● MOV R3,#00H ;若相等,0→R3
● SJMP L3
● L1:JB ACC.7,L2 ;X<0,则转移
● MOV R3,#01H ;X>0,1→R3
● SJMP L3
● L2:MOV R3,#0FFH ;X<0,−1→R3
● L3:SJMP $
● END
● 方法二参考程序如下:(结果先放在A中)
● ORG 0100H
● MOV A,R2 ;取X到A
● JZ L2 ;X=0转移
● MOV R0,#0FFH ;先设X<0,(R0)= 0FFH
● JB ACC.7,L1 ;若X<0转移
● MOV R0,#01H ;X>0,(单片机编程100例详解R0)=1
● L1:MOV A,R0
● L2:MOV R3,A ;存结果
● SJMP $ END
4-3循环程序设计
例:片内RAM起始地址20H开始的8个单元存放8个无符号数。出其最大值。
● ORG 0000;START:MOV R0,#20H;MOV R1,#21H;MOV R7,#7H
● AA:MOV A,@R0;CLR C;SUBB A,@R1; JC BB
● MOV A,@R0;XCH A , @R1;MOV @R0, ABB: INC R0;INC R1
● DJNZ R7,AA;mov a,27H;END
例:片内RAM起始地址20H开始的8个单元存放8个无符号数。出其最大值存入内部RAM 50H单元。
● ORG 0000;START:MOV R0,#20H;MOV R7,#7H;CLR CY
● MOV 50H,@R0;INC R0
● AA:MOV A,@R0;SUBB A,50H;JC BB;MOV 50H,@R0
BB : INC R0;DJNZ R7,AA;SJMP $
例:片内RAM起始地址20H开始的8个单元存放8个无符号数。由大到小进行排序。
● ORG 0000;MOV R2,#8H;START:MOV R0,#20H;MOV R1,#21H
● MOV R7,#7H;AA:MOV A,@R0;CLR C;SUBB A,@R1;JC BB;MOV A,@R0;XCH A , @R1;MOV @R0, A
● BB: INC R0;NC R1;JNZ R7,AA;JNZ R2,START;END
● 例 将R0中存放的一位16进制数转换为ASCII 码存放至R2中。
● MOV A,R0 ;取4位二进制数
● ANL A,#0FH ;屏蔽掉高4位
● mov r1,a ;保护A
● CLR C ;清进(借)位位
● SUBB A,#0AH ;用借位位的状态判断该数在0~9还是A~F
● 之间
● mov a,r1 ; 还原A
● JC XIAO ;借位位为1,跳转至LOOP
● ADD A,#37H ;借位位为0,该数在A~F之间,加37H
● LJMP JIESU
● XIAO:ADD A,#30H ;该数在0~9之间,加30H
● JIESU: MOV R2,A ;ASCII码存于R2
例:编写子程序,将R1中的2个16进制数转换为ASC2码后存放于R3和R4中。
● ORG 0000 ;MOV A,R1;ACALL ZHUAN;MOV R3,A;MOV A,R1
● SWAP A;ACALL ZHUAN;MOV R4,A;SJMP $
● ZHUAN:ANL A,#0FH;MOV B,A;CLR CY;SUBB A,#0AH
MOV A,B;JNC da ;ADD A,#30H; AJMP BB
da:ADD A,#37H;BB: RET; END
MOV A,B;JNC da ;ADD A,#30H; AJMP BB
da:ADD A,#37H;BB: RET; END
例5:编制一个循环闪烁灯程序。有8个发光二极管,其中一个闪烁点亮10次后,转移到下一个闪烁10次,循环不止,参考电路下图所示。
● MOV A,#01H ;赋灯初始状态
SHIFT:LCALL FLASH ;调闪烁10次子程序
RL A ;右移 SJMP SHIFT ;循环
FLASH:MOV R2,#0AH ;闪烁10次
FLASH1:MOV P1,A ;点亮
LCALL DELAY ;延时 MOV P1,#00H ;熄灭
LCALL DELAY ; DJNZ R2,FLASH1 ;循环 RET
DELAY:MOV R5,#200 ;延时0.05s;;D1:MOV R6,#123
NOP; DJNZ R6,$;DJNZ R5,D1;RET
SHIFT:LCALL FLASH ;调闪烁10次子程序
RL A ;右移 SJMP SHIFT ;循环
FLASH:MOV R2,#0AH ;闪烁10次
FLASH1:MOV P1,A ;点亮
LCALL DELAY ;延时 MOV P1,#00H ;熄灭
LCALL DELAY ; DJNZ R2,FLASH1 ;循环 RET
DELAY:MOV R5,#200 ;延时0.05s;;D1:MOV R6,#123
NOP; DJNZ R6,$;DJNZ R5,D1;RET
● MOV A,#0feH ;赋灯初始状态;RL A ;右移
SJMP SHIFT ;循环
FLASH:MOV R2,#0AH ;闪烁10次
FLASH1:MOV P1,A ;点亮
LCALL DELAY ;延时;MOV P1,#0FFH ;熄灭
LCALL DELAY ; DJNZ R2,FLASH1 ;循环;RET
SJMP SHIFT ;循环
FLASH:MOV R2,#0AH ;闪烁10次
FLASH1:MOV P1,A ;点亮
LCALL DELAY ;延时;MOV P1,#0FFH ;熄灭
LCALL DELAY ; DJNZ R2,FLASH1 ;循环;RET
DELAY:MOV R5,#200 ;延时0.05s
D1:MOV R6,#123;NOP
DJNZ R6,$;DJNZ R5,D1;RET
D1:MOV R6,#123;NOP
DJNZ R6,$;DJNZ R5,D1;RET
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论