在STC89C52RC中,負責顯示的有8個LED燈,8位元碼管,並且支援1602和12864兩種液晶顯示屏;本篇總結的是8位紅光LED燈模組。
主要處理的是點亮和熄滅燈的操作。0是點亮,1是熄滅。其中點亮一位LED燈,有兩種方法:一個是定義一個可以位定址的變數;一個是利用匯流排方式直接為P0口賦值。
方法1例子:
/********************************************************<br />位定義方式點亮一個LED燈********************************************************/</p><p>#include<reg52.h><br />sbit p0_0=P0^0; //位定義P0口的第一位為p0_0</p><p>/*主函數*/<br />void main() //主函數<br />{<br />p0_0=0; //p0_0置低,點亮第一個LED燈<br />while(1);<br />}
方法2例子:
/******************************************<br />用匯流排方式點亮一個LED燈<br />******************************************/</p><p>#include<reg52.h></p><p>void main() //主函數<br />{<br />P0=0xfe; //直接給P0口的8個位賦值:0xfe=11111110B,低電平點亮末位LED<br />while(1); //死迴圈,讓程式停在此處<br />}
利用時延,在不同的時間段點亮不同位置的燈,可以實現花樣流水燈。
一下給出一個例子:
/*****************************************************************<br />花樣流水燈:<br />8個LED間隔300ms由右至左,再由左至右,再重複一次,然後全部熄滅再以<br />300ms間隔全部閃爍3次。之後,間隔300ms第一次一個LED亮併流動一次,<br />第二次兩個LED亮併流動一次,……依次到8個LED亮後全部熄滅。最後,間<br />隔300ms先奇數亮再偶數亮,迴圈三次;兩個LED分別從兩邊往中間流動三次;<br />再從中間往兩邊流動三次;8個LED再全部閃爍3次;關閉發光管,程式停止。<br />*****************************************************************/<br />#include<reg52.h><br />#include<intrins.h></p><p>void delay(int z);//聲明延時函數<br />void flow1();<br />void flow2();<br />void flow3();<br />/*主函數*/<br />void main()<br />{<br />flow1();//調用flow1,完成第一部分的任務<br />delay(300);//延時300ms<br />flow2();<br />delay(300);<br />flow3();<br />P0=0xff;<br />while(1);<br />}</p><p>/*定義延時函數*/<br />void delay(int z)<br />{<br />int x,y;<br />for(x=z;x>0;x--)<br />for(y=110;y>0;y--);<br />}</p><p>/*定義實現第一部分功能的函數:<br />8個LED間隔300ms由右至左,再由左至右,再重複一次,然後全部熄滅再以<br />300ms間隔全部閃爍3次。*/<br />void flow1()<br />{<br />int x,y,z;<br />int a;<br />P0=0x7f;//點亮l8<br />delay(300);//延時300ms<br />for(a=0;a<2;a++)<br />{<br />for(x=0;x<7;x++)//左移<br />{<br />P0=_cror_(P0,1);//調用迴圈左移函數,並賦值給P0<br />delay(300);<br />}<br />P0=0xfe;//點亮l1<br />delay(300);<br />for(y=0;y<7;y++) //右移<br />{<br />P0=_crol_(P0,1);<br />delay(300);<br />}<br />}<br />for(z=0;z<3;z++) //全部亮和全部暗閃爍三次<br />{<br />P0=0xff;<br />delay(300);<br />P0=0x00;<br />delay(300);<br />}<br />}</p><p>/*定義完成第二部分功能的函數flow2:第一次一個LED亮併流動一次,<br />第二次兩個LED亮併流動一次,……依次到8個LED亮後全部熄滅*/<br />void flow2()<br />{<br />int x;<br />P0=0xfe;//點亮一個燈,左移<br />delay(300);<br />for(x=0;x<7;x++)<br />{<br />P0=_crol_(P0,1);<br />delay(300);<br />}<br />P0=0xfc;//點亮兩個燈,左移<br />delay(300);<br />for(x=0;x<6;x++)<br />{<br />P0=_crol_(P0,1);<br />delay(300);<br />}<br />P0=0xf8;//點亮三個燈,左移<br />delay(300);<br />for(x=0;x<5;x++)<br />{<br />P0=_crol_(P0,1);<br />delay(300);<br />}<br />P0=0xf0;//點亮四個燈,左移<br />delay(300);<br />for(x=0;x<4;x++)<br />{<br />P0=_crol_(P0,1);<br />delay(300);<br />}<br />P0=0xe0; //點亮五個燈,左移<br />delay(300);<br />for(x=0;x<3;x++)<br />{<br />P0=_crol_(P0,1);<br />delay(300);<br />}<br />P0=0xc0;//點亮六個燈,左移<br />delay(300);<br />for(x=0;x<2;x++)<br />{<br />P0=_crol_(P0,1);<br />delay(300);<br />}<br />P0=0x80;//點亮七個燈,左移一次<br />delay(300);<br />for(x=0;x<1;x++)<br />{<br /> P0=_crol_(P0,1);<br />delay(300);<br />}<br />P0=0x00;//點亮八個燈<br />delay(300);<br />P0=0xff;//全部熄滅<br />}</p><p>/*定義完成第三部分功能的函數:間隔300ms先奇數亮再偶數亮,迴圈三次;兩個LED分<br />別從兩邊往中間流動三次;再從中間往兩邊流動三次;8個LED再全部閃爍3次;*/<br />void flow3()<br />{<br />int x;<br />for(x=0;x<3;x++) //先奇數亮,再偶數亮,迴圈三次<br />{<br />P0=0x55;<br />delay(300);<br />P0=0xAA;<br />delay(300);<br />}<br />for(x=0;x<3;x++) //從兩邊往中間流動三次<br />{<br />P0=0x7e;<br />delay(300);<br />P0=0xbd;<br />delay(300);<br />P0=0xdb;<br />delay(300);<br />P0=0xe7;<br />delay(300);<br />}<br />for(x=0;x<3;x++) //從中間往兩邊流動三次<br />{<br />P0=0xe7;<br />delay(300);<br />P0=0xdb;<br />delay(300);<br />P0=0xbd;<br />delay(300);<br />P0=0x7e;<br />delay(300);<br />}<br />for(x=0;x<3;x++) //全暗全亮閃爍三下<br />{<br />P0=0xff;<br />delay(300);<br />P0=0x00;<br />delay(300);<br />}<br />}<br />
個人認為,LED燈的學習還是比較簡單的。