找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1843|回复: 19
收起左侧

如何让单片机两个io口控制三个LED显示呢?

  [复制链接]
ID:915590 发表于 2022-9-15 09:29 | 显示全部楼层 |阅读模式
Schematic_fan_2022-09-13.png
我的单片机原理图是这样的,想用两个io控制三个LED显示,但是LED口输入状态时,并没有办法让两个LED同时熄灭,反而同时点亮,实际加大了LED后面电阻也很难熄灭LED
回复

使用道具 举报

ID:958776 发表于 2022-9-15 11:42 | 显示全部楼层
这个电路再加几个电阻不知道行不行得通,电阻位置不合适的话处于00状态的话应该3个灯都可能亮吧....
25012ba8ab373196cd5ba13012a7d4f.jpg
回复

使用道具 举报

ID:884147 发表于 2022-9-15 13:08 | 显示全部楼层
楼主没有看到51板块8楼的解决方案吗?高阻不亮是经过验证的。
回复

使用道具 举报

ID:893997 发表于 2022-9-15 13:18 | 显示全部楼层
可以用逻辑矛盾的方式
回复

使用道具 举报

ID:31164 发表于 2022-9-15 13:39 | 显示全部楼层
同时熄灭,同时亮两个LED并联不可以吗
回复

使用道具 举报

ID:1044839 发表于 2022-9-15 14:07 | 显示全部楼层
这玩意搞个编码器可以吗
回复

使用道具 举报

ID:924874 发表于 2022-9-15 14:41 | 显示全部楼层
首先你要搞清楚你想要得到或实现一个怎样的亮灯结果,再考虑设计电路。
就你贴出来的电路而言D6就独占了一个IO,D2\D3共享一个IO。对于独占来说LED亮灭自由控制,而你这个共享就要看你想实现怎样的一个LED亮灭逻辑了,如IO为三态就可想你现在这个下的LED几种状态了
回复

使用道具 举报

ID:924874 发表于 2022-9-15 14:52 | 显示全部楼层
你的问题是不是想问:一个IO实现两个LED的三种状态[1亮2灭、2亮1灭、1 2都灭]控制?
回复

使用道具 举报

ID:213173 发表于 2022-9-15 17:37 | 显示全部楼层
用尽量少的IO口控制尽量多的LED通常采用查理复用方法。计算公式N *(N - 1)= 个LED。这显然不能满足楼主“两个IO口控制三个LED”的要求。解决这个问题有多种方法,沙发提供的方法最简单,但前提条件是IO口要能设置为推挽模式。
回复

使用道具 举报

ID:1007932 发表于 2022-9-15 20:18 | 显示全部楼层
电路结构是可以的,有的充电器跳灯就是这样的结构,要调节LED输入电压大于一个LED小于两个LED,所以只串电阻没啥用,还得串二极管,或用稳压管稳压芯片之类的。
回复

使用道具 举报

ID:1034262 发表于 2022-9-16 00:02 | 显示全部楼层
每个IO可以控制2个LED,2个电阻接VCC、GND,分压点接两个LED背靠背,LED另一端接IO。
IO高电平亮LED1,低电平亮LED2,高阻则两个都不亮,方波驱动则两个同时亮,PWM驱动还可以独立调光。

所以,2个IO可以独立控制4个LED互不干扰。
回复

使用道具 举报

ID:441351 发表于 2022-9-16 12:02 | 显示全部楼层
如果你不介意多用两个三极管的话,可以用两个三极管通过与逻辑控制一个LED,另外两个LED用电平本身控制。电路图如下:
20220916103117.jpg
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。代码以及实现效果如下:

代码:
  1. #include "STC8G.h"
  2. #include "intrins.h"

  3. void led(int a, int b, int c)
  4. {
  5.         if(a == 1)
  6.         {
  7.                 P3 = 0xF7;
  8.                 _nop_();
  9.                 P3 = 0xF3;
  10.         }
  11.         else _nop_();
  12.         if(b == 1)
  13.         {
  14.                 P3 = 0xFB;
  15.                 _nop_();
  16.                 P3 = 0xF3;
  17.         }
  18.         else _nop_();
  19.         if(c == 1)
  20.         {
  21.                 P3 = 0xFF;
  22.                 _nop_();
  23.                 P3 = 0xF3;
  24.         }
  25.         else _nop_();
  26. }

  27. void main()
  28. {
  29.         unsigned int m;
  30.         P3M0 = 0x0C;
  31.         P3M1 = 0x00;
  32.         P3 = 0xF3;
  33.         while(1)
  34.         {       
  35.                 for (m=0;m<65535;m++) led(0, 0, 0);
  36.                 for (m=0;m<65535;m++) led(0, 0, 1);
  37.                 for (m=0;m<65535;m++) led(0, 1, 0);
  38.                 for (m=0;m<65535;m++) led(0, 1, 1);
  39.                 for (m=0;m<65535;m++) led(1, 0, 0);
  40.                 for (m=0;m<65535;m++) led(1, 0, 1);
  41.                 for (m=0;m<65535;m++) led(1, 1, 0);
  42.                 for (m=0;m<65535;m++) led(1, 1, 1);
  43.         }
  44. }
复制代码
代码一插入进来,TAB缩进全没了,晕。。。

实现效果:
20220916065556-6bcc1cced7.[gif-2-mp4.com].gif
效果还不错的,就是要加两个三极管,不知道你能不能接受。

20220916115910.jpg
证明一下,只用了两个引脚哦,哈哈~


回复

使用道具 举报

ID:915590 发表于 2022-9-16 15:06 | 显示全部楼层
songb11 发表于 2022-9-15 14:52
你的问题是不是想问:一个IO实现两个LED的三种状态[1亮2灭、2亮1灭、1 2都灭]控制?

我是想实现,1亮2灭,12亮,12灭
回复

使用道具 举报

ID:16255 发表于 2022-9-19 11:35 | 显示全部楼层
用芯片控制,I2C通信,想控制多少个灯都可以,一个或多个灯随便亮。
1.jpg
回复

使用道具 举报

ID:161164 发表于 2022-9-19 14:33 | 显示全部楼层
逍遥111111 发表于 2022-9-15 11:42
这个电路再加几个电阻不知道行不行得通,电阻位置不合适的话处于00状态的话应该3个灯都可能亮吧....

妙啊,动态输出就可以任意控制LED的亮灭
1.jpeg
回复

使用道具 举报

ID:624769 发表于 2022-9-19 14:59 | 显示全部楼层
lkc8210 发表于 2022-9-19 14:33
妙啊,动态输出就可以任意控制LED的亮灭

5V供电, 3个LED都是红色 LED 的话, 全高阻,3灯都会亮, 虽然亮的比较暗
回复

使用道具 举报

ID:466997 发表于 2022-9-19 15:24 | 显示全部楼层
12#楼的同志很有想法,充满智慧。值得学习
回复

使用道具 举报

ID:161164 发表于 2022-9-19 15:34 | 显示全部楼层
188610329 发表于 2022-9-19 14:59
5V供电, 3个LED都是红色 LED 的话, 全高阻,3灯都会亮, 虽然亮的比较暗

加上电阻就好了
回复

使用道具 举报

ID:491577 发表于 2022-9-19 17:30 | 显示全部楼层
3个IO,控制3个LED和一个按键。楼主非要用一个IO控制按键,2个IO控制3个LED,自讨苦吃。IO复用是有讲究的,不是随意,明显用一个IO控制一个LED和一个按键,其他2个IO控制2个LED才是正解。
回复

使用道具 举报

ID:884147 发表于 2022-9-19 19:31 | 显示全部楼层
最符合楼主要求的就是充分利用高阻,一个I/O口驱动2个LED,两个口可以驱动4个LED。在楼主另一个板块同样的提问已经有方案了,可是有价值的都没有回复不知完成的怎么样了。其实最主要的就是在高阻时要保证2个LED都不亮,2个二极管是为了更可靠保证高阻时不亮,加大电阻是没用的,前边已经说了IO口要有高阻和推挽方式,要用压降大的发光管,压降不够加二极管,下图是经过验证的。 51hei图片_20220919190636.jpg

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表