数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 7851|回复: 25

[C51] 8段*16位 LED显示驱动TM1640,附参考程序,本论坛首发

[复制链接]
发表于 2023-3-27 23:04:51 | 显示全部楼层 |阅读模式
我做了多个LED数码管显示的电子钟和定时器,使用74HC595驱动, 一直通电使用,目前已经有3个74HC595损坏, 亮度又不算高,驱动电流也不大,搞不清哪里出问题了。

最近尝试用TM1640驱动,有8级亮度调节, 无需限流电阻,与单片机连接只需2个端口。网上找不到合适的驱动程序,按立创商城提供的PDF文档列出的数据传输格式,我自己编写了C51单片机的驱动程序,给有需要的人参考下。

一片TM1640可以驱动8段*16位的数码管,比74HC595方便很多。

TM1640_command3的低3位是亮度设置。




  1. //----------下面是端口和变量定义

  2.          sbit TM16_DIN = P3^5;   //TM1640的串口数据输入DI  
  3.          sbit TM16_SCK = P3^6;   //TM1640的时钟输入SCK  

  4.   unsigned char xdata TM1640_DATA[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//显示的数据
  5.   unsigned char xdata TM1640_command1=0x40;//数据设置
  6.   unsigned char xdata TM1640_command2=0xc0;//地址设置
  7.   unsigned char xdata TM1640_command3=0x89;//显示模式与亮度




  8. //---------------------------下面是驱动程序

  9.       //TM1640--共阴LED驱动

  10.               void TM16_LED()          //TM1640共阴LED驱动2
  11.                  {
  12.                    unsigned char xdata i,j=0,k=0;
  13.                     unsigned char xdata tmp1;  //临时缓存
  14.                      TM16_DIN =1; //数据和时钟端口拉高
  15.                    TM16_SCK =1;
  16.                         
  17.                    TM16_DIN = 0;  //开始位
  18.                   nop_();
  19.                   TM16_SCK =0;   //开始位
  20.                   nop_();                           
  21.                        tmp1=TM1640_command1;  //先发送数设置字节
  22.                        for(i=0; i<8; i++)
  23.                      {
  24.                         tmp1>>=1;//低位移出到CY
  25.                       TM16_DIN = CY;      
  26.                      TM16_SCK =1;
  27.                     nop_();
  28.                     nop_();      
  29.                      TM16_SCK =0;
  30.                     nop_();      
  31.                      TM16_DIN =0;
  32.                         }

  33.                      TM16_SCK =1;  //停止位
  34.                     nop_();   
  35.                    TM16_DIN =1;  //停止位
  36.                     nop_();
  37.                      TM16_DIN = 0;  //开始位
  38.                     nop_();
  39.                     TM16_SCK =0;   //开始位
  40.                     nop_();                       
  41.                        tmp1=TM1640_command2;  //再发送地址字节
  42.                        for(i=0; i<8; i++)
  43.                        {
  44.                        tmp1>>=1;//低位移出到CY
  45.                       TM16_DIN = CY;
  46.                      TM16_SCK =1;
  47.                     nop_();
  48.                     nop_();      
  49.                     TM16_SCK =0;
  50.                     nop_();           
  51.                    TM16_DIN =0;
  52.                         }

  53.        for(j=0; j<16; j++)     //j是LED数码管显示个数
  54.           {
  55.                 tmp1=TM1640_DATA[k];
  56.                for(i=0; i<8; i++)
  57.             {
  58.                     tmp1>>=1;//低位移出到CY
  59.                     TM16_DIN = CY;
  60.                     TM16_SCK =1;
  61.                     nop_();
  62.                     nop_();               
  63.                                 TM16_SCK =0;
  64.                     nop_();                        
  65.                                 TM16_DIN =0;
  66.                         }                                                   
  67.                         k++;               
  68.                     }
  69.                         TM16_SCK =1;  //停止位
  70.                     nop_();      
  71.                    TM16_DIN =1;  //停止位
  72.                     nop_();         
  73.                     TM16_DIN = 0;  //开始位
  74.                     nop_();
  75.                     TM16_SCK =0;   //开始位
  76.                     nop_();                        
  77.                       tmp1=TM1640_command3;  //发送亮度控制字节
  78.                       for(i=0; i<8; i++)
  79.                         {
  80.                        tmp1>>=1;//低位移出到CY
  81.                       TM16_DIN = CY;
  82.                      TM16_SCK =1;
  83.                     nop_();
  84.                     nop_();   
  85.                      TM16_SCK =0;
  86.                     nop_();   
  87.                      TM16_DIN =0;
  88.                         }               
  89.                     TM16_SCK =1;  //停止位
  90.                     nop_();
  91.                   TM16_DIN =1;  //停止位
  92.                     nop_();
  93.                    }        
复制代码



相关阅读:硬件SPI驱动TM1640:https://www.mydigit.cn/thread-386290-1-1.html



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 2家元 +240 收起 理由
IlovePLC + 30 辛苦你了,收藏
家睦 + 210

查看全部打赏

头像被屏蔽
发表于 2023-5-31 09:42:22 | 显示全部楼层
lemontreenm 发表于 2023-5-30 21:26
STC真是什么实用就做什么啊。
这个芯片价格太高了,用不起,我要求也没那么高,所以普通的单片机就够用了 ...

普通的也有的选,价格从0.69起
STC就是做超市,你要啥MCU都有:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2023-5-30 21:26:52 | 显示全部楼层
钟山风雨起苍黄 发表于 2023-5-30 19:46
STC8H4K64TL-45MHz-LQFP48/LQFP32/TSSOP20 实现
===1,触摸按键;2,RTC/日历时钟;3,PWM发声 !
===2,80 ...

STC真是什么实用就做什么啊。
这个芯片价格太高了,用不起,我要求也没那么高,所以普通的单片机就够用了
回复 支持 反对

使用道具 举报

发表于 2023-5-30 19:46:40 | 显示全部楼层
STC8H4K64TL-45MHz-LQFP48/LQFP32/TSSOP20 实现
===1,触摸按键;
2,RTC/日历时钟;3,PWM发声 !
===2,80mA大电流LED数码管自动刷新,可支持32个8段数码管



32个8段大电流LED数码管自动刷新显示, STC8H4K64TL-45MHz-LQFP48 - 我爱单片机 数码之家 (mydigit.cn)
回复 支持 反对

使用道具 举报

发表于 2023-5-30 16:17:52 | 显示全部楼层
lemontreenm 发表于 2023-5-30 13:35
我之前一直用的TM1637,没太注意这个微微发亮的事。看来今晚要观察下了。
不过我这次用的是MCU直接驱动LE ...

如果同时使用键盘和显示,还会有按键影响显示的问题,就是按的时候,字段的亮度会变化

好处也有,很省端口
回复 支持 反对

使用道具 举报

发表于 2023-5-30 13:35:34 | 显示全部楼层
inthsunshine 发表于 2023-5-30 12:26
估计lz用的595质量不好,我搞过几个,没坏

595显示效果好,可以做到不显示的字段完全消隐,

我之前一直用的TM1637,没太注意这个微微发亮的事。看来今晚要观察下了。
不过我这次用的是MCU直接驱动LED灯,1颗芯片搞定所有
回复 支持 反对

使用道具 举报

发表于 2023-5-30 12:26:31 | 显示全部楼层
本帖最后由 inthsunshine 于 2023-5-30 12:32 编辑
lemontreenm 发表于 2023-3-29 17:06
楼主牛逼啊,前两天刚看到你在我帖子说TM1640驱动数码管,这就自己搞显示驱动了啊。

话说74HC595那么容易 ...

估计lz用的595质量不好,我搞过几个,没坏

595显示效果好,可以做到不显示的字段完全消隐,



TM这种键盘显示共用芯片,效果则差很多,不显示的也会微微发光,而且各段的亮度还不均匀,实际效果比照片更差
这张图,已经能看出未显示字段有微弱发光


对比一下595的细节图



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2023-5-18 08:28:45 | 显示全部楼层
595是经常看到  TM1640都是在家用电器上看到多
回复 支持 反对

使用道具 举报

发表于 2023-5-18 02:54:58 来自手机浏览器 | 显示全部楼层
没贴完整吧,具体的显示怎么调用呢?
还有读取功能实现了吗?
回复 支持 反对

使用道具 举报

发表于 2023-5-15 12:03:08 | 显示全部楼层
这类芯片确实方便,我也买了几块带aip1637(类似tm1640)的数码管,还没测试。谢谢分享的程序。
回复 支持 反对

使用道具 举报

发表于 2023-5-9 20:57:50 | 显示全部楼层
mmxx2015 发表于 2023-5-9 18:38
16 COM * 8 SEG,128点,一个16*16的汉字都需要256点,可以显示一个英文字符。

驱动点阵屏的好像都是595  那个一个芯片只能驱动8个点 比这个还少得多
回复 支持 反对

使用道具 举报

发表于 2023-5-9 20:33:33 | 显示全部楼层
本帖最后由 慕名而来 于 2023-5-9 20:35 编辑

还好我用的74HC595没那么脆弱,有两个5位1寸的LED数码闹表已经连续运行了十几年也没坏,或许是新品不靠谱了。
回复 支持 反对

使用道具 举报

发表于 2023-5-9 18:38:58 来自手机浏览器 | 显示全部楼层
wpll 发表于 2023-5-9 18:28
这个能不能驱动点阵屏啊
要是能的话 太好了

16 COM * 8 SEG,128点,一个16*16的汉字都需要256点,可以显示一个英文字符。
回复 支持 反对

使用道具 举报

发表于 2023-5-9 18:28:59 | 显示全部楼层
这个能不能驱动点阵屏啊
要是能的话 太好了
回复 支持 反对

使用道具 举报

发表于 2023-3-31 07:52:04 来自手机浏览器 | 显示全部楼层
用1637吧还没有用坏的…
回复 支持 反对

使用道具 举报

发表于 2023-3-31 07:07:22 来自手机浏览器 | 显示全部楼层
感谢分享后续用的看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-30 23:04:00 来自手机浏览器 | 显示全部楼层
疯狂的兔子来了 发表于 2023-3-30 08:34
楼主可以用 STC8H4K64TL-45MHz-LQFP48, 大电流自动刷新

行,下个项目会考虑下
回复 支持 反对

使用道具 举报

发表于 2023-3-30 19:37:03 | 显示全部楼层


STC8H4K64TL-45I-LQFP48, 是专业的 大电流 LED数码管自动涮新的 1T 8051

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2023-3-30 15:04:11 | 显示全部楼层
不错不错,学习了
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2023-3-30 08:34:07 | 显示全部楼层
楼主可以用 STC8H4K64TL-45MHz-LQFP48, 大电流自动刷新


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-19 16:19 , Processed in 0.140400 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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