|
摩托車尾燈
- /*實例:
- 實例中部分與上述講解有所不同
- 因為實際中我們控制的是16個燈,而在上述講解中只是控制8個燈,所以實例中有所不同
- 由于單片機速度限制,我最后將一個周期設定為循環50次。
- 所以當數組中存50既代表全亮。*/
- //預處理
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- //全局變量設定
- uchar dismem[16];
- uchar code tab[16]={0,1,2,3,4,5,6,7,8,9,11,13,16,22,35,50};
- uchar code ann[]={1,1,1,1,1,1,1,1,2,3,6,10,14,20,35,50,35,20,14,10,6,3,2,1,1,1,1,1,1,1,1,1};
- uchar code ann2[]={0,0,0,0,0,0,0,0,1,2,6,14,35,50,35,14,6,2,1,1,1,0,0,0,0,0,0,0,0};
- //延時函數
- void delay(uint i)
- {
- while(i--);
- }
- //取絕對值函數
- char abs(char i)
- {
- if (i<0)
- i=-i;
- return i;
- }
- //定時器設置函數
- void sinter()
- {
- IE=0x82;
- TCON=0x01;
- TH0=0xc0;
- TL0=0xFD;
- TR0=0x66;
- }
- //p0口位處理函數
- uchar bitcountp0(uchar n)
- {
- uchar i,p=0;
- for (i=0;i<8;i++)
- {
- if (dismem[i]<n)
- p=p|(1<<i);
- }
- return p;
- }
- //p2口位處理函數
- //在這里需要注意的是,p2口得順序和我們led連接順序是反的。詳情可以觀察電路圖可了解到。
- uchar bitcountp2(uchar n)
- {
- uchar i,p=0;
- for (i=0;i<8;i++)
- {
- if (dismem[i+8]<n)
- p=p|(0x80>>i);
- }
- return p;
- }
- //清屏函數
- void clean(uchar n)
- {
- uchar i;
- for (i=0;i<16;i++)
- {
- dismem[i]=n;
- }
- }
- //呼吸燈函數
- //其中被控制燈在第a個和第b個之間。speed是呼吸速度。
- void roll10(uchar a,uchar b,uint speed)
- {
- uchar i,j;
- for (i=1;i<30;i++)
- {
- for (j=a;j<b;j++)
-
- {
- dismem[j]=i;
- }
- delay (speed);
- }
- for(i=30;i>0;i--)
- {
- for (j=a;j<b;j++)
- {
- dismem[j]=i-1;
- }
- delay (speed);
- }
- }
- //動畫區域
-
- void flash_1() ///////////////////////////////////////////
- {
- uchar i,j,mem[32]={0,0,0,0,0,0,0,0x00,0,0,0,0,0,0,0,0x01,15,13,11,9,7,5,3,0x02,1,1,1,1,1,1,1,1};
- for (i=0;i<36;i++)
- {
- for (j=0;j<16;j++)
- {
- dismem[j]=tab[mem[j]];
- }
- for (j=0;j<31;j++)
- {
- mem[j]=mem[j+1];
- }
- mem[31]=1;
- delay(750);
- }
- }
- void flash_2() /////////////////////////////////////////
- {
- roll10(0,16,300);
- roll10(0,16,300);
- }
- void flash_3() ////////////////////////////////////////////
- {
- uchar i,j;
- for (i=0;i<16;i++)
- {
- for (j=0;j<16;j++)
- {
- dismem[j]=ann[i+j];
- }
- delay(800+abs(i-8)*50);
- }
- delay(2500);
- for (i=16;i>0;i--)
- {
- for (j=0;j<16;j++)
- {
- dismem[j]=ann[i+j];
- }
- delay(800+abs(i-8)*50);
- }
- delay(2500);
- }
- void flash_4() /////////////////////////////////////////////
- {
- uchar i,j,k;
- for (i=0;i<16;i++)
- {
- k=(i%2)*50;
- for(j=0;j<8;j++)
- {
- dismem[j]=k;
- }
- k=((i+1)%2)*50;
- for (j=8;j<16;j++)
- {
- dismem[j]=k;
- }
- delay(3000);
- }
- for (j=0;j<8;j++)
- {
- dismem[j]=50;
- }
- for (i=50;i>0;i--)
- {
- for (j=0;j<16;j++)
- {
- dismem[j]=i-1;
- }
- delay (300);
- }
- }
- void flash_5() ////////////////////////////////////////////////
- {
- roll10(0,4,50);
- roll10(4,8,50);
- roll10(8,12,50);
- roll10(12,16,50);
- roll10(12,16,50);
- roll10(8,12,50);
- roll10(4,8,50);
- roll10(0,4,50);
- roll10(0,1,10);
- roll10(1,2,10);
- roll10(2,3,10);
- roll10(3,4,10);
- roll10(4,5,10);
- roll10(5,6,10);
- roll10(6,7,10);
- roll10(7,8,10);
- roll10(8,9,10);
- roll10(9,10,10);
- roll10(10,11,10);
- roll10(11,12,10);
- roll10(12,13,10);
- roll10(13,14,10);
- roll10(14,15,10);
- roll10(15,16,10);
- roll10(15,16,10);
- roll10(14,16,10);
- roll10(13,16,10);
- roll10(12,16,10);
- roll10(11,16,10);
- roll10(10,16,10);
- roll10(9,16,10);
- roll10(8,16,10);
- roll10(7,16,10);
- roll10(6,16,10);
- roll10(5,16,10);
- roll10(4,16,10);
- roll10(3,16,10);
- roll10(2,16,10);
- roll10(1,16,10);
- roll10(0,16,10);
- roll10(0,16,10);
- roll10(15,16,10);
- roll10(14,15,10);
- roll10(13,14,10);
- roll10(12,13,10);
- roll10(11,12,10);
- roll10(10,11,10);
- roll10(9,10,10);
- roll10(8,9,10);
- roll10(7,8,10);
- roll10(6,7,10);
- roll10(5,6,10);
- roll10(4,5,10);
- roll10(3,4,10);
- roll10(2,3,10);
- roll10(1,2,10);
- roll10(0,1,10);
- roll10(0,16,10);
- roll10(1,16,10);
- roll10(2,16,10);
- roll10(3,16,10);
- roll10(4,16,10);
- roll10(5,16,10);
- roll10(6,16,10);
- roll10(7,16,10);
- roll10(8,16,10);
- roll10(9,16,10);
- roll10(10,16,10);
- roll10(11,16,10);
- roll10(12,16,10);
- roll10(13,16,10);
- roll10(14,16,10);
- roll10(15,16,10);
- }
- void flash_6_1(uint speed) /////////////////////////////////////////
- {
- uchar i,j;
- for (i=1;i<50;i++)
- {
- for (j=0;j<16;j+=2)
- {
- dismem[j]=i;
- }
- for (j=1;j<16;j+=2)
- {
- dismem[j]=49-i;
- }
- delay (speed);
- }
- for (i=49;i>0;i--)
- {
- for (j=0;j<16;j+=2)
- {
- dismem[j]=i;
- }
- for (j=1;j<16;j+=2)
- {
- dismem[j]=49-i;
- }
- delay (speed);
- }
- }
- void flash_6_2(uint speed) /////////////////////////////////////////
- {
- uchar i,j;
- for (i=1;i<50;i++)
- {
- for (j=0;j<4;j++)
- {
- dismem[j]=i;
- dismem[j+8]=i;
- }
- for (j=4;j<8;j++)
- {
- dismem[j]=49-i;
- dismem[j+8]=49-i;
- }
- delay (speed);
- }
- for (i=49;i>0;i--)
- {
- for (j=0;j<4;j++)
- {
- dismem[j]=i;
- dismem[j+8]=i;
- }
- for (j=4;j<8;j++)
- {
- dismem[j]=49-i;
- dismem[j+8]=49-i;
- }
- delay (speed);
- }
- }
- void flash_6() //////////////////////////////////////////////
- {
- uchar i,j;
- for (i=1;i<50;i++)
- {
- for (j=1;j<16;j+=2)
- {
- dismem[j]=i;
- }
- delay (100);
- }
- flash_6_1(100);
- flash_6_1(100);
- flash_6_1(100);
- flash_6_1(100);
- for (i=49;i>0;i--)
- {
- for (j=1;j<16;j+=2)
- {
- dismem[j]=i;
- }
- delay (100);
- }
- for (i=1;i<50;i++)
- {
- for (j=4;j<8;j++)
- {
- dismem[j]=i;
- dismem[j+8]=i;
- }
- delay (100);
- }
- flash_6_2(100);
- flash_6_2(100);
- flash_6_2(100);
- for (i=49;i>0;i--)
- {
- for (j=4;j<8;j++)
- {
- dismem[j]=i;
- dismem[j+8]=i;
- }
- delay (100);
- }
- }
- void flash_7() //////////////////////////////////////////////
- {
- uchar i,j,k;
- for (i=0;i<15;i++)
- {
- k=(i%2)*50;
- for (j=0;j<8;j++)
- {
- dismem[j]=k;
- }
- delay(1500);
- }
- for (i=0;i<15;i++)
- {
- k=(i%2)*50;
- for (j=8;j<16;j++)
- {
- dismem[j]=k;
- }
- delay(1500);
- }
- }
- void flash_8() ////////////////////////////////////////////////
- {
- uchar i,j;
- for (i=0;i<22;i++)
- {
- for (j=0;j<8;j++)
- {
- dismem[j]=ann2[i+j];
- dismem[15-j]=ann2[i+j];
- }
- delay(1500);
- }
- }
- void flash_9_l() /////////////////////////////////////////////////////////
- {
- uchar i,j;
- for (i=0;i<4;i++)
- dismem[i]=50;
- for (i=4;i<8;i++)
- dismem[i]=1;
- for (i=0;i<12;i++)
- {
- for (j=15;j>4;j--)
- dismem[j]=dismem[j-1];
- dismem[4]=0;
- delay(1000);
- }
- }
- void flash_9_r() //////////////////////////////////////////////////
- {
- uchar i,j;
- for (i=12;i<16;i++)
- dismem[i]=50;
- for (i=8;i<12;i++)
- dismem[i]=1;
- for (i=0;i<12;i++)
- {
- for (j=0;j<11;j++)
- dismem[j]=dismem[j+1];
- dismem[11]=0;
- delay(1000);
- }
- }
- void flash_9() //////////////////////////////////////////////////////
- {
- flash_9_l();
- flash_9_r();
- flash_9_l();
- flash_9_r();
- flash_9_l();
- flash_9_r();
-
- }
- //主函數
- //主函數調用動畫區域的函數,這里可以理解一個播放列表。
- void main()
- {
- sinter();
- clean(0);
- //play list;
- while(1)
- {
- flash_1();
- flash_2();
- flash_3();
- flash_4();
- flash_2();
- flash_5();
- flash_6();
- flash_7();
- flash_7();
- flash_9();
- flash_8();
- flash_8();
- flash_2();
- flash_6();
- flash_9();
- flash_3();
- flash_1();
- flash_8();
- flash_8();
- flash_6();
- flash_5();
- flash_4();
- }
- }
- //中斷服務函數
- void print() interrupt 1
- {
- static uchar i=1;
- P0=bitcountp0(i);
- P2=bitcountp2(i);
- if (i<50)
- i++;
- else
- i=1;
- TH0=0xFd;
- TL0=0x66;
- }
復制代碼
|
-
-
霹靂游俠燈.rar
2014-7-1 10:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
620.85 KB, 下載次數: 164, 下載積分: 黑幣 -5
|