流水灯控制程序

2020-01-25 15:23发布

#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,流水能马上转换,也要不断的工作。如果用一个中断控制多个流水灯状态,需要怎么修改程序,谢谢大家指点。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
jamasliu
1楼-- · 2020-01-25 18:15
修改了代码,为什么每次点击只运行一次就停了,我想如果点击一次流水灯不停的闪动,如果我再点击一次又换一个方式不停的闪动,请大家指点,谢谢!!!!

#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
2楼-- · 2020-01-25 23:44
点击一次,中断函数运行一次,运行完了中断函数后就执行main函数while(1)里代码了。
jamasliu
3楼-- · 2020-01-26 02:17
要点击一下不停地闪动那样怎麼修改代碼请大家指点,谢谢。
jamasliu
4楼-- · 2020-01-26 03:33
最新修改代码,为什么在中断内切换流水灯显示方式,要一直按住按键才能转换,请大家详解指导,谢谢。。




  1. #include <reg51.h>

  2. unsigned char temp;
  3. unsigned char Tmod=0,i = 0;

  4. void delay_1ms(void)
  5. {
  6. unsigned int i;
  7. for (i=1;i<(unsigned int)(1144-2);i++);
  8. }

  9. void delay_ms(unsigned int n)
  10. {
  11. unsigned int i=0;
  12. while(i<n)
  13. {
  14.   delay_1ms();
  15.   i++;
  16. }
  17. }

  18. void martix(unsigned int n)
  19. {
  20.         switch(n)
  21.         {
  22.                 case 0:
  23.                                                 temp= 0x80;
  24.                                                 for(i = 0; i < 8; i++)
  25.                                                         {
  26.                                                                 P0=~temp;
  27.                                                                 delay_ms(50);
  28.                                                                 temp >>= 1;
  29.                                                          }
  30.                                                         break;
  31.                         case 1:
  32.                                                 temp= 0x08;
  33.                                                 for(i = 0; i < 8; i++)
  34.                                                         {
  35.                                                                 P0=~temp;
  36.                                                                 delay_ms(50);
  37.                                                                 temp <<= 1;
  38.                                                          }
  39.                                                         break;
  40.         }
  41. }

  42. void init()
  43. {
  44.                                 temp= 0x01;
  45.                         for(i = 0; i < 8; i++)
  46.                                 {
  47.                                         P0=~temp;
  48.                                         delay_ms(50);
  49.                                         temp<<= 1;
  50.                           }
  51. }

  52. void main(void)
  53. {
  54. IT0=1;
  55. EX0=1;
  56. EA=1;
  57. P0 = 0xff;
  58. while(1)
  59.         {
  60.    init();
  61.   }
  62. }

  63. void int0(void)  interrupt 0
  64. {
  65.         EA=0;
  66.         delay_ms(10);
  67.         while(1)
  68.         {
  69.                 martix(Tmod);
  70.                 if (!INT0)
  71.                         {
  72.                                 delay_ms(50);
  73.                                 Tmod+=1;
  74.                                 if(Tmod==2)Tmod=0;
  75.                         }
  76.         }

  77. }
复制代码
江湖笑
5楼-- · 2020-01-26 09:23
 精彩回答 2  元偷偷看……

一周热门 更多>