流水燈電路(含源程序代碼)
其實現程序:
#i nclude?
?unsigned char RunMode;
//**********************************System Fuction*************************************************
void Delay1ms(unsigned int count)
{
?unsigned int i,j;
?for(i=0;i?for(j=0;j<120;j++);
}
?
unsigned char code LEDDisplayCode[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,?//0~7
????????????????????????? ????0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
void Display(unsigned char Value)
{
?P3 = LEDDisplayCode[Value];
}
?
void LEDFlash(unsigned char Count)
{
?unsigned char i;
?bit Flag;
?for(i = 0; i?{
??Flag = !Flag;
??if(Flag)
???Display(RunMode);
??else
???Display(0x10);
??Delay1ms(100);
?}
?Display(RunMode);
}
unsigned char GetKey(void)
{
?unsigned char KeyTemp,CheckValue,Key = 0x00;
?CheckValue = P2&0x32;
?if(CheckValue==0x32)
??return 0x00;
?
?Delay1ms(10);
?KeyTemp = P2&0x32;
?if(KeyTemp==CheckValue)
??return 0x00
?if(!(CheckValue&0x02))
??Key|=0x01;
?if(!(CheckValue&0x10))
??Key|=0x02;
?if(!(CheckValue&0x20))
??Key|=0x04;
?return Key;
}
unsigned int TimerCount,SystemSpeed,SystemSpeedIndex;
void InitialTimer2(void)
{
?T2CON? = 0x00;???//16 Bit Auto-Reload Mode
??TH2 = RCAP2H = 0xFC;? ?//重裝值,初始值?TL2 = RCAP2L = 0x18;
?ET2=1;?????//定時器 2 中斷允許
?TR2 = 1;????//定時器 2 啟動
?EA=1;
}
unsigned int code SpeedCode[]={?? 1,?? 2,?? 3,?? 5,?? 8,? 10,? 14,? 17,? 20,? 30,
??????????? 40,? 50,? 60,? 70,? 80,? 90, 100, 120, 140, 160,
????????180, 200, 300, 400, 500, 600, 700, 800, 900,1000};//30
void SetSpeed(unsigned char Speed)
{
?SystemSpeed =SpeedCode[Speed];
}
void LEDShow(unsigned int LEDStatus)
{
?P1 = ~(LEDStatus&0x00FF);
?P0 = ~((LEDStatus>>8)&0x00FF);
}
void InitialCPU(void)
{
?RunMode = 0x00;
?TimerCount = 0;
?SystemSpeedIndex = 10;
?P1 = 0x00;
?P0 = 0x00;
?P2 = 0xFF;
?P3 = 0x00;
?Delay1ms(500);
?P1 = 0xFF;
?P0 = 0xFF;
?P2 = 0xFF;
?P3 = 0xFF;
?SetSpeed(SystemSpeedIndex);
?Display(RunMode);
}
//Mode 0
unsigned int LEDIndex = 0;
bit LEDDirection = 1,LEDFlag = 1;
void Mode_0(void)
{
?LEDShow(0x0001}
//Mode 1
void Mode_1(void)
{
?LEDShow(0x8000>>LEDIndex);
?LEDIndex = (LEDIndex+1)%16;
}
//Mode 2
void Mode_2(void)
{
?if(LEDDirection)
??LEDShow(0x0001??LEDShow(0x8000>>LEDIndex);
?if(LEDIndex==15)
??LEDDirection = !LEDDirection;
評論
查看更多