解释一下这个流水灯程序

解释一下这个流水灯程序,第1张

这只是灯亮的初始状态不一样,如果temp=0x01为第一位先亮(先亮指初始状态,因为不知道你的是低电平还是高电平驱动),那么temp=0x7F就是第八位先亮,而且两个循环放方向不一样!一个向左,一个向右,说白了就是两段程序形成的状态是互补的形式。

ORG是伪指令,代表这行在存储介质上的地址。

ORG0000H就是存储介质上的第一行。

MOV R2,#08H 没有具体意义,只是让流水灯一直运行的一个数量位而已。一次会运行8组,但是会重新赋值,所以会一直不停的流动。

JB 只是一个检测位址是否为1,如果为1则跳转,否则不跳转程序。

JB P0.0,LOOP1 这条指令的意思是,如果P0.0为1,则程序跳转到LOOP1的程序位置上。

其他指令和上面的指令是一样的,如果都不为1,则执行

AJMP MAIN 也就是说程序一直在判断,外部的三个按钮是否按下,如果按下,就跳转到对应的子程序执行,如果都没有按下,则程序跳转到MAIN的地方,重新开始那三个JB,如果按钮没按下,一直查询按钮,无限循环。

现在假设P0.0的按钮被按下,则程序跳转到LOOP1的位置上。

所以开始跳转到第7行开始执行MOV,R2,#08H。这条指令和第一条指令是一样的,意义不大,就不重复了。

然后继续往下执行,MOV A,#0FEH,把累加器ACC的内存设置为16进制的FE,也就是最低位为0,其他位为1.

然后AJMP BUTTTON1。跳转到BUTTON1的位置,也就是下一行了。

然后是MOV P1,A。把累加器ACC里的FE给P1端口,这时候流水灯才开始亮起来了。按你图上的画法,是P1.0的灯亮,其他的灯不亮。

然后执行ACALL DELAY。这是子程序调用。调用名字为DELAY的子程序。这个时候程序跳转到最左边的那张图的DELAY的位置上。开始执行延时程序。

MOV R3,#14H 是设置延迟的次数。一次延迟,执行14次定时器。

下面的几条指令,我就不一一讲了,自己去看定时器的调用吧,符号和C语言的是一模一样的,设置定时器的类型,设置定时器的初始值。

SETB TR1 定时器1的运行标志位,设置为1,定时器开始工作。

JBC TF1,LP2。检查TF1标志位,定时器定时时间到了,TF1位为1,则跳转到LP2的位置。

然后重新给定时器赋值。然后R3减一,如果R3减到0,子程序调用结束,执行RET,完成子程序调用,否则,跳转到LP1的位置,继续执行定时器延迟程序。

现在假设延迟程序执行完毕,执行RET,完成子程序调用,返回主程序。

也就是程序第11行的位置上。因为这里是我们调用DELAY延迟函数开始的地方。程序会自动返回的,但是第一次写汇编的人,程序一大了,可能搞不清楚,你调用的位置在哪了,这很正常。

然后执行下一条指令,RL A 这条指令很简单,把累加器ACC里的值往左边移动一位,在51单片机里,就是向高位移动一位。

然后判断,其他的两个按钮是否被按下,两条JB指令,在前面已经讲过了,这里不赘述了。

如果按下了,就跳转到相应的位置上。否则执行DJNZ R2,BUTTON1,因为其他按钮没有按下来,所以继续执行BUTTON1的流水灯程序,R2的值不为0,则跳转到BUTTON1的位置上,重新开始执行,如果R2为0,则执行MOV R2,#08H,就重新给R2赋初值。然后执行AJMP BUTTON1,也就是没变。

现在我们假设P0.1的按钮被按下,则跳转到LOOP2。也就是第18行。

之后的指令是一样的,R2的作用是一样的就不解释了,然后直接解释下一条指令

MOV A,#7FH。这是给累加器ACC赋值,这次赋7H,跟BUTTON1正好相反,是最高位0,其他位为1,BUTTON1是最低位为0,其他位为1。

然后跳转到BUTTON2,执行MOV P1,A。把累加器的值给P1端口。

RR A,把累加器的值向右移动一位。

然后是两条JB指令,不解释了啊,忘了的,上边有写。然后调用DELAY延迟函数,执行过程,跟上面的是一样的。

后面的指令都是一样的,包括LOOP3的,自己看吧。已经写的很详细了,望采纳,还有不懂,再问吧。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8073362.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存