本帖最後由 ahuo 於 2011-2-16 14:36 編輯
以前寫過個51的漸變led
本來係想用黎做hdd狀態燈ge
不過最後賴,冇做過
改咗下,可以做到類似的效果
但得8粒led,要一樣的話要自己改下
http://s33.photobucket.com/album ... urrent=MVI_0542.mp4- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define led P1
- #define max 50
- #define step 1
- uchar eled[8];
- uchar pled;
- void PWM() interrupt 3
- {
- static uchar counter;
- uchar loop,showled=0;
- TR1=0;
- counter++;
- for (loop=0;loop<8;loop++)
- if (counter<eled[loop]) showled=showled | (0x01<<loop);
- if (counter>49)
- {
- counter=0;
- for (loop=0;loop<8;loop++)
- if (eled[loop]>0) eled[loop]=eled[loop]-step; //呢個控制消失速度(由step的數字控制)
- //step的數字只for:1,2,5(要可被5整除),想用其他應該要加多句:if (eled[loop]>50) eled[loop]=0;
- }
- led=pled & (~showled);
- TR1=1;
- }
- void move_next() interrupt 1
- {
- static bit direction;
- static uchar ms_counter;
- uchar led_mark;
- uchar bit_counter=0;
- TR0=0;
- ms_counter++;
- if(ms_counter==8) //移位的速度,ms_counter+1大槪用50ms(未計中斷裡面會占用的時間,不過大槪就算...),移位的速度=8*50m=400ms=0.4s
- {
- ms_counter=0;
- led_mark=~pled;
- while (led_mark!=0x01)
- {
- led_mark>>=1;
- bit_counter++;
- }
- eled[bit_counter]=max;
-
- if(bit_counter==7) direction=1;
- else if(bit_counter==0) direction=0;
-
- if(!direction) pled=_crol_(pled,1);
- else pled=_cror_(pled,1);
- }
- TH0=0x3c;
- TL0=0xb0;
- TR0=1;
- }
- void main()
- {
- TMOD=0x21;
- TH1=38;
- TL1=38;
- TR1=1;
- ET1=1;
- TH0=0x3c;
- TL0=0xb0;
- TR0=1;
- ET0=1;
- EA=1;
- pled=0xfe;
- while(1);
- }
複製代碼 |