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可以进行左右移动的指令。并且大家可以通过查
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
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
CPL A//取反给累加器A。1010 1010 1357全亮
MOV P1,A
LCALL DELAY
LJMP MAIN//调回主函数继续循环
;延时函数//总共延时0.5S。咱们用的晶振大多数是12MHZ,也就是说每个晶振周期是十二分之一微秒。那么一个机器周期为1微秒。每次执行一个减指令为两个机器周期也就是2微秒,2*20*125*200.就是这个函数的延时时间了。
DELAY:MOV R1,#200
DELAY1:MOV R2,#125
DELAY2:MOV R4,#10
DELAY3:DJNZ R4,DELAY3
DJNZ R2,DELAY2
DJNZ R1,DELAY1
RET//返回到调用处,继续下条指令。
别直接粘到编辑器上,用不成的,自己敲上去吧,好好琢磨
一下。大家一起学习,汇编我也没用过,这是我第一次用。有什么问题可以交流一下,我也会出错的。