- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
流水灯汇编程序讲解)
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
CPL A//取反给累加器A。1010 1010 1357全亮
MOV P1,A
LCALL DELAY
LJMP MAIN//调回主函数继续循环
;延时函数
DELAY:MOV R1,#200
DELAY1:MOV R2,#125
DELAY2:MOV R4,#10
DELAY3:DJNZ R4,DELAY3
DJNZ R2,DELAY2
DJNZ R1,DELAY1
RET//返回到调用处,继续下条指令。
别直接粘到编辑器上,用不成的,自己敲上去吧,好好琢磨一下。大家一起学习,汇编我也没用过,这是我第一次用。有什么问题可以交流一下,我也会出错的。
文档评论(0)