XH1 DATA 100H ;定义循环单元地址data用来定义单元地址
XH2 DATA 105H
ORG 0000H ;org说明程序从这里开始写
AJMP MAIN ;ajmp是11位的寻址,把程序储存器分成2K的一份份,ajmp要求每在同一2k地址上当程序超过2k时ajmp命令会寻不了址,所以以后要用ljmp代替ajmp
ORG 0030H ;其实002bh到0032h这段会用在定时器2的中断进入地址,最好用到0050h或0100h开始
MAIN: MOV P0, #11111110B ;初始化P0P2的绿灯P1P3红灯亮
MOV P2, #11111110B
MOV P1, #11110111B
MOV P3, #11110111B
ACALL DEL30S ;调用延时程序,acall和ajmp存在同一个问题所以用lcall
CPL P0.0 ;p0p2第一位取反,绿灯灭,第七位取反,红灯灭,cpl可以将累加器a的各位取反,同时是位取反操作符
CPL P2.0
CPL P0.6
CPL P2.6
ACALL DEL05S
MOV XH1, #10 ;假如我现在用我会用工作寄存器来完成这操作
YELL0: CPL P0.6
CPL P2.6
ACALL DEL05S
DJNZ XH1, YELL0 ;闪耀11次
MOV P0, #11110111B ;换向P0P2黄灯亮P1P3红灯亮
MOV P2, #11110111B
MOV P1, #11111110B
MOV P3, #11111110B
ACALL DEL30S
CPL P1.0 ;黄灯闪耀
CPL P3.0
CPL P1.6
CPL P3.6
ACALL DEL05S ;延时
MOV XH2, #10
YELL1: CPL P1.6
CPL P3.6
ACALL DEL05S
DJNZ XH2, YELL1 ;闪耀11次
AJMP MAIN
;延时0.5S子程序
DEL05S: MOV R5, #04H ;时间=R5×R6×R7×机械周期÷2,89s5x系列单片机机械周期=晶振周期÷12,部分51单片机是6周期甚至4周期的djnz是非零减一转跳命令,要两个机械周期
DEL1: MOV R6, #0F0H
DEL2: MOV R7, #0F0H
DJNZ R7, $;这里$是转跳到本命令,pc指针不变,就是原地转移
DJNZ R6, DEL2
DJNZ R5, DEL1
RET;返回,执行acall会把pc指针压到堆栈,然后转跳到子程序,而执行ret则会包pc指针推出来,就是跳回原程序继续执行,在不同功能的子程序转换工作寄存器组是个
;延时30S子程序
DEL30S: MOV R4, #0FH
D1: MOV R5, #10H
D2: MOV R6, #0F0H
D3: MOV R7, #0F0H
DJNZ R7, $
DJNZ R6, D3
DJNZ R5, D2
DJNZ R4, D1
RET
END
用户1353393 2008-3-14 16:41
用户1315059 2008-1-27 16:36
不错 继续继续 最好把每句都翻译下 这样方便初学者学习哦