|
这是我三月份做的一个广告流水灯,用了两个星期的时间,在老师指导下完成,附件里包含用keil编写的c程序。流水灯的工作方式主要通过键盘实现。数字键0-9分别对应广告灯的10种状态。
- #include <REG51.H>
- #include <intrins.h>
- sbit dula=P2^6;
- sbit wela=P2^7;
- unsigned char code duan[]={
- 0x3F,/*0*/
- 0x06,/*1*/
- 0x5B,/*2*/
- 0x4F,/*3*/
- 0x66,/*4*/
- 0x6D,/*5*/
- 0x7D,/*6*/
- 0x07,/*7*/
- 0x7F,/*8*/
- 0x6F,/*9*/
- };
- unsigned char code wei[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- unsigned char num,a,w=50,b=0,c,u=50,v,m,k,jj;
- unsigned char huan[]={0,1,2,3,4,5};
- unsigned int i,d,j,j1,qufan=0;
- bit q=0;
- int sudu=1;
- delay(unsigned xms)
- {
- unsigned int i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- smgydbfa()
- {
- P0=0XFF;dula=1;dula=0;wela=1;wela=0;
- dula=1;
- P0=duan[huan[num]];
- dula=0;
-
- wela=1;
- P0=~(0x01<<num);// 1111 1110
- wela=0;
-
- num++;
- if(num>6)num=0;
- }
- anniu()
- {
- P3=0XF0;
- if(P3!=0XF0)
- { a++;
- if(a>5)
- { a=0;
- if((P3!=0X0F)&&(v==0))
- { k=P3;
- P3=k|0X0F;
- k=P3;v=1;c=1;
- switch(k)
- { case 0xEE: u=0;w=0;break;
- case 0xED: u=1;w=1;break;
- case 0xEB: u=2;w=2;break;
- case 0xE7: u=3;w=3;break;
- case 0xDE: u=4;w=4;break;
- case 0xDD: u=5;w=5;break;
- case 0xDB: u=6;w=6;break;
- case 0xD7: u=7;w=7;break;
- case 0xBE: u=8;w=8;break;
- case 0xBD: u=9;w=9;break;
- case 0xBB: u=10;w=10;break;
- case 0xB7: u=11;w=11;break;
- case 0x7E: u=12;w=12;if(q==0) sudu--;break;
- case 0x7D: u=13;w=13;if(q==0) sudu++;break;
- case 0x7B: u=14;q=~q;break;
- case 0x77: u=15;break;
- }
- }
- }
- }
- else v=0;
- }
- anniuchuli()
- {
- jj++;
- if(jj>=5+sudu)
- { jj=0;
- switch(w)
- {
- case 0://单个LED灯从左到右
- P1=0xFF;
- if(qufan==1)
- {
- if(q==0)d++;
- P1=_crol_(0x01,d); //0000 0001 左移
- delay(500+sudu*10);
- if(d>=8) d=0;
- }
-
- else
- {
- if(q==0)d++;
- P1=_crol_(0xFE,d); //1111 1110 左移
- delay(500+sudu*10);
- if(d>=8) d=0;
-
- }
- break;
- case 1://两个LED灯从左到右
- P1=0xFF;
- if(qufan==1)
- { if(q==0)d++;
- P1=_crol_(0x03,d); //0000 0011 左移
- delay(500+sudu*10);
- if(d>=7) d=0;
-
- }
- else
- { if(q==0) d++;
- P1=_crol_(0xFC,d); //1111 1100 11110011 左移
- delay(500+sudu*10);
- if(d>=7) d=0;
-
- }
- break;
- case 2://单个LED灯从右到左
- P1=0xFF;
-
- if(qufan==1)
- {
- if(q==0) d++;
- P1=_cror_(0x80,d); //1000 0000 右移
- delay(500+sudu*10);
- if(d>=8) d=0;
- }
-
- else
- { if(q==0) d++;
- P1=_cror_(0x7F,d); //0111 1111 右移
- delay(500+sudu*10);
- if(d>=8) d=0;
-
- }
- break;
- case 3://两个LED灯从右到左
- P1=0xFF;
- if(qufan==1)
- { if(q==0) d++;
- P1=_cror_(0xC0,d); //1100 0000 右移
- delay(500+sudu*10);
- if(d>=7) d=0;
- }
-
- else
- { if(q==0) d++;
- P1=_cror_(0x3F,d); //0011 1111 右移
- delay(500+sudu*10);
- if(d>=7) d=0;
-
- }
- break;
- case 4://中间向两边
- P1=0xFF;
- if(qufan==1)
- {
- P1=~(0XE7); delay(500+sudu*10); //0001 1000 //P1=~0X18;P1=~0X24;
- P1=~(0XDB); delay(500+sudu*10); //0010 0100
- P1=~(0XBD); delay(500+sudu*10); //
- P1=~(0X7E); delay(500+sudu*10);
-
- }
- else{
- P1=0XE7; delay(500+sudu*10); //1110 0111
- P1=0XDB; delay(500+sudu*10); //1101 1011
- P1=0XBD; delay(500+sudu*10); //1011 1101
- P1=0X7E; delay(500+sudu*10);
- }
- break;
- case 5://两边向中间
- P1=0xFF;
- if(qufan==1)
- {
- P1=~0X7E;delay(500+sudu*10);
- P1=~0XBD;delay(500+sudu*10);
- P1=~0XDB;delay(500+sudu*10);
- P1=~0XE7;delay(500+sudu*10);
- }
-
- else
- {
- P1=0X7E;delay(500+sudu*10);
- P1=0XBD;delay(500+sudu*10);
- P1=0XDB;delay(500+sudu*10);
- P1=0XE7;delay(500+sudu*10);
- }
-
- break;
- case 6://从左到右依次点亮,全亮后熄灭全部LED灯
- P1=0xff;
- if(qufan==1)
- {
- P1=~0XFE;delay(500+sudu*10);
- P1=~0XFC;delay(500+sudu*10);
- P1=~0XF8;delay(500+sudu*10);
- P1=~0XF0;delay(500+sudu*10);
- P1=~0XE0;delay(500+sudu*10);
- P1=~0XC0;delay(500+sudu*10);
- P1=~0X80;delay(500+sudu*10);
- P1=~0X00;delay(500+sudu*10);
- P1=~0XFF;delay(500+sudu*10);
- }
- else
- {
- P1=0XFE;delay(500+sudu*10);
- P1=0XFC;delay(500+sudu*10);
- P1=0XF8;delay(500+sudu*10);
- P1=0XF0;delay(500+sudu*10);
- P1=0XE0;delay(500+sudu*10);
- P1=0XC0;delay(500+sudu*10);
- P1=0X80;delay(500+sudu*10);
- P1=0X00;delay(500+sudu*10);
- P1=0XFF;delay(500+sudu*10);
- }
-
- break;
-
- case 7://从右到左依次点亮,全亮后熄灭全部LED灯
- P1=0xff;
- if(qufan==1)
- {
-
- P1=~0X7F;delay(500+sudu*10);
- P1=~0X3F;delay(500+sudu*10);
- P1=~0X1F;delay(500+sudu*10);
- P1=~0X0F;delay(500+sudu*10);
- P1=~0X07;delay(500+sudu*10);
- P1=~0X03;delay(500+sudu*10);
- P1=~0X01;delay(500+sudu*10);
- P1=~0X00;delay(500+sudu*10);
- P1=~0XFF;delay(500+sudu*10);
- }
- else{
- P1=0X7F;delay(500+sudu*10);
- P1=0X3F;delay(500+sudu*10);
- P1=0X1F;delay(500+sudu*10);
- P1=0X0F;delay(500+sudu*10);
- P1=0X07;delay(500+sudu*10);
- P1=0X03;delay(500+sudu*10);
- P1=0X01;delay(500+sudu*10);
- P1=0X00;delay(500+sudu*10);
- P1=0XFF;delay(500+sudu*10);}
- break;
- case 8://奇数灯及偶数灯交替点亮
- P1=0xFF;
- if(qufan==1)
- {
-
- P1=~0XAA;delay(500+sudu*10);
- P1=~0X55;delay(500+sudu*10);
- }
- else
- {
- P1=0XAA;delay(500+sudu*10);
- P1=0X55;delay(500+sudu*10);
-
- }
- break;
- case 9://左四位和右四位交替点亮
- P1=0xFF;
- if(qufan==1)
- {
- P1=~0X0F;delay(500+sudu*10);
- P1=~0XF0;delay(500+sudu*10);
- }
- else
- {
- P1=0X0F;delay(500+sudu*10);
- P1=0XF0;delay(500+sudu*10);
- }
- break;
-
- case 10:
- break;
- case 11://取反
- if(qufan==1) qufan=0;
- else qufan=1;
- break;
- case 12://加速
- break;
- case 13://减速?
- break;
- case 14://暂停
- break;
- }
- }
- }
- main()
- {
- TMOD=0X01; //0000 0001
- TH0=0XF5;
- TL0=0XAF;
- EA=1;
- ET0=1;
- TR0=1;
- for(d=0;d<8;d++)
- {
- P1=0xff;
- P1=_crol_(0xfe,d);
- delay(250);
- }
- P1=0xff;
- if(j1==1) {huan[0]=0;huan[1]=0;huan[2]=0;huan[3]=0;huan[4]=0;huan[5]=0;}
-
- while(1)
- {
- anniuchuli();
- if(c>=1) b=w;
- huan[4]=b/10;
- huan[5]=b%10;
- }
- }
- time_0()interrupt 1
- {
- TH0=0XF5;
- TL0=0XAF;
- //if(q==1)
- //if(q==0)
- smgydbfa();
- anniu();
- j++;
- if(j>500)
- {j=0;j1=1;}
- }
复制代码
|
|