#include <REGX52.H>
#include <INTRINS.H>
#include <stdlib.h> //产生随机函数用的
#define LED P2
unsigned char D1=0xFE,D2=0xFD,D3=0xFB,D4=0xF7,D5=0xEF,D6=0xDF,D7=0xBF,D8=0x7F;
unsigned char KeyNum=0;
char Compare=0,Count3,A=0,x;
void Key()
{
if(P3_1==0)KeyNum=1;
if(P3_0==0)KeyNum=2;
if(P3_2==0)KeyNum=3;
if(P3_3==0)KeyNum=4;
}
void Timer0_Init()
{
TMOD &=0xF0;
TMOD |=0x01;
TL0=0xA4;
TH0=0xFF;
TF0=0;
TR0=1;
ET0=1;
EA=1;
PT0=0;
}
void main(void)
{
Timer0_Init();//定时器初始化
while(1);
}
void Timer0_Routine() interrupt 1 //0.1ms执行一次
{
static unsigned int Count,t;
TL0 = 0xA4; //设置定时初始值
TH0 = 0xFF; //设置定时初值
Count++;
Count3=Count;
t++;
Key();
Count%=101; //固定Count属于0-100
if(t>=800)
{
if(KeyNum==1){ //流星灯右移功能
t=0; //80ms循环左移一次
D1=_crol_(D1,1);
D2=_crol_(D2,1);
D3=_crol_(D3,1);
D4=_crol_(D4,1);
D5=_crol_(D5,1);
D6=_crol_(D6,1);
D7=_crol_(D7,1);
D8=_crol_(D8,1);
}
if(KeyNum==2){ //流星灯左移功能
t=0; //80ms循环右移一次
D1=_cror_(D1,1);
D2=_cror_(D2,1);
D3=_cror_(D3,1);
D4=_cror_(D4,1);
D5=_cror_(D5,1);
D6=_cror_(D6,1);
D7=_cror_(D7,1);
D8=_cror_(D8,1);
}
if(KeyNum==3){ //加载条功能
if(Count%100==0){Compare-=1;} //从最亮到最暗
if(Compare<=0)
{
Compare=100;
A%=8;
x|=(0x01<<A); //不断往左移动
A++;
}
}
if(KeyNum==4){ //打地鼠??功能
if(Count%50==0){Compare-=1;}
if(Compare<=0)
{
Compare=100;
A=rand()%8; //随机亮灯
x=(0x01<<A);
}
}
} //通过与和或的运算,让每个I/O口输出不同的pwm,而且不干扰其他I/O口的pwm输出
if(KeyNum==1){
if(Count<0)LED&=D1; //与等于D1复位一位,不影响其他7位
else LED|=~D1; //或等于D1置位一位,不影响其他7位
if(Count<0)LED&=D2;
else LED|=~D2;
if(Count<=3)LED&=D3;
else LED|=~D3;
if(Count<=7)LED&=D4; //拿15举例,因为他是一遍一遍扫下去的如果小于设定值则是暗大于则是亮
else LED|=~D4; //与等于可以保存上面的情况并且控制当前亮的频率(因为1&0=0),或等于取反控制暗(因为0|~0=1)频率
if(Count<=14)LED&=D5; //因为初始赋值就是11110111(与上)上一次的值只会改变当前位数上的值
else LED|=~D5;
if(Count<=25)LED&=D6;
else LED|=~D6;
if(Count<=79)LED&=D7;
else LED|=~D7;
if(Count<=100)LED&=D8;
else LED|=~D8;
}
if(KeyNum==2){
if(Count<0)LED&=D8;
else LED|=~D6;
if(Count<0)LED&=D7;
else LED|=~D7;
if(Count<=3)LED&=D6;
else LED|=~D6;
if(Count<=7)LED&=D5;
else LED|=~D5;
if(Count<=14)LED&=D4;
else LED|=~D4;
if(Count<=56)LED&=D3;
else LED|=~D3;
if(Count<=79)LED&=D2;
else LED|=~D2;
if(Count<=100)LED&=D1;
else LED|=~D1;
}
if(KeyNum==3){
if(Count3<Compare){ //呼吸灯基本原理
P2=~x;
}
else
{
P2=~0x00;
}
}
if(KeyNum==4){ //这个也是
if(Count3<Compare){
P2=~x;
}
else
{
P2=~0x00;
}
}
}
按键1流星灯向左移动
按键2流星灯向右移动
按键3加载条呼吸灯
按键4随机闪烁