Block equ 6000h
mov dptr, #Block ; 起始地址
mov r0, #0 ; 清 256 字节
clr a
Loop:
movx @dptr, a
inc dptr ; 指向下一个地址
djnz r0, Loop ; 记数减一
ljmp $
end
分析:
1.Block equ 6000h
用Block来表示6000h,equ 下面有解释。
2.mov r0, #0 ; 清 256 字节
把r0置为0,这样用djnz时候就能循环256次。
3,clr a
把累加器置为0,用来清零存储器块,每次清零8位。
4,Loop:
movx @dptr, a
inc dptr ; 指向下一个地址
djnz r0, Loop ; 记数减一
一个256次循环,每次清零8位。
5,ljmp $
$,代表当前地址。
$ 放在 LJMP 之后,它就代表这条指令本身的地址。
LJMP $,就是转移到该指令的本身地址。
LJMP $,就是原地转移的意思,即 死循环。
一旦有中断发生,就可以去执行中断程序
用到的知识:
1,equ命令
有时,一个表达式在程序中会多次出现,重复书写可能较为繁杂,易出错。另一方面。如果要对该表达式进行变动,那么必须在程序中找到每一个表达式,一一做出修改,稍有不慎,就会遗漏,引出麻烦。利用EQU伪指令,就可以避免这些问题的发生。
格式:<符号名> EQU <表达式>
该伪指令的含义是为EQU后面的<表达式>起一个叫做<符号名>的名字。这样一来,程序中凡是需要用到该表达式的地方,就都可以用这个名字代替了。这里,<表达式>可以是任何有效的数据,可以是能够算出值的表达式,也可以是有效的助记符等。
例 COUNT EQU 256
表示赋予数256一个名字,叫做COUNT。
VAR1 EQU COUNT-2
表示赋予表达式COUNT-2一个名字,叫做VAR1。如果有“COUNT EQU 256”在先,那么由于COUNT是数值256,所以VAR1就代表数值254。
PH EQU PUSH
表示赋予PUSH一个名字PH。由于PUSH是汇编语言的一个助记符,因此,在程序中书写PH AX,就相当于 PUSH AX。
与EQU伪指令类似的是等号伪指令“=”。它们的区别是:由EQU伪指令定义后的符号名是不能重复再定义的,而“=”伪指令中定义的符号名可重复定义。例如:
EMP=7
┋
EMP=EMP+2
这表示,开始把符号名EMP定义为是数值7,后来把符号名EMP重新定义为代表数值9。但是不能写成:
EMP EQU 7
┋
EMP EQU EMP+2
2,MOV,MOVX,MOVC区别和用法
MOV: 单片机内部的寄存器或者存储器之间相互传递数据(内部RAM);
MOVX: 单片机内部的A累加器与片外的数据存储器(片外RAM)传送数据.
MOVC: 单片机内部的A累加器向ROM(程序存储器)读取数据,因为程序存储器是固定的不可以写的,所以,A只能读数据,却不能向它写数据;
换句话说MOVX和 MOVC是针对两种不同的存储器而言,一个是片外数据存储器,另一个却是程序存储器。
由于内部和外部ROM的地址是连续的,故用MOVC一条指令即可;片内数据存储器与片外数据存储器的地址部分(0000H-00FFH)是重叠的,所以用MOV和MOVX加以区分。
明确MOV,MOVX,MOVC的概念针对他们各自的用法进行调用。 <!--EndFragment-->
3,片内数据存储器与片外数据存储器
<!--EndFragment-->
早期,片内存储器,还是片外存储器,确实是根据:他们是不是 在同一块 集成电路芯片上,来区分的。
数据存储器的传送指令,也有区别:片内传送,使用MOV,涉及片外了,就要用MOVX指令。
但是,科技发展了,有些单片机芯片,在同一块芯片上,还集成了少量的“片外存储器”,针对这些存储单元操作,就必须使用MOVX指令。
这样看来,片内,还是片外,区分的方法应该是使用什么指令,而不是他们是否分离成两块芯片。
4,dptr
通常写作:DPTR(Data Pointer)
数据指针DPTR是80C51中一个功能比较特殊的寄存器。从结构DPTR是一个16位的特殊功能寄存器, 其高位字节寄存器用DPH表示,低位字节寄存器用DPL表示,DPTR既可以作为一个16位的寄存器来处理,也可以作为两个独立的8位寄存器来使用。主要功能是存放16位地址,作为片外RAM寻址用的地址寄存器(间接寻址),故称数据指针。
访问片外数据存储器的指令为:
MOVX A,@DPTR 读
MOVX @DPTR,A 写
DPTR的另一个作用是变址寻址,访问程序存储器,做查表指令:如:
以dptr为基址寄存器,将dptr的内容与累加器a的内容相加得到变址地址
movc a, @a+dptr ; (a)<-----((a)+(dptr))
5,clr指令
// 累加器A 被赋零值,此时为逻辑运算指令。
//程序状态寄存器PSW中的CY位状态清零,此时为位操作指令