#include <STC8G.h>
typedef unsigned char u8; //0 to 255
typedef unsigned int u16; //0 to 65535
typedef unsigned long u32; //0 to 4294967295
sbit key1 = P5 ^ 4;
u16 TMR_XX_ACC;
u16 TMR_XX_PRE = 500;
u8 PWM = 1;
u8 index = 0;
u8 MODE = 1;
bit Power_On = 1;
unsigned char dat1[4] = {0xfe, 0xfd, 0xfb, 0xf7};
unsigned char dat2[4] = {0xfc, 0xf9, 0xf3, 0xf6};
unsigned char dat3[4] = {0xf1, 0xf2, 0xf4, 0xf8};
void key_Proc()
{
static u16 Delay_XD = 0; //消抖計數
static u16 Min_T = 25;
static u16 Max_T = 2500;
if(!key1)
{
if(Delay_XD < 0xFFFF)Delay_XD++;
//else Delay_XD = 0; //連按功能
if(Delay_XD == Max_T) //長按
{
// MODE = ++MODE % 3;
++MODE;
if(MODE>3)
MODE=1;
}
}
else //按鍵抬起
{
if(Delay_XD > Min_T && Delay_XD < Max_T) //短按
{
Power_On ^= 1;
}
Delay_XD = 0; //Delay_XD清0
}
}
void delayus(u8 x)
{
while(x--);
}
void main()
{
while (1)
{
if(PWM > 0) {
switch (MODE)
{
case 0:
P3 = 0xff;
break;
case 1:
P3 = dat1[index];
break;
case 2:
P3 = dat2[index];
break;
case 3:
P3 = dat3[index];
break;
}
delayus(PWM);
}
P3 = 0xFF;
delayus(100 - PWM);
key_Proc();
if(++TMR_XX_ACC >= TMR_XX_PRE)
{ TMR_XX_ACC = 0;
if(Power_On)
{
if(PWM < 99) PWM++;
} else {
if(PWM > 0) PWM--;
}
index = ++index % 4;
if(index == 0)
if(Power_On)
{
if(TMR_XX_PRE > 50) //固定到快
{
TMR_XX_PRE -= 50;
}
} else {
if(TMR_XX_PRE < 500) //固定到快
{
TMR_XX_PRE += 50;
}
}
}
}
} |