一起看流星
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
sbit shuma=P3^4;
uchar num=1;
uchar table[4]={0x50,0x5b,0x4f,0x66};
uchar a=0,b=0,c=1;
uchar changdu=5;
uchar sudu=20;
uchar flag1=0;
uchar flag2=0;
uchar flag3=0;
uchar weiyi=0;
uchar huxi=40;
uchar prew;
void delay(uchar i);
void key();
void init0();
void init1();
void xianshi();
void init0(){
TMOD=0x01;
TH0=(65535-25000)/256;
TL0=(65535-25000)%256;
EA=1;
ET0=1;
TR0=1;}
void init1(){
TMOD=0x10;
TH1=(65535-25000)/256;
TL1=(65535-25000)%256;
EA=1;
ET1=1;
TR1=1;}
void main(){
init0();
while (1) {
xianshi();
}
}
void timer0() interrupt 1 {
TH0=(65535-25000)/256;
TL0=(65535-25000)%256;
a++;
if (a==sudu) {
a=0;
flag3=1; }
}
void timer1() interrupt 3 {
TH0=(65535-25000)/256;
TL0=(65535-25000)%256;
b++;
if (b==huxi/10) {
b=0;c++;
}
if (c==10) {
c=0;
}
}
void key(){
if (k1==0){
delay (500);
if (k1==0)
num++;
if (num==6){
num=1;
P0=table[num];}}
switch (num) {
case 1:
if (k2==0){
delay(500);
if (k2==0)
changdu++;
while (!k2);}
if (k3==0){
delay(500);
if(k3==0)
changdu--;
while (!k3);}
break;
case 3:if (k2==0){
delay(500);
if (k2==0)
sudu/=2;
while(!k2);}
if (k3==0){
delay(500);
if(k3==0)
sudu*=2 ;
while (!k3);}
break;
case 4:if (k2==0){
delay(500);
if (k2==0)
huxi+=20;
}
if (k3==0){
delay(500);
if(k3==0)
huxi-=20; }
break;
}
}
void delay (uchar i){
uchar j;
for (j=0;j<i;j++);}
void xianshi(){
uchar w,e,l,diyi;
uchar duan=0xfe;
while (1){
key();
diyi=0xff;
for (e=0;e<changdu;e++) {
diyi<<=1; }
if (flag3==1) {
flag3=0;
weiyi++;
if (weiyi==changdu) {
weiyi=0; }
}
P2=diyi;
delay(10);
w=P2;
for (e=0;e<(changdu-1);e++) {
if (flag3==0){
w=~w;
w<<=1;
w=w&(~diyi);
w=~w;
prew=w;
if (changdu-weiyi!=changdu) prew=_cror_(prew,(changdu-weiyi));
if (changdu-weiyi==changdu)
prew=w;
prew|=diyi;
P2=prew;
delay(50*e);
}
}
delay(50*c);
}
}
效果:可以控制灯的长度以及流动的快慢,亮度依次减小,计时器控制其流动,另一个计时器控制灯的呼吸,即全部的灯慢慢变暗,用占空比实现
效果如上图所示,一直流动,此时长度为8