在點亮LED燈的程序中我們知道開發板上的LED燈是接到高電平的,如果單片機引腳輸出電平,LED導通發亮。如果單片機引腳輸出高電平,LED截止熄滅。知道這個原理後我們把單片機的P0埠的8個引腳都按照同樣的方法接上8個LED燈,這樣我們就能玩出更多的花樣啦。
流水燈電路原理圖
1、所有LED燈亮滅閃爍
先來一個簡單的,先全部點亮和全部熄滅,間隔500ms,上次我們點亮LED燈的程序中我們只操作了P0埠的一位P0.0,現在只需要將原來操作一個埠的一位更改為操作操作整個埠即可。
將P0口定義為一個宏定義,方便後續理解。
#define LED P0
將原來的LED操作函數
void LedDisplay(unsigned char num)
{
Led0 = num;
}
更改為:
void LedDisplay(unsigned char num)
{
LED = num;
}
該函數傳入的形參剛好是8bit的無符號整型數據,對應P0口的8個bit,P0.0為最低位。也就是說我們只需要改變LED操作函數傳入的形參,P0口對應的8個LED燈狀態就能對應改變。所以,我們需要實現全部LED燈的亮滅操作,全都LED點亮,形參傳入16進位的0X00,P0口所有引腳置為低電平,延時後熄滅所有的LED燈,LED燈操作函數傳入形參0XFF,P0埠所有引腳置為高電平。需要將主函數中對應做如下修改。
void main()
{
for(;;)
{
LedDisplay(0x00);
delay_ms(500);
LedDisplay(0xFF);
delay_ms(500);
}
}
2、間隔一個LED交替閃爍
根據上面我們實現所有LED亮滅的操作方法,如果要實現間隔一個LED交替閃爍,我們只需要更改傳入的LED形參即可。對應為8bit的二進位數據為1010 1010為奇數的LED燈點亮,對應二進位為0101 0101為偶數的LED點亮。轉化為16進位就是0xAA和0x55。我們對應修改主函數程序如下。編譯下載到單片機,你會神奇地發現這時候已經有流水的效果了。
void main()
{
for(;;)
{
LedDisplay(0xAA);
delay_ms(500);
LedDisplay(0x55);
delay_ms(500);
}
}
3、從低位到高位依次點亮
從上面我們已經知道原理了,一次點亮的話我們需要給P0口依次賦值0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F。那我們有沒有更簡單一下的方法呢,有的,我們發現上面的數據取反後是0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80。然後0x02等於0x01向左移動一位,也就是說上面所有的數據可以用0x01通過移位和取反兩個操作得到。
我們先定義一個全局變量並且初始值賦值0x01
unsigned char dat = 0x01;
在主函數中循環操作,循環一次移位一次。過更改延時函數的傳入的形參大小可以調節流水的速度
void main()
{
unsigned char i;
for(;;)
{
dat = 0x01;
for(i=0;i<8;i++)
{
LedDisplay(~dat);
delay_ms(500);
dat = dat<<1;
}
}
}
給大家講解了一下LED流水燈的原理和一些基本的操作方法,可以通過更改傳入的數據和延時的時間,實現更多的流水燈樣式。
為了方便大家更好的學習,您還可以關注暢學電子和EDA的公眾號,每天推送相關知識,希望能對你的學習有所幫助!