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();
}
}