如果你不介意多用两个三极管的话,可以用两个三极管通过与逻辑控制一个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缩进全没了,晕。。。
实现效果:
效果还不错的,就是要加两个三极管,不知道你能不能接受。
证明一下,只用了两个引脚哦,哈哈~
|