二话不说,先上代码:
ORG 0000H
AJMP MAIN
MAIN:SETB P1.0
LCALL DELAY
CLR P1.0
LCALL DELAYA
AJMP MAIN
DELAY: MOV R7,#255
D1: MOV R6,#255
D2: DJNZ R6,D2
DJNZ R7,D1
RET
DELAYA: MOV R7,#100
K1: MOV R6,#100
K2: DJNZ R6,K2
DJNZ R7,K1
RET
END
让我从头到尾来分析这整个程序:首先,这段程序是用于循环点亮P1.0这个灯的。
ORG 0000H ;这句话我们说过他的作用了,不懂的往前看。
AJMP MAIN ;这句话分成两个部分,AJMP和MAIN。AJMP是一个绝对转移指令,英文为absolute jump,类似的转移指令还有ljmp和sjmp,jmp。这里大概啰嗦一下,ljmp就是长转移,就是可以跳转的距离比较长,sjmp是短跳转,JMP就是一个跳转,由于我现在不打算学那么深,所以不打算深入探讨,只要能达到目标即可。 MAIN是一个标号,表示跳到main这个标号所在的程序运行,标号就相当于一个地址。
MAIN:SETB P1.0 ;这就是MAIN标号里面的内容,用分号隔离开标号和程序,程序setb就是置位,把p1.0这个位变为高电平,就是set bit
LCALL DELAY ;这里得好好说一下,lcall是长的调用函数的指令,就是long call组成的,call就是调用函数的语句,函数名是DELAY,这个类似于转移指令,但是函数是一个块,它的后面有返回RET,而转移就是转到那个标号的内容去执行,不管什么返回不返回的。这个函数的作用就是一个延时。
CLR P1.0 ; 延时结束之后,就对p1.0清0,clear。
LCALL DELAYA ;然后继续执行下一个延时
AJMP MAIN ;这里又是一个跳转指令,跳回到main标号中,就相当于是不断的重复执行这里面的代码了
DELAY: MOV R7,#255 ;这是延时函数,r7是一个8位的工作寄存器,所以它最大可以放255,指令的作用就是把255放进r7这个寄存器当中去。
D1: MOV R6,#255;d1是标号,指令的作用同上
D2: DJNZ R6,D2 ;D2也是标号,DJNZ相当于c语言中的if else,让我仔细说一下他的作用,减一不为零转移指令(dec 1 jump if not zero),就是把r6中的内容减去一,然后判断它是否等于0,如果不等于0,就跳转到后面的标号的内容继续执行,如果等于0就继续执行下一条指令,然后由于后面的标号还是D2,所以就一直在执行这条指令,直到r6等于0
DJNZ R7,D1 ;这条指令和上面的也是一样,只不过他是跳回到D1这里,所以他又回到d1那里,不断的重复。
RET ;这个是函数的返回,表示结束这个函数。
我写一段c语言的代码来表示这个汇编里面的延时函数吧,不然怕你们看不懂。
public void delay()
{
for(int i=255;i>0;i--)
{
for(int j=255;j>0;j--)
{}
}
}
就是里面先有255次的减法运算,然后在外面包围一个255的减法运算,所以总的就是255*255次减法运算。我们知道单片机的运行速度比较快,所以可能你的单片机这样运行的延时还是不够,你可以再加上一个包围,只是这层包围10次左右就差不多了。
DELAYA: MOV R7,#100 ;这是短一点的延时函数
K1: MOV R6,#100
K2: DJNZ R6,K2
DJNZ R7,K1
RET
END ;记住后面要加上程序的结尾
相关文章