神农鼎
发表于 2024-1-14 16:59:13
I/O 口不够,也是参照下图,
增加 多组,也只是需要增加公共控制端, 公共端的三级管电路可以省略
段码的选择【 P6.7 ~ P6.0】是共享的
angmall
发表于 2024-1-14 21:12:40
sky999 发表于 2024-1-14 16:44
是的,做了几种扫描程序,都无法做到单独亮1个
查理复用(Charlieplex)是一种在驱动大量LED时有效地节约IO口的方法,理论上可点亮 脚数*(脚数-1)个LED
驱动这种数码管的技术称作查理复用技术(Charlieplexing)
Charlieplexing的介绍
步骤1:一个非常简单的示例
请看下面的简单电路,该电路使用两个端口控制两个LED。
这里是工作原理。两个LED反并联连接,红色LED的阳极(左)连接到绿色LED的阴极(右)。
当端口1变为高电平而端口2变为低电平时,则绿色LED点亮,并且当端口1变为低电平并且端口2变为高电平时,红色LED点亮。
步骤2:再增加一个端口。..
现在,我们增加了一个端口以控制更多LED。我将电路分为3个子电路,每个子电路显示2个端口。因此,我们有2个LED由端口1和2控制,另外两个LED由端口1和3控制,另外2个LED由端口2和3控制,总共6个LED。
与以前一样,微控制器仅通过3个端口即可单独控制6个LED。如我之前所说,charlieplexing利用微控制器端口的三态。但是如何?
让我们用3个端口和6个LED重新绘制相同的电路,但是这次我们将不分别绘制它们:
当端口1为HIGH且端口3为低电平,则L6将点亮。但是端口2必须处于什么状态?如果端口2为高电平,则L4也将点亮,如果端口2为低电平,则L2将同时点亮。因此,为避免不必要的情况,端口2必须处于高阻抗状态。我们将此引脚设为输入。如果我们尝试点亮L2,当然同样适用。端口1应该变为高电平,而端口2应该变为低电平。如果端口3为高电平,则L3也将点亮,如果端口3为低电平,则L6将同时点亮。因此,一般规则是,只有两个端口可以同时输出,而其他所有端口都可以通过将它们定义为输入来处于高阻抗状态。
无奈才写了3个IO口控制4个LED的程序。由于LED数量太少,就没有费神精炼代码,只把4个LED驱动封装成函数调用。权当抛砖引玉。
void LED1()
{
P3M0=0x03;//P3.0推、3.1推、3.2高0000 0011
P3M1=0x04;//P3.0推、3.1推、3.2高0000 0100
P30=0;P31=1;P32=1;
}
void LED2()
{
P3M0=0x03;//P3.0推、3.1推、3.2高0000 0011
P3M1=0x04;//P3.0推、3.1推、3.2高0000 0100
P30=1;P31=0;P32=1;
}
void LED3()
{
P3M0=0x06;//P3.0高、3.1推、3.2推0000 0110
P3M1=0x01;//P3.0高、3.1推、3.2推0000 0001
P30=1;P31=0;P32=1;
}
void LED4()
{
P3M0=0x06;//P3.0高、3.1推、3.2推0000 0110
P3M1=0x01;//P3.0高、3.1推、3.2推0000 0001
P30=1;P31=1;P32=0;
}
rengran
发表于 2024-1-14 22:48:13
你这样设计硬件电路本身就有逻辑错误,A1亮的话,那么New1为高电平,New2为低电平,其他灭,那么B1,C1,D1就得要求New3,New4,New5就得为高电平。你再看B?那个灯,此时它就亮了。所以说按照要求,你这个硬件设计的本身逻辑是存在问题的,设计之前肯定没画逻辑真值表。硬件上逻辑错误,而程序又是一个逻辑为前提的产物,你说你能写出符合你的要求的程序吗?
rengran
发表于 2024-1-14 23:13:31
分析了一下,按照你的要求,最多只能控制8个灯。这8个灯有5种方案情况分别是:
1-2,1-3,1-4,1-5,2-1,3-1,4-1,5-1;
2-1,2-3,2-4,2-5,1-2,3-2,4-2,5-2;
3-1,3-2,3-4,3-5,1-3,2-3,4-3,5-3;
4-1,4-2,4-3,4-5,1-4,2-4,3-4,5-4;
5-1,5-2,5-3,5-4,1-5,2-5,3-5,4-5;
angmall
发表于 2024-1-14 23:55:14
rengran 发表于 2024-1-14 23:13
分析了一下,按照你的要求,最多只能控制8个灯。这8个灯有5种方案情况分别是:
1-2,1-3,1-4,1-5,2-1,3-1,4-1 ...
就是用这个查理复用技术(Charlieplexing)。
5个IO口最多可以控制20个LED
rengran
发表于 2024-1-15 07:28:32
angmall 发表于 2024-1-14 23:55
就是用这个查理复用技术(Charlieplexing)。
5个IO口最多可以控制20个LED
是,理论可以控制20个,但是他要求某一个亮的时候其他都不亮,就排除了好多情况,最后只剩下8个了
wangxiangtan
发表于 2024-1-15 09:54:03
12楼讲得好,学习了
sky999
发表于 2024-1-15 10:22:33
angmall 发表于 2024-1-14 21:12
查理复用(Charlieplex)是一种在驱动大量LED时有效地节约IO口的方法,理论上可点亮 脚数*(脚数-1) ...
确实可行,程序测试正常,非常感谢,今天刚写完程序,测试也是正常的,因为一直以来,IO口初始化都用在程序最开始了,没想过可以用在子函数里面,谢谢你提醒,也感谢你打了这么多的字,实在是感激不尽,祝你2024万事如意
sky999
发表于 2024-1-15 10:23:30
rengran 发表于 2024-1-14 22:48
你这样设计硬件电路本身就有逻辑错误,A1亮的话,那么New1为高电平,New2为低电平,其他灭,那么B1,C1,D1就 ...
感谢你的回复,12楼是正确的,也是可行的
angmall
发表于 2024-1-15 14:57:14
sky999 发表于 2024-1-15 10:22
确实可行,程序测试正常,非常感谢,今天刚写完程序,测试也是正常的,因为一直以来,IO口初始化都用在程 ...
很高兴。能够帮到你。
希望你的程序可以分享一下。