标题: 单片机流水灯程序如何加个开关换向? [打印本页]

作者: zephry    时间: 2022-10-11 20:24
标题: 单片机流水灯程序如何加个开关换向?
想要用p1的开关来控制流水灯的方向改变,求解决思路

单片机源程序如下:
#include<reg52.h>   //头文件
#include<intrins.h>
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
void delayms(uchar ms) //延时子函数
{
   uchar i;
   while(ms--)
   for(i=0;i<123;i++);
}
void main()//主函数
{
P0=0xFE;
   while(1)
    {
      delayms(500);//延时100ms
      P0=(P0<<1)|(P0>>7);//循环移位
    }
}  

1.png (140.4 KB, 下载次数: 16)

1.png

作者: zephry    时间: 2022-10-11 22:45
求大伙指点一下
作者: 188610329    时间: 2022-10-11 23:07
在你的代码基础上改的。

#include<reg52.h>   //头文件
#include<intrins.h>
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义

sbit Key = P1^0;
bit        Press,Forward;

void delayms(uchar ms) //延时子函数
{
   uchar i;
   while(ms--)
   {
           if(Key == 0) Press = 1;        //检查Key
        for(i=0;i<123;i++);        //酌情减小
   }
}
void main()//主函数
{
P0=0xFE;
   while(1)
    {
      delayms(500);//延时100ms
      if(Press)
      {
              Press = 0;
        Forward = !Forward;
      }
      if(Forward)      P0=(P0<<7)(P0>>1);//循环移位
      else      P0=(P0<<1)(P0>>7);//循环移位
    }
}


作者: zephry    时间: 2022-10-12 08:10
188610329 发表于 2022-10-11 23:07
在你的代码基础上改的。

这连原来的循环都没有了,p1.0的开关也没用上
作者: zephry    时间: 2022-10-12 08:20
188610329 发表于 2022-10-11 23:07
在你的代码基础上改的。

对不起是我的问题,代码是正确的,感谢指导
作者: zhxiufan    时间: 2022-10-12 08:41
#include<reg52.h>   //头文件
#include<intrins.h>
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义

sbit Key = P1^0;
bit  Forward;

void delayms(uchar ms) //延时子函数
{
   uchar i;
   while(ms--)
   {
        for(i=0;i<123;i++);        //酌情减小
   }
}
void main()//主函数
{
P0=0xFE;
   while(1)
    {
      delayms(500);//延时100ms
      if(Key==0)
      {
        while(Key==0);
        Forward = !Forward;
      }
      if(Forward){P0=(P0<<1)|0x01;if(P0==0xff)P0=0xfe;}
      else{P0=(P0>>1)|0x80;if(P0==0xff)P0=0x7f;}
    }
}
作者: yzwzfyz    时间: 2022-10-12 09:04
1、没有换相这一说!也没有流水这一说!!这有N个灯从一个显示状态【A】,切换成另一个显示状态【B】而矣!!!
【A】=第3个灯亮,【B】=第4个灯亮,于是就认为是向右了。
【A】=第3个灯亮,【B】=第2个灯亮,于是就认为是向左了。
2、任意给个信号(如开关),收到信号后,修改一个[【A】【B】的状态就可以达成,你希望的任何状态形式。
作者: zephry    时间: 2022-10-12 10:23
zhxiufan 发表于 2022-10-12 08:41
#include   //头文件
#include
#define uchar unsigned char//宏定义

这个优化了上面的,把key从延时函数里移到了主函数里,感谢大佬
作者: 188610329    时间: 2022-10-12 12:02
zephry 发表于 2022-10-12 10:23
这个优化了上面的,把key从延时函数里移到了主函数里,感谢大佬

到底是不是优化,当你多按几次按键,或者,你把  delayms(uchar ms)   这个 uchar  修正成 uint  
你delayms(500); 这个 500 正确传递进去了(你现在传得其实是244), 你就明白 为什么  按键判断要写在  delay 函数里了。
作者: 小黄888    时间: 2022-10-12 13:23
#include <REGX51.H>
unsigned char k=0;
void delay(unsigned int num)
{
         unsigned int i,j;
         for(i=0;i<num;i++)
         for(j=0;j<120;j++)
        ;
}
void main()
{
         unsigned char i,j;  
       
          IT0=1; //ÅäÖÃ′¥·¢·½ê½£¬Ï½μÑØ′¥·¢
          EX0=1;  //ÖD¶ÏÔêDí
          EA=1;  //×ü¿a1Ø
          PX0=0;  //ÖD¶ÏóÅÏè¼¶£¬Ä¬èÏóÅÏè¼¶¿éòÔê¡
          while(1)
                {
                if(k==0)
                        {
                                j=0xfe;
                                for(i=0;i<8;i++) //¶¨òåiÎa0~8μÄìõ¼têy£¬jÎaLED1μ½8μÄ
                                 {
                                        P1=j;
                                        j=(j<<1)|0x01;
                                        delay(300);
                                 }
                  }                       
                        else
                        {
                                        j=0x7f;
                                        for(i=8;i>0;i--)
                                 {
                                        P1=j;
                                        j=(j>>1)|0x80;
                                        delay(300);
                                 }
                        }
                }
}

void waib0() interrupt 0  //°′ò»ÏÂè¡·′
{
        k=~k;
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1