找回密码
 立即注册
楼主: sky999

请教下这种程序怎么写

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15630
发表于 2024-1-14 16:59:13 | 显示全部楼层
I/O 口不够,也是参照下图,
增加 多组,也只是需要增加公共控制端, 公共端的三级管电路可以省略

段码的选择【 P6.7 ~ P6.0】是共享的
截图202401141659346169.jpg

截图202401141659088331.jpg



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-02 00:29:54

10

主题

1159

回帖

5121

积分

论坛元老

积分
5121
发表于 2024-1-14 21:12:40 | 显示全部楼层
sky*** 发表于 2024-1-14 16:44
是的,做了几种扫描程序,都无法做到单独亮1个




查理复用(Charlieplex)是一种在驱动大量LED时有效地节约IO口的方法,理论上可点亮 脚数*(脚数-1)个LED


驱动这种数码管的技术称作查理复用技术(Charlieplexing)

Charlieplexing的介绍
步骤1:一个非常简单的示例

144448nprbpppnb1pzsb00.jpg


请看下面的简单电路,该电路使用两个端口控制两个LED。

这里是工作原理。两个LED反并联连接,红色LED的阳极(左)连接到绿色LED的阴极(右)。

当端口1变为高电平而端口2变为低电平时,则绿色LED点亮,并且当端口1变为低电平并且端口2变为高电平时,红色LED点亮。

步骤2:再增加一个端口。..
144448bz8jpeuq84ye78j8.jpg



144448nvxhhwbi0yydy1n1.jpg


现在,我们增加了一个端口以控制更多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;
}


1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:391
  • 最近打卡:2025-05-02 09:44:56

45

主题

381

回帖

1575

积分

金牌会员

静坐常思己过,闲谈莫论人非

积分
1575
发表于 2024-1-14 22:48:13 | 显示全部楼层
你这样设计硬件电路本身就有逻辑错误,A1亮的话,那么New1为高电平,New2为低电平,其他灭,那么B1,C1,D1就得要求New3,New4,New5就得为高电平。你再看B?那个灯,此时它就亮了。所以说按照要求,你这个硬件设计的本身逻辑是存在问题的,设计之前肯定没画逻辑真值表。硬件上逻辑错误,而程序又是一个逻辑为前提的产物,你说你能写出符合你的要求的程序吗?
处事要代人所想,读书需切己用功
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:391
  • 最近打卡:2025-05-02 09:44:56

45

主题

381

回帖

1575

积分

金牌会员

静坐常思己过,闲谈莫论人非

积分
1575
发表于 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;
处事要代人所想,读书需切己用功
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-02 00:29:54

10

主题

1159

回帖

5121

积分

论坛元老

积分
5121
发表于 2024-1-14 23:55:14 | 显示全部楼层
reng*** 发表于 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




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:391
  • 最近打卡:2025-05-02 09:44:56

45

主题

381

回帖

1575

积分

金牌会员

静坐常思己过,闲谈莫论人非

积分
1575
发表于 2024-1-15 07:28:32 来自手机 | 显示全部楼层
angmall 发表于 2024-1-14 23:55
就是用这个查理复用技术(Charlieplexing)。

5个IO口最多可以控制20个LED

是,理论可以控制20个,但是他要求某一个亮的时候其他都不亮,就排除了好多情况,最后只剩下8个了
处事要代人所想,读书需切己用功
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-02 07:32:37

21

主题

564

回帖

2678

积分

金牌会员

积分
2678
发表于 2024-1-15 09:54:03 | 显示全部楼层
12楼讲得好,学习了
回复 支持 反对

使用道具 举报 送花

46

主题

108

回帖

604

积分

高级会员

积分
604
发表于 2024-1-15 10:22:33 | 显示全部楼层
angm*** 发表于 2024-1-14 21:12
查理复用(Charlieplex)是一种在驱动大量LED时有效地节约IO口的方法,理论上可点亮 脚数*(脚数-1) ...

确实可行,程序测试正常,非常感谢,今天刚写完程序,测试也是正常的,因为一直以来,IO口初始化都用在程序最开始了,没想过可以用在子函数里面,谢谢你提醒,也感谢你打了这么多的字,实在是感激不尽,祝你2024万事如意
回复 支持 反对

使用道具 举报 送花

46

主题

108

回帖

604

积分

高级会员

积分
604
发表于 2024-1-15 10:23:30 | 显示全部楼层
reng*** 发表于 2024-1-14 22:48
你这样设计硬件电路本身就有逻辑错误,A1亮的话,那么New1为高电平,New2为低电平,其他灭,那么B1,C1,D1就 ...

感谢你的回复,12楼是正确的,也是可行的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-02 00:29:54

10

主题

1159

回帖

5121

积分

论坛元老

积分
5121
发表于 2024-1-15 14:57:14 | 显示全部楼层
sky*** 发表于 2024-1-15 10:22
确实可行,程序测试正常,非常感谢,今天刚写完程序,测试也是正常的,因为一直以来,IO口初始化都用在程 ...

很高兴。能够帮到你。
希望你的程序可以分享一下。

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 21:03 , Processed in 0.134749 second(s), 116 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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