如果你不介意多用兩個三極管的話,可以用兩個三極管通過與邏輯控制一個LED,另外兩個LED用電平本身控制。電路圖如下:
Q1和Q2是兩個NPN三極管,如果兩個IO同時高電平,LED1和LED2兩側電平相同,不亮,此時Q1和Q2飽和,LED3亮;如果兩個IO中只有一個高電平,那么可以對應地導通LED1或LED2,此時Q1和Q2中也只有一個導通,LED3不亮;如果兩個IO都是低電平,那么三個LED自然都不會亮。這樣一來,我們就可以單獨地控制三個LED的亮滅了,進而可以通過頻閃的原理控制三個LED的8種組合狀態。
我簡單搭了個小電路,用兩個IO控制三個LED的流水燈,實現8個LED狀態的循環轉移(000→001→010→...→111→000→001→...),驗證了上面電路的有效性。IO使用了STC8G1K08A-8PIN 的P3.2和P3.3,電阻均為1kΩ,兩個三極管均使用S8050。代碼以及實現效果如下:
代碼:
- #include "STC8G.h"
- #include "intrins.h"
- void led(int a, int b, int c)
- {
- if(a == 1)
- {
- P3 = 0xF7;
- _nop_();
- P3 = 0xF3;
- }
- else _nop_();
- if(b == 1)
- {
- P3 = 0xFB;
- _nop_();
- P3 = 0xF3;
- }
- else _nop_();
- if(c == 1)
- {
- P3 = 0xFF;
- _nop_();
- P3 = 0xF3;
- }
- else _nop_();
- }
- void main()
- {
- unsigned int m;
- P3M0 = 0x0C;
- P3M1 = 0x00;
- P3 = 0xF3;
- while(1)
- {
- for (m=0;m<65535;m++) led(0, 0, 0);
- for (m=0;m<65535;m++) led(0, 0, 1);
- for (m=0;m<65535;m++) led(0, 1, 0);
- for (m=0;m<65535;m++) led(0, 1, 1);
- for (m=0;m<65535;m++) led(1, 0, 0);
- for (m=0;m<65535;m++) led(1, 0, 1);
- for (m=0;m<65535;m++) led(1, 1, 0);
- for (m=0;m<65535;m++) led(1, 1, 1);
- }
- }
復制代碼 代碼一插入進來,TAB縮進全沒了,暈。。。
實現效果:
效果還不錯的,就是要加兩個三極管,不知道你能不能接受。
證明一下,只用了兩個引腳哦,哈哈~
|