单片机用计时中断控制一个流水灯电路 :每按一次键,发光二极管位置右移一次;每按一次键流水灯的方向改变

汇编程序

已经调试和仿真。用两种语言编写。
程序中加了按键防抖和按键释放判断功能。

/*STC51单片机编程实验第一课:彩灯控制器设计(跑马灯))*/
/*以下为汇编语言*/

key0 bit P2.0
key1 bit P2.1

org 0000h
jmp start
org 0030h

start:
mov P0,#11111110B
Begin:
;****************************************
jb key0,next0
call delay10ms
jb key0,next0
jnb key0,$
mov a,P0
rr a
mov P0,a
next0:
jb key1,Begin
call delay10ms
jb key1,Begin
jnb key1,$
mov a,P0
rl a
mov P0,a
jmp Begin
;****************************************

delay10ms:
mov r6,#200
lpr6: mov r7,#248
djnz r7,$
djnz r6,lpr6
ret

jmp $
end

/*
以下为对应的C语言如下:
*/
#include <AT89X51.H>
sbit key0=P2^0;
sbit key1=P2^1;
void delay10ms();

void main()
{
P0=0xff-1;
while(1)
{
unsigned char temp0,temp1;
if(!key0)
{
delay10ms();
if(!key0)
{
temp0=P0<<1;
temp1=P0>>7;
P0=temp0+temp1;
}
while(!key0);
}
if(!key1)
{
delay10ms();
if(!key1)
{
temp0=P0>>1;
temp1=P0<<7;
P0=temp0+temp1;
}
while(!key1);
}
}
}

void delay10ms()
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
*/

以上程序只是键控灯移,下面是另一个程序:键控改变流水灯方向。
已经仿真调试通过。

key0 bit P2.0
key1 bit P2.1

org 0000h
jmp start
org 0030h

start:
mov P0,#11111110B
st:
jnb key0,next0
jnb key1,next1
jmp st

next0:
call delay10ms
jb key0,st
jnb key0,$
jmp Program01

next1:
call delay10ms
jb key1,st
jnb key1,$
jmp Program02

Program01:
;****************************************
jb key1,nextA
call delay10ms
jb key1,nextA
jnb key1,$
jmp Program02
nextA:
mov a,P0
rr a
mov P0,a
call delay300ms
jmp Program01

Program02:
jb key0,nextB
call delay10ms
jb key0,nextB
jnb key0,$
jmp Program01
nextB:
mov a,P0
rl a
mov P0,a
call delay300ms
jmp Program02
;****************************************

delay300ms:
mov r5,#3
lpr5: call delay10ms
djnz r5,lpr5
ret

delay10ms:
mov r6,#200
lpr6: mov r7,#248
djnz r7,$
djnz r6,lpr6
ret

jmp $
end
温馨提示:答案为网友推荐,仅供参考
相似回答