51单片机流水灯正反转

就是一开始是正转的,按一个按键中断然后反转,在按一个按键中断接着正转
原理图

#include <reg51.h>
#include <intrins.h>
#include "74hc595.h"
#include "delay.h"
unsigned char w;
void delay0_5s();
void delay_t(unsigned char t);
void led();
void reled();
void main()
{
PT0 = 1;
EA = 1;
EX0 = 1;
EX1 = 1;
IT0 = 1;
IT1 = 1;
TMOD = 0x01;
w = 0x01;
led();
}

void led()
{
while(1)
{
P1 = w;
delay_t(2);
w = _crol_(w,1);
}
}

void reled()
{
while(1)
{
P1 = w;
delay_t(2);
w = _cror_(w,1);
}
}

void delay0_5s()
{
unsigned char i;
for(i=0;i<0x0a;i++)
{
TH0=0x3c;
TL0=0xb0;
TR0=1;
while(!TF0);
TF0=0;
}
}

void delay_t(unsigned char t)
{
unsigned char i;
for(i=0;i<t;i++) delay0_5s();
}

void int_0() interrupt 2 //反向点亮LED
{
P1=0x00;
delay0_5s();
P1=0xff;
delay0_5s();
reled();
}

void int_1() interrupt 0 //正向点亮LED
{
P1=0x00;
delay0_5s();
P1=0xff;
delay0_5s();
led();
}
为什么我的程序达不成这个目的····,求思路和查错····

第1个回答  推荐于2016-12-01
#include <reg51.h>
#include <intrins.h>
#include "74hc595.h"
#include "delay.h"
unsigned char w,flag=0;
void delay0_5s();
void delay_t(unsigned char t);
void led();
void main()
{
PT0 = 1;
EA = 1;
EX0 = 1;
EX1 = 1;
IT0 = 1;
IT1 = 1;
TMOD = 0x01;
w = 0x01;
led();
}
void led()
{
while(1)
{
P1 = w;
delay_t(2);
if(flag==0)w = _crol_(w,1);
if(flag==1)w = _cror_(w,1);
}
}
void delay0_5s()
{
unsigned char i;
for(i=0;i<0x0a;i++)
{
TH0=0x3c;
TL0=0xb0;
TR0=1;
while(!TF0);
TF0=0;
}
}
void delay_t(unsigned char t)
{
unsigned char i;
for(i=0;i<t;i++) delay0_5s();
}
void int_0() interrupt 2 //反向点亮LED
{
flag=1;
}
void int_1() interrupt 0 //正向点亮LED
{
flag=0;
}本回答被提问者采纳
第2个回答  2013-11-24
你的 TR0=1也就是启动定时器的语句把它写到主程序里面去吧,反正他的位置不对追问

这个是定时器,但我需要解决的是中断···我要让一个中断断掉另一个中断

第3个回答  2019-07-28
for(i=1;i=10000;i++);这条语句我就很差异,根据c定义,第一个分号是初值,第二个是循环条件,最后分号为循环执行语句。显然
for(i=1;<10000;i++);这样才对。
再说
j=7;
p0=~(1<
typedef
unsigned
char
uint8;
typedef
unsigned
int
uint16;
sbit
led=p0^0;
sbit
enled=p1^4;
sbit
addr0=p1^0;
sbit
addr1=p1^1;
sbit
addr2=p1^2;
sbit
addr3=p1^3;
main()
{
uint8
j;
uint16
i;
enled=0;
addr0=0;addr1=1;addr2=1;addr3=1;
while(1)
{
if(j==0)j=1;
else
j=j<<1;
p0=j;
for(i=1;i<10000;i++);
}
}
这是单向闪烁的,如果想左右依次来回闪的话,可以参照我这个做下调整。问题说的很透,望加分。