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  AR2          XA
    CJNE  A#00HL1 ;(A)与0比较,不等则转移
    MOV  R3#00H          ;若相等,0R3
    SJMP  L3
L1JB      ACC.7L2          X0,则转移
    MOV      R3#01H          X01R3
    SJMP      L3
L2MOV      R3#0FFH      X0−1R3
L3SJMP      $
    END
方法二参考程序如下:(结果先放在A中)
    ORG    0100H
    MOV      AR2          ;取XA
    JZ      L2                X=0转移
MOV  R0#0FFH  ;先设X0,(R0= 0FFH
    JB      ACC.7L1        ;若X0转移
    MOV    R0#01H          X0,(单片机编程100例详解R0=1
L1MOV      AR0
L2MOV      R3A              ;存结果
    SJMP  $        END
4-3循环程序设计
例:片内RAM起始地址20H开始的8个单元存放8个无符号数。出其最大值。
ORG 0000;START:MOV  R0,#20H;MOV  R1,#21H;MOV  R7,#7H
AA:MOV  A@R0CLR  CSUBB  A@R1JC  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@R0CLR  CSUBB  A@R1JC  BBMOV  A,@R0XCH  A ,  @R1MOV  @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
5:编制一个循环闪烁灯程序。有8个发光二极管,其中一个闪烁点亮10次后,转移到下一个闪烁10次,循环不止,参考电路下图所示。
MOV    A,#01H      ;赋灯初始状态
SHIFT:LCALL    FLASH      ;调闪烁10次子程序
RL      A            ;右移        SJMP      SHIFT      ;循环
FLASHMOV      R2#0AH      ;闪烁10
FLASH1MOV      P1A          ;点亮
LCALL    DELAY          ;延时    MOV      P1#00H          ;熄灭
LCALL    DELAY ;  DJNZ      R2FLASH1      ;循环    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      ;循环
FLASHMOV      R2#0AH      ;闪烁10
FLASH1MOV      P1A          ;点亮
LCALL    DELAY          ;延时;MOV      P1#0FFH          ;熄灭
LCALL    DELAY ;  DJNZ      R2FLASH1      ;循环;RET
DELAY:MOV      R5,#200          ;延时0.05s
D1:MOV      R6,#123;NOP
DJNZ      R6,$;DJNZ      R5,D1;RET

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。