unsigned char aucLED_SELECT_01[9]=
{0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,};
//方式0,方式1燈開關數組。
unsigned char aucLED_SELECT_23[5]=
{0xFF,0x7E,0xBD,0xDB,0xE7};
//方式2,方式3燈開關數組。
unsigned char _i=0; //數據選擇計數。
unsigned char uc_Mode=0; //模式選擇,默認為模式0。
unsigned char uc_Count=1; //定時器中斷計數。
unsigned char uc_Delay=1; //延遲計數,通過改變改數值改變燈狀態延遲時間。
//燈延遲時間=uc_Dalay*定時器溢出時間。
void main()
{
TMOD=0x01; //定時器0模式一。
TH0=0x3C;
TL0=0xB0; //溢出時間:50ms。
TR0=1; //定時器0開啟。
IT0=1; //外部中斷0下降沿觸發。
IT1=1; //外部中斷1下降沿觸發。
EX0=1; //外部中斷0開。
EX1=1; //外部中斷1開。
ET0=1; //定時器0中斷開。
EA=1; //總中斷開。
while(1);
}
//*********************************************************************************************************
//* *
//* ************************************定時器0中斷函數************************************ *
//* *
//*<函數功能>:當定時器0溢出時執行此函數,首先執行2個判斷: *
//* (1)if判斷是否改變燈的狀態,可用于改變延時時間; *
//* (2)switch判斷閃爍模式,根據不同模式對燈進行不同的通斷。 *
//* 最后對定時器TH0,TL0重新賦值,溢出時間為50ms。 *
//* *
//*********************************************************************************************************
void vTimer0(void) interrupt 1
{
if(uc_Count%uc_Delay==0) //通過此判斷語句來改變延時。,例如:當uc_Delay=6時,定時器
{ //溢出5次時燈狀態改變1次。同時uc_Count重新賦值1.否則,uc_Count++
uc_Count=1; //等待下一次溢出。因此可以改變延時。
switch(uc_Mode)
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式0,燈從上往下依次點亮,不斷循環。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 0:
if(_i>=8)
_i=0;
else _i++;
LEDPort=aucLED_SELECT_01[_i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式1,燈從下往上依次點亮,不斷循環。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 1:
if(i<=0)
i=8;
else _i--;
LEDPort=aucLED_SELECT_01[_i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式2,燈從兩邊往中間依次點亮,不斷循環。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 2:
if(_i>=4)
_i=0;
else _i++;
LEDPort=aucLED_SELECT_23[_i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式3,燈從中間往兩邊依次點亮,不斷循環。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 3:
if(_i<=0)
_i=4;
else _i--;
LEDPort=aucLED_SELECT_23[_i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<所有等以一定時間間隔同時閃爍。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 4:
if(LEDPort==0xFF)
LEDPort=0x00;
else LEDPort=0xFF;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<其他>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
default:
break;
}
}
else uc_Count++;
TH0=0x3C; //重新給定時器賦值。
TL0=0xB0; //定時時間:50ms。
}
//*********************************************************************************************************
//* *
//* ************************************外部中斷0中斷函數************************************ *
//* *
//* <函數功能>:當外部中斷0產生下降沿信號時執行此函數,將閃燈模式從模式0到4循環切換。 *
//* *
//*********************************************************************************************************
void vModeChange(void) interrupt 0
{
if(uc_Mode>=4)
uc_Mode=0;
else uc_Mode++;
}
//*********************************************************************************************************
//* *
//* ************************************外部中斷1中斷函數************************************ *
//* *
//*<函數功能>:當外部中斷1產生下降沿信號時執行此函數,將閃燈時間從50ms,250ms,500ms,750ms循環切換。 *
//* *
//*********************************************************************************************************
void vDelayChange(void) interrupt 2
{
if(uc_Delay>=16)
uc_Delay=1;
else uc_Delay+=5;
}