不用中断一样的实现,而且可以有多少个按键就可以有多少种流水灯方式。你使用的键盘函数直接调用流水灯函数就可以。比如使用独立键盘,if(P11==0) light_water(); 然后:
void light_water()
{
num=1;
for(a=0;a<8;a++)
{
P11=num<<1;
delay(1000); //延时;
keyboard();//执行时又不停扫描键盘函数;
}
}
这样就会有一个LED从右往左移动8次;那么当第一次流水未完时,又调用第二个流水函数light_water1就能中断当前执行的流水函数又去执行第二个流水灯函数了。
KEYR EQU P10//改下端口 忘记 p3口 是低还是高了
KEYL EQU P11
LED EQU P0
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB ET0
SETB EA
MOV A,#0FEH
MOV LED,A
MOV R2,#0
CLR 00H
LOOP:
CLR TR0
LOOPL:
JB KEYL,LOOPR
SETB TR0
RL A
MOV LED,A
JNB 00H,$
CLR 00H
SJMP LOOPL
LOOPR:
JB KEYR,LOOP
SETB TR0
RR A
MOV LED,A
JNB 00H,$
CLR 00H
SJMP LOOPR
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
INC R2
CJNE R2,#20,T0E
MOV R2,#0
SETB 00H
T0E:
RETI
END
低电平点亮
START:MOV R0,#8
MOV R1,#8
SETB C
MOV A,#0FEH
MOV P1,A
S1:RLC A
CALL DELAY
MOV P1,A
DJNZ R0,S1
SETB C
MOV A,#0FEH
MOV P2,A
S2:RLC A
CALL DELAY
MOV P2,A
DJNZ R1,S2
AJMP START
DELAY:MOV R5,#0FFH //改变值变延时时间
LOOP2: MOV R4,#0FFH//改变值变延时时间
LOOP1:DJNZ R4,LOOP1
DJNZ R5,LOOP2
RET
END
单片机的流水灯程序,因为程序就这么写的,决定了流水灯左移7次,再右移7次,结束两个循环后,才能执行下面的while(!key),按键才有效,而在循环过程中,不执行while(!key),所以按键无效。下图画红框内的两个循环。
要想按键随时有效,应该把两个移位函数_cror_,_crol_ 放在主程中,检测key也放在主程中,而不能这样放一个子程序中。
我就写个顺时针亮的程序(详细解释,其它的你就自己写),全手打的哦,用的是汇编,我水平也不怎么高,但是你的问题也是入门级的,还有我假设是高电位亮,一共12灯从P00开始到P14(P14和P00相接)。ORG 4000HSTART:CLR P0CLR P1 /P0 P1清零MOV P0,#80H/1灯亮LCALL DEL/调用延时程序MOV P0,#0C0HLCALL DELMOV P0,#0E0HLCALL DELMOV P0,#0F0HLCALL DELMOV P0,#0F8HLCALL DELMOV P0,#0FCHLCALL DELMOV P0,#0FEHLCALL DELMOV P0,#0FFHLCALL DELSTEB P0/P0口值位,前8灯全亮MOV P1,#080HLCALL DELMOV P1,#0C0HLCALL DELMOV P1,#0E0HLCALL DELMOV P1,#0F0HLCALL DELMOV P1,#0F8HLCALL DELLJMP START/程序跳到开始,进行循环DEL:MOV R7,#200MOV R5,#20DEL1:MOV R6,#123 NOPDEL2:DJNZ R6,DEL2DJNZ R7,DEL1DJNZ R5,DEL1RET/延时程序 共约1SSJMP $起始位4000H 可能不对 要自己找。
以上就是关于51单片机汇编怎么用四个独立按键来控制流水灯的速度全部的内容,包括:51单片机汇编怎么用四个独立按键来控制流水灯的速度、51单片机8个流水灯,一个按键从左到右,一个按键从右到左,用汇编语言、51单片机程序:按键控制流水灯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)