找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 371|回复: 18
打印 上一主题 下一主题
收起左侧

请教前辈,用TM1638驱动7位数码管+8个LED,能不能通过软件控制

[复制链接]
跳转到指定楼层
楼主
ID:1109793 发表于 2025-7-20 12:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
某个LED的亮度,而不是全亮和全灭。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:384109 发表于 2025-7-20 22:07 | 只看该作者
可以调节亮度,但这类芯片都是调节所有LED的亮度,无法单独调节其中某段LED的亮度
回复

使用道具 举报

板凳
ID:774370 发表于 2025-7-20 23:01 | 只看该作者
可以软件控制整体亮度共8级,控制单个亮度硬件串联电阻实现
回复

使用道具 举报

地板
ID:1064915 发表于 2025-7-21 08:33 | 只看该作者
TM1638的显示控制指令主要用于设置数码管的亮度等级和显示状态。具体功能如下:

亮度调节
通过指令0x8X(X=0~7)设置亮度等级,共8级亮度调节,其中0x80为关闭显示,0x8F为最大亮度开启显示。 ‌
指令发送规则
显示控制指令的发送遵循特定格式:

  指令字节的最高两位(B7、B6)必须为10以区分指令类型;
  后续数据位用于设置具体参数(如亮度等级)。 ‌
通信协议要点
  发送指令前需将STB信号拉低以启动传输;
  数据传输采用类SPI协议,在CLK时钟上升沿锁存数据;
  传输结束后需将STB拉高以结束通信。
回复

使用道具 举报

5#
ID:69038 发表于 2025-7-21 10:58 | 只看该作者
可以变通为脉宽控制,1638的最大时钟约为1M,最长数据帧约为14字节,加上控制字、应答什么的,算20字节,1M/20*8约为6.25K。暂定为6KHz的脉宽周期,想控哪个灯,就让它的数据位置1或0,就可以调节该灯的亮度了。
===================免责声明======================
==以上内容纯瞎想乱敲,本人对此不承担法律/道德层面的任何义务和责任==
===================声明结束======================

不过这么做,你的MCU肯定会忙死。除非它只执行这个点灯控亮的任务
回复

使用道具 举报

6#
ID:1133081 发表于 2025-7-21 11:20 | 只看该作者
用TM1638只能控制数码管整体亮度,不可单独控制某段或某位的亮度。如果想单独控制某段或某位的亮度只能用MCU直接驱动数码管来实现。
回复

使用道具 举报

7#
ID:879809 发表于 2025-7-21 14:40 | 只看该作者
不可能,别想了。
回复

使用道具 举报

8#
ID:1109793 发表于 2025-7-21 18:15 | 只看该作者
我是需要平时一个很暗的亮度,用来提高显示的位置的醒目,需要的时候要全亮。看来是不行的,只能用164的方案了。
回复

使用道具 举报

9#
ID:230500 发表于 2025-7-22 07:55 | 只看该作者
正常是不可以单独调亮度,
回复

使用道具 举报

10#
ID:996773 发表于 2025-7-22 09:09 | 只看该作者
zhuls 发表于 2025-7-21 10:58
可以变通为脉宽控制,1638的最大时钟约为1M,最长数据帧约为14字节,加上控制字、应答什么的,算20字节,1M ...

你的思路是对的,一个有创意的程序员就应该有超常人的思维,让单片机不停的发1638显示数据,例如一秒钟
内发送一百次,有五十次正常显示字段,另外五十次把需要变暗的字段归0或归1不显示,人眼就看的出那个字符
是灰暗的,目的也达到
回复

使用道具 举报

11#
ID:1109793 发表于 2025-7-22 12:43 | 只看该作者
hi等你 发表于 2025-7-22 09:09
你的思路是对的,一个有创意的程序员就应该有超常人的思维,让单片机不停的发1638显示数据,例如一秒钟
...

我也想到这种方法了,我的代码是在主循环里面更新显示的,通过计数的方式控制写入的某个位的值,结果不行,闪,而不是亮度变化的,我是10次刷新中有1次写1,其余写0,不行。
可能是和1638的扫描不同步的问题吧。毕竟主循环也不会那么快。
回复

使用道具 举报

12#
ID:69038 发表于 2025-7-22 16:13 | 只看该作者
xiaobendan001 发表于 2025-7-22 12:43
我也想到这种方法了,我的代码是在主循环里面更新显示的,通过计数的方式控制写入的某个位的值,结果不行 ...

“闪”的原因是你刷新数据的速度不够快!
人的视觉残留时间是多少?参考电影的帧速率为24-30帧/秒,就能算出来约33~41ms,
即最多41ms,最少33ms,你就要发一次数据(暂不管1638自扫时间)。
再来看你的总占空比的多少,即多少级亮度,如果是8级,就要8等分这帧时间了:
假设某位对应某LED,置“1”为亮,置“0”为灭,当设为1级亮度时,发“1”的数据1次,发“0”的数据7次。。。
所以41/8或33/8,最多5ms,最少4ms你就得发一帧数据,且不被中断、周而复始。。
那么,你用main中的while(1)显然是不够的,你要开一个优先级最高的定时器,固定4ms发一次数据。
而在main中的while(1)中不停地更新要发送的数据,所以,你的51MCU会很忙!
注意,这才8级,且每帧数据只发一次。
如果是要稳定地显示,且祼眼视觉不闪,每帧数据都重复多次。。。
那你的定时器需要更短的时间来响应。。。
其实这方法很有用的,还可以在点阵黑白屏上做出灰度的像素点来。。
回复

使用道具 举报

13#
ID:1109793 发表于 2025-7-23 07:36 | 只看该作者
zhuls 发表于 2025-7-22 16:13
“闪”的原因是你刷新数据的速度不够快!
人的视觉残留时间是多少?参考电影的帧速率为24-30帧/秒,就能 ...

如果是液晶,反应速度比较慢,可能反而好搞一些吧
LED反应速度比较快,我这主定时是1MS的,毕竟有其他工作要做的。主循环中只有读写1638的两个函数,按键也没有使用。我倒是没有看具体操作周期是多少。
我想大概是我写入了1,1638正好扫描完成了,等下次扫描的时候,我又写入了0,如此这次的1就没有显示。
回复

使用道具 举报

14#
ID:584814 发表于 2025-7-23 09:08 | 只看该作者
完全没问题,只要LED个数不超过64都可以。
回复

使用道具 举报

15#
ID:1109793 发表于 2025-7-23 09:17 | 只看该作者
刚用示波器看了下1638的位选输出间隔5MS一次。
我写数据的周期看不清,因为是循环的,一直在进行。从信号间隔规律来说的话一次更新显示的周期大概5.5MS左右。太慢了,指定是不行了
回复

使用道具 举报

16#
ID:69038 发表于 2025-7-23 10:56 | 只看该作者
这样的LED发送数据最好能放在定时器中。。让中断定时发送。
不知你亮度设为几级?

这个我得找个板测试一下。。
回复

使用道具 举报

17#
ID:1109793 发表于 2025-7-23 12:42 | 只看该作者
zhuls 发表于 2025-7-23 10:56
这样的LED发送数据最好能放在定时器中。。让中断定时发送。
不知你亮度设为几级?

除非更新显示数据的速度大大超过芯片自己的扫描速度。
否则在无法同步的情况下,必然会闪的。
话说有没有类似的LED驱动芯片能做到单独的某个段可以调节亮度的。
回复

使用道具 举报

18#
ID:69038 发表于 2025-7-23 17:13 | 只看该作者
不嫌麻烦可以用WS2812,还是全彩的,可级联的。。。。
就是时序要求比较严格,一般12T的MCU驱动不易。
回复

使用道具 举报

19#
ID:69038 发表于 2025-7-23 17:51 | 只看该作者
xiaobendan001 发表于 2025-7-23 12:42
除非更新显示数据的速度大大超过芯片自己的扫描速度。
否则在无法同步的情况下,必然会闪的。
话说有没 ...

MS不用,只要动态刷新速度跟上视觉就行了。
因为1638的RC约450K,刷新速度要超过它很显然是很难的,简单说就是不可能的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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