C语言菜鸟,求思路,追逐式流水灯

2020-02-09 09:21发布

刚学C语言,写了一个追逐式流水灯;自我感觉太繁琐,请高手指点一下,有没有更简单的。
HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode)  V9.80编译通过
#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
//函数申明
void delay1(uint x);
//=======================================//=============
void  main()                             //主程序
{
       uchar x,y,z;                 //定义变量
       x=7;
       TRISC=0X00;              //C口定义为输出
       PORTC=0Xfe;              //点亮RCO口LED,为共阳
       while(1)
        {
                PORTC&=0Xfe;
                delay1(200);
        if(x==0)
          {
                   PORTC=0Xfe;
                       x=7;
                  }
        if(x==1)
          {
                for(z=x;z>0;z--)
                   {
                  PORTC=PORTC<<1;      //显示左移一位
                    PORTC&=0X03;
                 PORTC|=0X01;
                   delay1(200);
                }
              x--;
          }
       if(x==2)
          {
             for(z=x;z>0;z--)
                 {
                 PORTC=PORTC<<1;      //显示左移一位
                    PORTC&=0X07;
                 PORTC|=0X01;
                delay1(200);
              }
               x--;
        }
       if(x==3)
          {
            for(z=x;z>0;z--)
                 {
                 PORTC=PORTC<<1;      //显示左移一位
                    PORTC&=0X0f;
                 PORTC|=0X01;
                 delay1(200);
              }
               x--;
        }
       if(x==4)
          {
            for(z=x;z>0;z--)
                 {
                    PORTC=PORTC<<1;
                 PORTC|=0X01;
                    PORTC&=0X1f;
                 delay1(200);
               }
              x--;
           }
      if(x==5)
          {
           for(z=x;z>0;z--)
                 {
                  PORTC=PORTC<<1;      //显示左移一位
                    PORTC&=0X3f;
                  PORTC|=0X01;
                 delay1(200);
               }
               x--;
          }
      if(x==6)
          {
           for(z=x;z>0;z--)
                 {
                 PORTC=PORTC<<1;      //显示左移一位
                    PORTC&=0X7f;
                 PORTC|=0X01;
                delay1(200);
              }
               x--;
        }
       if(x==7)
          {
           for(z=x;z>0;z--)
                 {
                  PORTC=PORTC<<1;      //显示左移一位
                  PORTC|=0X01;
                  delay1(200);
              }
               x--;
        }        
       }
}      
//=======================================//=============
//延时程序
void delay1(uint x)                      //延时时间为(X)ms
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=75;b>0;b--);               //延时数较准确固定多26us
}
//======================================================================
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
mon51
1楼-- · 2020-02-10 03:44
确实繁琐!
amity
2楼-- · 2020-02-10 06:01
 精彩回答 2  元偷偷看……
amity
3楼-- · 2020-02-10 08:00
回复【6楼】wsd_cup
-----------------------------------------------------------------------

不过还有一个问题,最高位始终不会亮,不知道有没有解决办法
amity
4楼-- · 2020-02-10 12:15
回复【6楼】wsd_cup
-----------------------------------------------------------------------

在你的程序基础上改了一下,可以达到我想要的效果了,谢谢。
修改后的程序:
#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
//函数申明
void delay1(uint x);
//=======================================//=============
void  main()                             //主程序
{
        uchar YiWei;
    uchar OutBuf;
    YiWei = 0x01;             //*赋值为1*//
    OutBuf = 0x00;
    TRISC=0X00;              //C口定义为输出
        PORTC=0Xff;              //点亮RCO口LED,为共阳
        while(1)
        {
            if(OutBuf==0xFE)//循环一周后清零 /*判断值改为0XFE*/
            {
                  YiWei = 0x01;      //*赋值为1*//
                  OutBuf = 0x00;
            }
             YiWei<<=1;
            if((OutBuf|YiWei)==OutBuf)
            {
                 OutBuf>>=1;
                 OutBuf += 0x80;
                 YiWei = 0x01;  
            }  
             PORTC = ~(OutBuf + YiWei);  /*取消循环右移*/
             delay1(200);
   }
}

//=======================================//=============
//延时程序
void delay1(uint x)                      //延时时间为(X)ms
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=75;b>0;b--);               //延时数较准确固定多26us
}
wsd_cup
5楼-- · 2020-02-10 12:38
呵呵,大体看了你写的程序,猜测你的意图应该是这样的,也没测试就发上来了。
surf_131
6楼-- · 2020-02-10 18:16
这里给个图,按此思路可以做出双速双向的2灯。需要开2个定时器。

(原文件名:跑马灯方案.JPG)

一周热门 更多>