×

8种LED闪烁灯控制

发布时间:2020-05-19 发布时间:
|

基于AVR单片机ATmega16的8种LED闪烁灯控制转载标签: 
 
 
#include
#include
#define uchar unsigned char
#define uint unsigned int
 
void Delay()                        //延时函数
    {
    uchar a, b, c;
    for (a = 1; a; a++)
        for (b = 1; b; b++)
            for (c = 0; c<10; c++)  //循环次数=255*255*10
          ;
    }
 
void DelayMs(uint i)                //1ms延时,准确性较Delay();高
   {
    while(i--)
    {                        
     uint j;              
        for(j=1;j<=613;j++) 
      ;             
    }                     
   }
 
void LED_on()                            //打开所有LED
    {
 PORTB =0X00;
 Delay();
 }
 
void LED_off()                           //关闭所有LED
    {
 PORTB = 0xFF;
 Delay();
 }

void LED_01(int i)                  //LED亮灭控制
    {
    PORTB = ~BIT(i);                //输出低电平
    DelayMs(100);                   //调用延时程序
    }
 
void LED_02(int i)                  //间隔点亮
    {
 PORTB=~(BIT(i)|BIT(i-2));
 DelayMs(100);
 }
 
void LED_03(int i)                 //相临点亮
    {
 PORTB=~(BIT(i)|BIT(i-1));      //~后内容需用括号括起来
 DelayMs(100);
 }
 
void LED_04(int i)                 //发散聚集点亮
    {
 switch(i)
  {
  case 0:PORTB=0xE7;DelayMs(100);break;    //延时100ms
  case 1:PORTB=0xDB;DelayMs(100);break;
  case 2:PORTB=0xBD;DelayMs(100);break;
  case 3:PORTB=0x7E;DelayMs(100);break;
  default:break;
  }
 }
 
void LED_05(int i)                 //00,0F,F0,FF方式显示
    {
 switch(i)
  {
  case 0:PORTB=0x00;DelayMs(100);break;    //延时100ms
  case 1:PORTB=0x0F;DelayMs(100);break;
  case 2:PORTB=0xF0;DelayMs(100);break;
  case 3:PORTB=0xFF;DelayMs(100);break;
  default:break;
  }
 }
 
void LED_06(int i)
   {
   switch(i)
    {
 case 0:PORTB=0XAA;DelayMs(100);break;
 case 1:PORTB=0X55;DelayMs(100);break;
 }
   }

void main()
    {
    int l,m,n,o,p,q,r,s,i,j;
 DDRA =0X00;                         //端口上拉输入
 PORTA=0XFF;
    DDRB =0xFF;                         //端口输出
    PORTB="0xFF";                         //输出高电平,LED熄灭
 DDRC =0X00;
 PORTC=0XFF;
 DDRD =0X00;
 PORTD=0XFF;

    for (r=0;r<5;r++)
     {
    for(l=0;l<5;l++)               //模式1:顺序点亮
          {
       for (i = 0; i < 8; i++)     //顺序单个点亮LED
                LED_01(i);
             for (i = 6; i > 0; i--)     //逆序单个点亮LED
                LED_01(i);
    }
    LED_off();
  
    for(m=0;m<5;m++)               //模式2:顺序单个间隔点亮
    {
             for (i = 0; i < 8; i += 2)  //顺序间隔点亮LED
              LED_01(i);
             for (i = 7; i > 0; i -= 2)  //逆序间隔点亮LED
              LED_01(i);
    }
    LED_off();
   
    for(n=0;n<5;n++)               //模式3:间隔点亮
    {
       for (i = 2; i < 8; i++)     //间隔顺序同时点亮
       LED_02(i);
    for (i = 6; i > 2; i--)  //间隔逆序同时点亮
       LED_02(i);
    }
    LED_off();
  
    for(o=0;o<5;o++)               //模式4:相临点亮
    {
       for (i = 1; i < 8; i++)     //相临顺序同时点亮
       LED_03(i);
    for (i = 6; i > 1; i--)  //相临逆序同时点亮
       LED_03(i);
    }
    LED_off();  
    for(p=0;p<5;p++)               //模式5:发散聚集点亮
    {
       for(i=0;i<4;i++)            //发散点亮
      LED_04(i);
       for(i=2;i>0;i--)            //聚集点亮
      LED_04(i);   
    }
    LED_off();

    for(q=0;q<5;q++)               //模式6:四四点亮
    {
       for(i=0;i<4;i++)            //四四顺序点亮
      LED_05(i);
       for(i=2;i>0;i--)            //四四逆序点亮
      LED_05(i);   
    }
    LED_off();
  
    for(s=0;s<5;s++)               //模式7:四四点亮
    {
       for(i=0;i<2;i++)            //四四顺序点亮
      LED_06(i);  
    }
    LED_off();
  
    for(j=0;j<10;j++)              //模式8:全部点亮熄灭
    {
      LED_on();
   LED_off();
    }
     }
  //MCUCR=0x40;          //空闲模式,CPU占用100%
  //MCUCR=0x50;          //ADC噪声抑制模式,CPU占用100%
  //MCUCR=0x60;          //掉电模式,CPU占用80%
  //MCUCR=0x70;          //省电模式,CPU占用4%
  //MCUCR=0xE0;          //Standby模式,CPU占用80%
  MCUCR=0xF0;            //扩展Standby模式,CPU占用4%
  asm("sleep");          //CPU休眠指令
    }



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
什么是晶圆的良率呢?如何把控?