這是我最近寫的一個呼吸燈,第一次用頭文件寫遇到了好多小問題,有些問題解答了,有些沒解答,小編純屬小白,希望能夠對大家有所幫助
- /*********************************************
- 心形燈功能
- 類1:huxi()
- 類2:move()
- 組合:combine()
- 總體實現函數:amain()
- ****************************************/
- #include<reg52.h>
- #include"move.h"
- #include"type_def.h"
- /*1.***************全局變量聲明專區******************/
- u16 led1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- u16 led11[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- u16 led2[4]={0xfc,0xf3,0xcf,0x3f};
- u16 led3[5]={0xf8,0xf1,0xe3,0x8f,0x1f};
- u16 led4[4]={0xf0,0xc3,0x0f,0x3f};
- u16 led5[8]={0xe0,0x0e,0xd0,0x0d,0xc0,0x0c,0x70,0x07};
- u16 led6[2]={0x88,0xe0};
- //u16 flag=0; //動作選擇標志
- sbit key=P3^0;
- /*2.******************宏定義專區********************/
- #define length 10000 //10ms
- #define w1_0 20 //輸出有效電壓的步幅
- #define w0_0 10 //初始化燈的亮度
- /*3.*****************函數聲明專區*******************/
- static void delay(u16 i);
- static void time_huxi();
- static void move_0();
- static u16 anjian_0(u16 f);
- /*4.**************函數實現模塊**********************/
- static void delay(u16 i)//延時
- {
- while(i--)
- {
- int j;
- for(j=0;j<125;j++);//1ms
- }
- }
- static void time_huxi()//呼吸
- {
- TMOD|=0x01;//定時器進行方式
- TH0=(65536-10)/256;
- TL0=(65536-10)%256;//1ms初值
- ET0=1;
- EA=1;
- TR0=1; //通過控制TR0,來選擇打呼吸燈的效果,緩解了cpu的壓力,因為只有在中斷瞬間才會跳進去,平常就在背后記著時間
- }
- static void move_0() //流水0
- {
- while(1)
- {
- u16 i; //是小局部變量的全局變量,對于小局部變量,值不會釋放
- for(i=0;i<8;i++)
- {
- P1=led1[i];
- P0=led1[i];
- delay(50);
- }
- P1=0XFF;
- P0=0XFF;
- for(i=0;i<8;i++)
- {
-
- P3=led1[i];
- P2=led11[i];
- delay(50);
- }
- P2=0XFF;
- P3=0XFF;
- for(i=0;i<8;i++)
- {
-
- P2=led1[i];
- P3=led11[i];
- delay(50);
- }
- P3=0XFF;
- P2=0XFF;
- for(i=0;i<8;i++)
- {
- P1=led11[i];
- P0=led11[i];
- delay(50);
- }
- P1=0XFF;
- P0=0XFF;
- }
- }
- static u16 anjian_0(u16 f)//按鍵檢測
- {
- if(key==0)
- {
- delay(10);
- if(key==0)
- {
- f++;//作為返回值,都達到加
- while(!key);
- }
- }
- return f; //僅僅作為返回值返回,返回給誰需要指定
- }
- /*5.*******************函數組裝專區************************/
- void amain()
- {
- time_huxi();
- while(1) //在執行定時器中斷的時候,必須加while(1)是程序不能從主函數中跳出來,進一步實現定時器里的程序,大多數函數雖然不要while(1)也行,會執行看門狗程序,但是有些必須加,加上絕對正確
- {
- // static u16 flag=0; //因為在循環的過程中,循環里面定義的變量也是一個局部變量,完成一次循環會自動釋放原始值
- // flag=anjian_0(flag);
- // switch(flag)
- // {
- // case 0:
- // P0=0X00;break;
- // case 1:
- // P0=0X0F;break;
- // case 2:
- // P0=0XF0;
- // break;
- // default :flag=0;
- // }
- ;
- }
- }
- void bmain()
- {
- time_huxi();
- move_0();
-
- }
- /*6.********************實現中斷專區****************/
- void T_PWM()interrupt 1
- {
- static int wide1=w0_0,wide2=length-w0_0,i=0,flag=0;//因為循環一次過后局部變量i釋放 了,所以沒有達到++效果
- TR0=0;
- if(flag==0)
- {
- i++;
- wide1+=w1_0;
- wide2-=w1_0;
- if(i%2==0)
- {
- TH0=(65536-wide1)/256;
- TL0=(65536-wide1)%256;
- P2=0X0F;
- }
- else
- {
- TH0=(65536-wide2)/256;
- TL0=(65536-wide2)%256;
- P2=0XFF;
- }
- if(wide1==length-w0_0)
- flag=1;
- }
- else if(flag==1)
- {
- i++;
- wide1-=w1_0;
- wide2+=w1_0;
- if(i%2==0)
- {
- TH0=(65536-wide1)/256;
- TL0=(65536-wide1)%256;
- P2=0X0F;
- }
- else
- {
-
- TH0=(65536-wide2)/256;
- TL0=(65536-wide2)%256;
- P2=0XFF;
- }
- if(wide1==w0_0)
- flag=0;
- }
- TR0=1;//為什么有些時候聲明變量必須是在前面呢
- }
復制代碼
|