再次学习流水灯,六种花 {MOD},请高手指导

2020-02-09 09:22发布

#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
//函数申明
void delay1(uint x);
void  timer_init();
void interrupt time0();
uchar  counter,counter1,time_ok,time_1s,mode;
//=======================================//=============
void  main()                             //主程序
{
    uchar YiWei,temp,OutBuf;  
    YiWei = 0xC0;             //*赋值为1*//
    OutBuf = 0x00;
    TRISC=0X00;              //C口定义为输出
    PORTC=0X3F;              //点亮RCO口LED,为共阳
    timer_init();
    while(1)
     {
       if(time_1s)
         {
         time_1s=0;
            mode++;
            switch(mode)
            {
                  case  1:
                          PORTC=0X3F;YiWei=0XC0;break;
                  case  2:
                          PORTC=0XFC;YiWei=0X03;OutBuf=0;break;
                  case  3:
                          PORTC=0XFE;YiWei=0X01;OutBuf=0;break;
               case  4:
                          PORTC=0X3F;YiWei=0XC0;OutBuf=0;break;
               case  5:
                          PORTC=0X7F;YiWei=0X80;OutBuf=0;break;
                  case  6:
                          PORTC=0XFC;YiWei=0X03;mode=0;break;
             }
            
         }
       if(time_ok)
         {
            time_ok=0;
            if(mode==1)
            {       
             //两灯反追
            if(PORTC==0XFC)
              {
                YiWei=0XC0;
                PORTC=0X3F;
                delay1(500);
              }
              YiWei>>=1;
              PORTC = ~YiWei;  //
          }
           if(mode==0)
            {
               //两灯顺追
           if(PORTC==0X3F)
              {
             YiWei=0X03;
             PORTC=0XFC;
               delay1(500);
            }
           YiWei<<=1;
           PORTC = ~YiWei;  
            }
          if(mode==2)
           {
           //两灯叠加顺追
          if(OutBuf==0xFC)//循环一周后清零
             {
            PORTC=0XFC;
               YiWei = 0x03;      
            OutBuf = 0x00;
             }
             YiWei<<=1;
             temp=YiWei<<1;
            if((OutBuf|temp)==OutBuf)
          {
            OutBuf>>=1;
               OutBuf>>=1;
            OutBuf += 0xC0;
            YiWei = 0x03;  
          }  
            PORTC = ~(OutBuf|YiWei);  
           }
          if(mode==3)
           {
             if(OutBuf==0xFE)//循环一周后清零
              {
             PORTC=0XFE;
             YiWei = 0x01;      
               OutBuf = 0x00;
              }
           YiWei<<=1;
             if((OutBuf|YiWei)==OutBuf)
              {
              OutBuf>>=1;
              OutBuf += 0x80;
              YiWei = 0x01;  
              }  
           PORTC = ~(OutBuf + YiWei);         
         }
          if(mode==4)
        {
          //两灯叠加反追
          if(OutBuf==0x3f)//循环一周后清零
              {
             PORTC=0X3f;
             YiWei = 0xc0;      
                OutBuf = 0x00;
            }
           YiWei>>=1;
              temp=YiWei>>1;
            if((OutBuf|temp)==OutBuf)
           {
             OutBuf<<=1;
                OutBuf<<=1;
             OutBuf += 0x03;
             YiWei = 0xc0;  
           }  
          PORTC = ~(OutBuf|YiWei);  
            }
          if(mode==5)
           {
              //叠加反追
           if(OutBuf==0x7f)//循环一周后清零
            {
              PORTC=0X7f;
              YiWei = 0x80;      
              OutBuf = 0x00;
            }
            YiWei>>=1;
            if((OutBuf|YiWei)==OutBuf)
              {
                OutBuf<<=1;
                OutBuf += 0x01;
                YiWei = 0x80;  
              }  
               PORTC = ~(OutBuf + YiWei);         
        }
        }
    }
}
//=======================================//=============
//TIMR初始化函数
void  timer_init()
{
    //TIMER0初始化
    OPTION=0x87;//1000 0111          //预分频给TM0,分频比1/8
    TMR0=60;                              //(256-60)X256=50mS
    GIE=1;                           //开放全局中断
    T0IE=1;                         //开放TM0中断
    //TIMER1初始化
    T1CON=0x31;//0011 0001          //预分频比为1/8,启动TMR1
    PEIE=1;                         //使能外设中断
    TMR1IE=1;                       //使能TMR1中断
    TMR1H=(65536-62500)/256;        //TMR1付初值
    TMR1L=(65536-62500)%256;        // 62500X8=500mS
    GIE=1;   
}
//=======================================//=============
//中断服务与汇编一样要判定那种类型中断
// Timer 0 比较匹配中断服务
void interrupt time0()
{
    if(T0IE&&T0IF)
      {T0IF=0;                            //TM0中断信号清零
        TMR0=60;
        //display();                        // 调用LED扫描显示
        if (++counter >=10)              //counter加一,并判断是否大于5
        {
                counter = 0;
                 time_ok = 1;       // 10ms到
        }
       }       
// Timer 1 比较匹配中断服务
    if(TMR1IE&&TMR1IF)
    {
    TMR1IF=0;                            //TM0中断信号清零
        TMR1H=(65536-62500)/256;        //TMR1付初值
    TMR1L=(65536-62500)%256;        //  
        if (++counter1 >=60)              //counter加一,并判断是否大于5
        {
                counter1 = 0;
                   time_1s=1;                   //
        }
    }       
}
//=======================================//=============
//延时程序
void delay1(uint x)                      //延时时间为(X)ms
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=75;b>0;b--);               //延时数较准确固定多26us
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。