流水灯汇编程序讲解 ) ORG 0000H// 伪指令起始地址LJMP MAIN//跳到主函数里ORG 0100H// 重 新 开 始 设 置 起 始 地 址 , 因 为 在0000H~0023H 为中断子函数的入口, 等于说这几个入口地址把这段内存给分割了,为了保证程序的连续性要跳过这段内存。当然也可以从0030H 开始。MAIN:MOV A,#0FEH//点亮第一个灯。1111 1110。因为所有的 LED 是共阳极的所以当给低电平的时候导通MOV R0,#08H// 这个是用来确定循环次数的,意思就是说我有八个灯,所有我循环八次A1: MOV P1,A// 点亮第一个灯LCALL DELAY//调用延时子函数RL A// 左移一位,注意这条语句。是左移一位后的数据重新给累加器A。也就是说原来是1111 1110.现在是 1111 1101。DJNZ R0,A1//DJNZ。Decrease jump not zero. 我直白的理解减1 不是 0 就跳,谁减呢R0 减,跳哪呢?跳到A1处。然后此时由于累加器A 此时存的是1111 1101.所以大家应该要明白, 当我跳回到A1 的时候给P1 口赋值时。 点亮的是第二个灯,第一个灯灭。然后八次循环。依次点亮。MOV A,#7FH//对累加器 A 重装初值MOV R0,#08H// 还是八次循环。A2 的目的是从左往右依次点亮灯。类比A1 A2: MOV P1,A LCALL DELAY RR A DJNZ R0,A2 MOV R3,#0FEH// 这段程序到A3 是为了让灯从左往右依次全部点亮, 由于只有累加器A 可以进行左右移动的指令。并且大家可以通过查表04H 地址代表的是0 区寄存的R3 的地址。 为了下面 ORL 这个或的算法故这样赋值,大家可以参考书44 页第十二句指令。MOV R0,#08H MOV A,#0FDH A3: MOV P1,R3 LCALL DELAY ORL 04H,A//04H和 R3 是一个东西。累加器A 中存的是 1111 1101,而 R3 中存的是 1111 1110,它们两个或过之后为 1111 1100存到了 R3 中,也就是04H 这个地址中。RL A// 然后累加器中的数据左移一位。成为 1111 1011 DJNZ R0,A3// 大家可以自己琢磨一下下次循环会出现什么情况。然后,就能理解八次循环后的实验结果是什么了。MOV R3,#7FH//和 A3 差不多,就是从右往左依次全部点亮MOV R0,#08H MOV A,#0BFH A4: MOV P1,R3 LCALL DELAY ORL 04H,A RR A DJNZ R0,A4 MOV A,#00H// 全亮MOV P1,A LCALL DELAY MOV A,#0FFH//全灭MOV P1,A LCALL DELAY MOV A,#00H// 全亮MOV P1,A LCALL DELAY MOV A,#55//0101 0101 2468全亮MOV P1,A LCALL DELAY...