51单片机间接寻址C语言,[原创]用寄存器间接寻址巧妙使程序变得简短

首先,我是一名初学者,我希望和大家一起进步、一起成长。

这里,我要跟大家分享:汇编语言中巧用间址寄存器使程序简短。

例一,将内部RAM中30H开始的8个单元全部清零。

最原始最笨重的办法是顺序传送立即数:

L1:     MOV 30H,#00H

MOV 31H,#00H

。。。。。。

MOV 37H,#00H

RET

采用以上办法,如果要作用的不是8个、而是16个甚至更多个字节单元,那程序将会很长。

而以下的程序就简短得多:

S1:    MOV RO,#30H

MOV R1,#08H

S11:  MOV @R0,#00H

INC R0

DJNZ R1,S11           ;R1减一等于0表示MOV @R0,#00H已执行8次

RET

我们经常会在很多程序中的初始化部分发现上面形式的程序段。

而我的习惯则是:

S12:    MOV R0,#30H

S121:  MOV @R0,#00H

INC R0

CJNE R0,#38H,S121   ;R0等于38H,表示最后的37H已执行清零操作

RET

例二,给30H送0,31H送1,32送2,33H送3等等,37H送7

顺序传送立即数:

L2:      MOV 30H,#00H

MOV 31H,#01H

.。。。。。。

MOV 37H,#07H

RET

采用间址寄存器:

S2:       MOV R0,#30H

MOV A,#00H

S21:     MOV @R0,A

INC R0

INC A

CJNE R0,#38H,S21

RET

例三,将30H内容送至50H,31H内容送至51H,32H内容送至52H,等等,37H内容送至57H

顺序传送方式:略

采用间址寻址方式:

S3:      MOV R0,#30H

MOV R1,#50H

S31:    MOV A,@R0

MOV @R1,A

INC R0

INC R1

CJNE R0,38H,S31

RET

例四,已知30H至33H四个单元内容均小于十进制数100,把30H个位送50H,十位送51H,31H个位送52H,十位送53H,依此类推

顺序方式:

L4:     MOV A,30H

MOV B,#0AH

DIV AB

MOV 50H,B

MOV 51H,A

MOV A,31H

MOV B,#0AH

DIV AB

MOV 52H,B

MOV 53H,A

MOV A,32H

MOV B,#0AH

DIV AB

MOV 54H,B

MOV 55H,A

。。。。。。

RET

采用间址寻址方式:

S4:     MOV R0,#30H

MOV R1,#50H

S41:    MOV A,@R0

MOV B,#0AH

DIV AB

MOV @R1,B

INC R1

MOV @R1,A

INC R0

INC R1

CJNE R0,#34H,S41

RET

例五,采用动态扫描显示30H至33H四个单元内容,P1段选,P2位选

顺序方式:

L5:       MOV A,30H

MOVC A,@A+DPTR           ;查表

MOV P1,A

SETB P2.0                        ;选中第一位数码管,这里是共阳数码管位选同相驱动,或者共阴数码管反相驱动

ACALL DEL                       ;延时1毫秒

CLR P2.0

MOV A,31H

MOVC A,@A+DPTR

MOV P1,A

SETB P2.1

ACALL DEL

CLR P2.1

MOV A,32H

MOVC A,@A+DPTR

MOV P1,A

SETB P2.2

ACALL DEL

CLR P2.2

。。。。。。

RET

采用间址寻址方式:

S5:       MOV R0,#30H

MOV R1,#01H

S51:     MOV A,@R0

MOVC A,@A+DPTR

MOV P1,A

MOV P2,R1

INC R0

MOV A,R1

RL A                          ;选中数码管左移一位

MOV R1,A

CJNE RO,#34H,S51

RET

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值