jamasliu 发表于 2013-12-23 22:32:18

流水灯控制程序

#include <reg51.h>
#include<intrins.h>
void delay_ms(unsigned int x)   //误差 0us
{
    unsigned char a,b,c;
    for(c=x;c>0;c--)
      for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}
void main(void)
{
ET0=1;//外部中断0、1下降沿中断
ET1=1;
EX0=1;
EX1=1;
EA=1;
while(1)
      P0=0x00;// P1的8个LED,高电平亮
}

void int0_int()interrupt 0
{
        unsigned char i ,j, tmp=0x01;
        for(i=3; i>0; i--)
                   for(j=8; j>0; j--)
                   {
                           P0=tmp;
                           delay_ms(500); //500ms闪烁
                        tmp = _crol_(tmp,1);
                }       
}
void int1_int()interrupt 2
{
        unsigned char i ,j, tmp=0x80;
        for(i=3; i>0; i--)
                   for(j=8; j>0; j--)
                   {
                           P0=tmp;
                           delay_ms(500); //500ms闪烁
                        tmp = _cror_(tmp,1);
                }       
}
请大家帮忙指导,我想点击中断0时,流水灯不断的工作,如果点击中断2,流水能马上转换,也要不断的工作。如果用一个中断控制多个流水灯状态,需要怎么修改程序,谢谢大家指点。。

jamasliu 发表于 2013-12-24 23:04:03

修改了代码,为什么每次点击只运行一次就停了,我想如果点击一次流水灯不停的闪动,如果我再点击一次又换一个方式不停的闪动,请大家指点,谢谢!!!!

#include <reg51.h>
#include<intrins.h>

unsigned char tmod=0;
unsigned char i ,j,tmp;

void delay_1ms(void)
{
unsigned int i;
for (i=1;i<(unsigned int)(1144-2);i++);
}


void delay_ms(unsigned int n)
{
unsigned int i=0;
while(i<n)
{
delay_1ms();
i++;
}
}


void main(void)
{
ET0=1;
ET1=1;
EX0=1;
EX1=1;
EA=1;
while(1)
      P0=0x00;
}

void int0(void)interrupt 0
{

                switch(tmod)
                {
                case 0:
                                        tmp=0x01;
                                        for(j=8; j>0; j--)
                                        {
                                        P0=~tmp;
                                        delay_ms(50);
                                        tmp =tmp<<1;
                                        }       
                                        break;
                case 1:
                                        tmp=0x80;
                                        for(j=8; j>0; j--)
                                        {
                                        P0=~tmp;
                                        delay_ms(50);
                                        tmp = tmp>>1;
                                        }       
                                        break;
                case 2:
                           break;
               
                }
                tmod+=1;
                if(tmod==2)tmod=0;

        }

xiakang 发表于 2013-12-25 01:20:59

点击一次,中断函数运行一次,运行完了中断函数后就执行main函数while(1)里代码了。

jamasliu 发表于 2013-12-25 07:38:56

要点击一下不停地闪动那样怎麼修改代碼请大家指点,谢谢。

jamasliu 发表于 2013-12-26 21:46:44

最新修改代码,为什么在中断内切换流水灯显示方式,要一直按住按键才能转换,请大家详解指导,谢谢。。




#include <reg51.h>

unsigned char temp;
unsigned char Tmod=0,i = 0;

void delay_1ms(void)
{
unsigned int i;
for (i=1;i<(unsigned int)(1144-2);i++);
}

void delay_ms(unsigned int n)
{
unsigned int i=0;
while(i<n)
{
delay_1ms();
i++;
}
}

void martix(unsigned int n)
{
        switch(n)
        {
                case 0:
                                                temp= 0x80;
                                                for(i = 0; i < 8; i++)
                                                        {
                                                                P0=~temp;
                                                                delay_ms(50);
                                                                temp >>= 1;
                                                       }
                                                        break;
                        case 1:
                                                temp= 0x08;
                                                for(i = 0; i < 8; i++)
                                                        {
                                                                P0=~temp;
                                                                delay_ms(50);
                                                                temp <<= 1;
                                                       }
                                                        break;
        }
}

void init()
{
                                temp= 0x01;
                        for(i = 0; i < 8; i++)
                                {
                                        P0=~temp;
                                        delay_ms(50);
                                        temp<<= 1;
                          }
}

void main(void)
{
IT0=1;
EX0=1;
EA=1;
P0 = 0xff;
while(1)
        {
   init();
}
}

void int0(void)interrupt 0
{
        EA=0;
        delay_ms(10);
        while(1)
        {
                martix(Tmod);
                if (!INT0)
                        {
                                delay_ms(50);
                                Tmod+=1;
                                if(Tmod==2)Tmod=0;
                        }
        }

}

江湖笑 发表于 2013-12-27 14:42:12

看帖要顶帖{:victory:}{:lol:}
页: [1]
查看完整版本: 流水灯控制程序