技术热线: 4007-888-234

LED流水灯

更新时间: 2019-03-26
阅读量:1980

LED流水灯
 

/****************************************************************************
*                   (C) Copyright 2008,单片机初学者
*                          All Rights reserved.
* 项 目 名 称 :  EDN51超级流水灯          
* 本 文件名称 :  ledshow3.c  
* 当 前 版 本 :  V1.0       
* 完 成 日 期 :  2008年4月7日
* 描       述 :
*                 此程序实现,8个灯从第一个开始依次渐亮,直到最后一个。再从最
*   后一个起渐暗,直到第一个。如此循环往复。这才是真正的流水灯
*            
*****************************************************************************/

# include

/****************************定义一下,方便使用*******************************/

# define led P0     //led接在P0口
# define Ton 40        //基准脉宽0.04ms
# define true 1


code unsigned char stop[3] _at_ 0x3B;   //Mon51用,绝对地址引用

unsigned char LEDflag = 0;    //全局变量,最大255,保存T0中断次数
static unsigned char ledon[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

/*****************************************************************************
** 函数名称: timer_init()
** 入口参数:无
** 出口参数:无
** 功能描述: 定时器初始化,T0模式2,8为自动载入
*****************************************************************************/
void timer_init()    //定时器初始化
{
 TMOD = 0x02;    //T0 方式2,8位自动载入
 TH0 =  256 - Ton;   //T0初始值
 TL0 =  256 - Ton;   //重载值
 TR0 = true;     //启动T0
 ET0 = true;     //开T0,T1中断
 EA = true;     //全局中断允许
}

/*****************************************************************************
** 函数名称: time0_int()
** 入口参数:中断1
** 出口参数:无
** 功能描述: 使用工作组3,使用工作组0的时候会出错,根据反汇编分析,应该是中断和led
** show的函数用了同一组寄存器,导致变量被修改,程序运行混乱
*****************************************************************************/
void time0_int() interrupt 1 using 3  //T0中断函数,中断1,使用工作组3
{
 LEDflag++;      //修改LEDflag
}


/*****************************************************************************
** 函数名称: led_show4()
** 入口参数:无
** 出口参数:无
** 功能描述: 声明临时变量i,j,j用来控制数组ledon的下标,点亮不同的led,i用来控制
**    亮度, 实现led亮度渐变
*****************************************************************************/

led_show4()
{
 unsigned char i = 0,j = 0;  // i初始化

 for(j = 0;j<=7;j++){
 i = 0;       // i初始化
 while(i!=255)     // 由暗变亮
 {
  if(LEDflag == 0)  // 点亮
  {
  led = ledon[j];
  }
  if(LEDflag == i)  // 熄灭
  {
  led = 0xff;
  }
  if(LEDflag == 255)    //修改变量
  {
   i++;      
  }
 }
 }

 for(j=7;j>=0;j--){
 i = 0;       // i初始化    
 while(i!=255)     // 由亮变暗
 {
  if(LEDflag == 0)  // 熄灭
  {
  led = 0xff;
  }
  if(LEDflag == i)  // 点亮
  {
  led = ledon[j];
  }
  if(LEDflag == 255)  //修改变量
  {
   i++;
  }
 }  
 }  
}

void main()
{
 timer_init();
 while(1)
 {

  led_show4();

 }
}