资源描述:
《流水灯汇编程序讲解)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、ORG0000H//伪指令起始地址LJMPMAIN//跳到主函数里ORG0100H//重新开始设置起始地址,因为在0000H~0023H为中断子函数的入口,等于说这几个入口地址把这段内存给分割了,为了保证程序的连续性要跳过这段内存。当然也可以从0030H开始。MAIN:MOVA,#0FEH//点亮第一个灯。11111110。因为所有的LED是共阳极的所以当给低电平的时候导通MOVR0,#08H//这个是用来确定循环次数的,意思就是说我有八个灯,所有我循环八次A1:MOVP1,A//点亮第一个灯LCALLDEL
2、AY//调用延时子函数RLA//左移一位,注意这条语句。是左移一位后的数据重新给累加器A。也就是说原来是11111110.现在是11111101。DJNZR0,A1//DJNZ。Decreasejumpnotzero.我直白的理解减1不是0就跳,谁减呢R0减,跳哪呢?跳到A1处。然后此时由于累加器A此时存的是11111101.所以大家应该要明白,当我跳回到A1的时候给P1口赋值时。点亮的是第二个灯,第一个灯灭。然后八次循环。依次点亮。MOVA,#7FH//对累加器A重装初值MOVR0,#08H//还是八次循环
3、。A2的目的是从左往右依次点亮灯。类比A1A2:MOVP1,ALCALLDELAYRRADJNZR0,A2MOVR3,#0FEH//这段程序到A3是为了让灯从左往右依次全部点亮,由于只有累加器A可以进行左右移动的指令。并且大家可以通过查表04H地址代表的是0区寄存的R3的地址。为了下面ORL这个或的算法故这样赋值,大家可以参考书44页第十二句指令。MOVR0,#08HMOVA,#0FDHA3:MOVP1,R3LCALLDELAYORL04H,A//04H和R3是一个东西。累加器A中存的是11111101,而R
4、3中存的是11111110,它们两个或过之后为11111100存到了R3中,也就是04H这个地址中。RLA//然后累加器中的数据左移一位。成为11111011DJNZR0,A3//大家可以自己琢磨一下下次循环会出现什么情况。然后,就能理解八次循环后的实验结果是什么了。MOVR3,#7FH//和A3差不多,就是从右往左依次全部点亮MOVR0,#08HMOVA,#0BFHA4:MOVP1,R3LCALLDELAYORL04H,ARRADJNZR0,A4MOVA,#00H//全亮MOVP1,ALCALLDELAYM
5、OVA,#0FFH//全灭MOVP1,ALCALLDELAYMOVA,#00H//全亮MOVP1,ALCALLDELAYMOVA,#55//010101012468全亮MOVP1,ALCALLDELAYCPLA//取反给累加器A。101010101357全亮MOVP1,ALCALLDELAYLJMPMAIN//调回主函数继续循环;延时函数//总共延时0.5S。咱们用的晶振大多数是12MHZ,也就是说每个晶振周期是十二分之一微秒。那么一个机器周期为1微秒。每次执行一个减指令为两个机器周期也就是2微秒,2*20*
6、125*200.就是这个函数的延时时间了。DELAY:MOVR1,#200DELAY1:MOVR2,#125DELAY2:MOVR4,#10DELAY3:DJNZR4,DELAY3DJNZR2,DELAY2DJNZR1,DELAY1RET//返回到调用处,继续下条指令。别直接粘到编辑器上,用不成的,自己敲上去吧,好好琢磨一下。大家一起学习,汇编我也没用过,这是我第一次用。有什么问题可以交流一下,我也会出错的。