这两段程序怎么合成一段

qq_42644339 2018-10-14 11:12:44
MOV R3,#5
LOOP1: MOV P2,#0FFH
ACALL DELAY
MOV P2,#00H
ACALL DELAY
DJNZ R3,LOOP1
DELAY: MOV R4,#100
LOOP2: MOV R5,#50
LOOP3: MOV R6,#30
LOOP4: DJNZ R6 ,LOOP4
DJNZ R5 ,LOOP3
DJNZ R4 ,LOOP2
RET ORG 000H
LJMP MAIN
ORG 0030H
MAIN: MOV SP,#7
MOV P1,#0FFH ;P1口初始化,设置P0为输入方式
LOOP: MOV A,P1 ;将P0口的状态读入累加器A,P0口的状态由开关SW1~SW2控制
MOV P2,A ;P0口的状态送P1口显示
MOV 20H,A ;将P0口的状态数据送20H单元保存
SCAN: MOV A,P1 ;再次读P0口的开关状态
CJNE A,20H,LOOP ;P0口数据是否有变化,有则跳转到LOOP,并送P1口显示
SJMP SCAN ;无变化,则跳转到SCAN继续查询P0口,
END 求问,这两段程序怎么合成一个程序
...全文
385 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2018-10-15
  • 打赏
  • 举报
回复
ORG n ;n为一个合适的值,n大于Main的起点+Main的 长度
MOV R3,#5
LOOP1: MOV P2,#0FFH
ACALL DELAY
MOV P2,#00H
ACALL DELAY
DJNZ R3,LOOP1
DELAY: MOV R4,#100
LOOP2: MOV R5,#50
LOOP3: MOV R6,#30
LOOP4: DJNZ R6 ,LOOP4
DJNZ R5 ,LOOP3
DJNZ R4 ,LOOP2
RET


ORG 000H [color=#FF0000]//000作为起点不合适,因为这些位置一般为中断入口专用[,应该改成别的值,比如100H/color]
LJMP MAIN
ORG 0030H
MAIN: MOV SP,#7
MOV P1,#0FFH ;P1口初始化,设置P0为输入方式
LOOP: MOV A,P1 ;将P0口的状态读入累加器A,P0口的状态由开关SW1~SW2控制
MOV P2,A ;P0口的状态送P1口显示
MOV 20H,A ;将P0口的状态数据送20H单元保存
SCAN: MOV A,P1 ;再次读P0口的开关状态
CJNE A,20H,LOOP ;P0口数据是否有变化,有则跳转到LOOP,并送P1口显示
SJMP SCAN ;无变化,则跳转到SCAN继续查询P0口,
END
yishumei 2018-10-15
  • 打赏
  • 举报
回复
第一段的功能是延时。末尾有RET,说明是某子函数的一部分。主循环MAIN里哪部分需要延时?
yishumei 2018-10-15
  • 打赏
  • 举报
回复
ORG 000H [color=#FF0000]//000作为起点不合适,因为这些位置一般为中断入口专用[,应该改成别的值,比如100H/color] LJMP MAIN 3楼的这个注解有误。51单片机上电复位后,程序计数器PC会被复位为0000H,也就是说,程序只能在物理地址0000H处开始运行。如果不在0000H处写入跳转语句,程序就会跑飞。
yishumei 2018-10-15
  • 打赏
  • 举报
回复
引用 2 楼 yishumei 的回复:
第一段的功能是延时。末尾有RET,说明是某子函数的一部分。主循环MAIN里哪部分需要延时?
楼主不好意思,末尾的RET是子函数DELAY的。
qq_42644339 2018-10-14
  • 打赏
  • 举报
回复
第一段在前,谢谢

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧