实现基础流转灯和手动流转灯两种模式的切换,按键KEY1在基础模式下用于改变间隔时间,在手动模式下用于控制颜色变化
#include<STC8h.h>
#include<intrins.h>
#define KEY1 P32
#define KEY2 P33
bit Mod_flag=0; //模式标志,1为基础流转灯模式,0为手动流转灯模式
bit Key_flag=0; //按键1标志位
unsigned char i=0;
unsigned char Time_bit=0; //延时计数标志位
unsigned char Key_Num=0; //记录按键按下次数
void Delay500ms(void) //@12.000MHz
{
unsigned char data i, j, k;
_nop_();
i = 31;
j = 113;
k = 29;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void setup()//定义数据和函数
{
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
P0M0 |= 0x07;
P0M1 &= ~0x07;//推挽模式
P3M0 = 0x00;
P3M1 = 0x00;//双向
Mod_flag=1; //初始化模式
}
void PressKey2(void) interrupt 2
{
Mod_flag = !Mod_flag;//模式转换
Time_bit = 0;
Key_Num = 0;//初始化标志位
while(!KEY2);//抬起按键
}
void PressKey1(void) interrupt 0
{
if(Mod_flag == 1)
{
Time_bit = 0;
Key_Num++;
if(Key_Num > 4)
{
Key_Num = 0;
}
}
if(Mod_flag == 0)
{
Key_flag = 1;
while(!KEY1);
}
while(!KEY1);
}
void turn() //基础流转灯模式
{
if(Mod_flag == 1)
{
P0 = ~(1<<i);
i++;
if(i > 2)
{
i = 0;
}
}
}
void time_change() //基础流转灯模式下的延时改变
{
if(Mod_flag == 1)
{
Delay500ms();
if(Time_bit == Key_Num)
{
turn();
Time_bit = 0;
}
else
{
Time_bit++;
}
}
}
void hand_turn_mod0() //手动流转灯模式
{
if(Mod_flag == 0)
{
if(Key_flag)
{
Delay500ms();
Key_flag = 0;
P0 = ~(1<<i);
i++;
if(i>2)
{
i = 0;
}
}
}
}
void main()//主函数
{
setup();
while(1)
{
time_change();
hand_turn_mod0();
}
}