#include "REG52.H"
#define DataGPIO P1//顯示端口
#define FLOWTIME 100//修改此值,改變流水速度
sbit KEY = P2^0;//按鍵
bit Start_flag =0;//流水燈控制
bit Flow_flag =0;//流水
unsigned char Cnt =0;//流水燈計數器
unsigned char KEY_Cnt=0;//按鍵識別計數器
void Init_Timer0()//定時器0初始化
{
TMOD |= 0x01;//16位計數器
TH0 = 0xEC;
TL0 = 0x77;//12M,12T,5000us=5ms
TCON |= 0x10;//定時器0啟動
TCON |= 0x01;//定時器0中斷允許
IE |= 0x80;//總中斷開
}
void Flow_Cont()//流水計數
{
if(++Cnt>FLOWTIME)//500ms
{
Cnt=0;
Flow_flag =1;//流水控制位
}
}
void KEY_Scan()//鍵掃描
{
if(!KEY)//鍵被按下
{
if(KEY_Cnt!=0)//鍵計數器不為0,已經消抖
{
KEY_Cnt = 0;//清計數器
Start_flag =~Start_flag;//流水顯示控制
}
else //鍵計數器為0,沒有消抖
{
KEY_Cnt++;//鍵計數器+1,再掃描壹次。
}
}
}
//
void Timer0_ISR() interrupt 1 //定時器0中斷響應
{
TCON &= ~0x20;//定時器0清溢出
TH0 = 0x3C;
TL0 = 0xAF;//12M,12T,50000us=50ms
Flow_Cont();//流水計數
KEY_Scan();//鍵掃描
}
void DispFlashLED()//流水燈
{
if(Flow_flag)
{
Flow_flag =0;//
switch(DispBit)
{
case 0; DataGPIO = 0xfe; break;
case 0; DataGPIO = 0xfd; break;
case 0; DataGPIO = 0xfb; break;
case 0; DataGPIO = 0xf7; break;
case 0; DataGPIO = 0xef; break;
case 0; DataGPIO = 0xdf; break;
case 0; DataGPIO = 0xbf; break;
case 0; DataGPIO = 0x7f; break;
}
DispBit++;
}
}
int main()
{
Init_Timer0();//定時器0初始化
while(1)
{
if(Start_flag)//如果啟動流水燈
{
DispFlashLED();//流水燈
}
else
{
DataGPIO = 0xff;//不顯示
}
}
}