这个程序应该配有电路图!!!!!
ORG 0000H (表示把下一条指令放在以0000H这个地址开始的的存储空间ROM里,也就是把SJMP START这条指令存在0000H,0001H里,SJMP START长度是2个字节!!在使用中要注意SJMP的转移范围。ORG是伪指令,单片机不运行,它不产生机器码,是为汇编也就是将汇编语言翻译成机器码时服务的。它告诉汇编软件下条指令放在哪个存储空间。汇编程序开头都会有这句,因为单片机复位后,PC=0000H,也就是单片机复位后,程序都是从0000H开始执行的,因为单片机的0003H开始到002BH是中断入口地址,所以我们在0000H~0002H处存储跳转指令,直接跳到主程序。)
SJMP START(程序跳转到START处,SJMP的转移范围是当前PC的+127B~-128B)
ORG 0030H(将START开始的程序依次存在以0030H开始的存储空间里)
START: MOV P3,#0FFH (P3口输出高电平,因为没电路图,所以只能从后面的程序推断:所有的灯灭!!也就是电路图的灯的一端接电源,另一端接P3口。下面的程序以全灭处理(当然也可能所有灯亮,具体看电路图是怎么样的))
MOV A,#0FEH (A置初值,只有最左边或最右边灯亮)
JNB P1.2,LOOP (判断P1.2是否为0,为0跳转到LOOP,推测接按键,按键按下就跳转)
JNB P1.3,LOOP1 (同上)
JNB P1.4,LOOP2 (同上)
JNB P1.5,LOOP3 (同上)
SJMP START (跳转回STRAT,上面这段程序的作用是不停的判断有没有哪个按键按下,有按键按下就跳转去做相应的处理)
LOOP: MOV P3,A (P3=A,因为A刚已经置初值了,所以P3口的灯有一盏亮)
LCALL DEL (调用子程序,用来延迟,让人眼可以看到灯亮)
JNB P1.3,LOOP1 (判断P1.3是否为0,为0跳转到LOOP1)
RL A (左移A)
SJMP LOOP (跳去执行LOOP)
LOOP1: MOV P3,#0FFH (P3口输出高电平,也就是所有灯灭)
上面这段程序的作用是如果P1.2的按键有按下,那就让等向左轮流亮,直到P1.3的按键按下才停止,并且把灯都关了。
JNB P1.4,LOOP2 (判断P1.4是否为0,为0跳转到LOOP2)
JNB P1.5,LOOP3 (判断P1.5是否为0,为0跳转到LOOP3)
SJMP LOOP1 (如果P1.4和1.5都不为0,继续等待直到他们有一个为0,也就是
P1.4和1.5接的按键有被按下)
LOOP2: JNB P1.0,LOOP (判断P1.0按键是否被按下,如果被按下跳往LOOP)
JNB P1.3,LOOP1 ( 同上)
JNB P1.5,LOOP3 ( 同上)
MOV P3,A (P3=A,因为A刚已经置初值了,所以P3口的灯有一盏亮)
LCALL DEL (调用子程序,用来延迟,让人眼可以看到灯亮)
RL A (左移A)
SJMP LOOP2
上面这段程序的作用是如果P1.4的按键有按下,那就让等向左轮流亮,直到P1.3或P1.5的按键按下跳转
LOOP3: JNB P1.2,LOOP
JNB P1.3,LOOP1
JNB P1.4,LOOP2
MOV P3,A
LCALL DEL
RR A
SJMP LOOP3
上面这段程序的作用是如果P1.5的按键有按下,那就让等向右轮流亮,直到P1.2,P1.3或P1.4的按键按下跳转
DEL: MOV R5,#02H
DEL1: MOV R6,#0F0H
DEL2: MOV R7,#0F0H
DEL3: DJNZ R7, DEL3
DJNZ R6, DEL2
DJNZ R5, DEL1
上面这段是延时程序(((15*16*2+3)*15*16+3)*2+1)机器周期
RET (延迟程序返回)
END (告诉汇编软件,程序到此结束,同ORG一样,单片机不执行这句)
有错请指正!!!!
温馨提示:答案为网友推荐,仅供参考