数码之家

 找回密码
 立即注册
搜索
查看: 3831|回复: 25

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

[复制链接]
发表于 2023-3-27 23:04:51 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

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

x
我做了多个LED数码管显示的电子钟和定时器,使用74HC595驱动, 一直通电使用,目前已经有3个74HC595损坏, 亮度又不算高,驱动电流也不大,搞不清哪里出问题了。

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

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

TM1640_command3的低3位是亮度设置。

tm1640.PNG


  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



打赏

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

查看全部打赏

相关帖子

发表于 2023-3-28 01:43:05 | 显示全部楼层
终于看到一个热乎的 话说  看到什么都没用 貌似很有可能我们回国就下船了
上船带的东西真的不够用
回复 支持 反对

使用道具 举报

发表于 2023-3-29 17:06:24 | 显示全部楼层
楼主牛逼啊,前两天刚看到你在我帖子说TM1640驱动数码管,这就自己搞显示驱动了啊。

话说74HC595那么容易坏的吗?还好我一直没用这东西,要不然估计要被坑死了
回复 支持 反对

使用道具 举报

发表于 2023-3-29 19:11:05 | 显示全部楼层
lemontreenm 发表于 2023-3-29 17:06
楼主牛逼啊,前两天刚看到你在我帖子说TM1640驱动数码管,这就自己搞显示驱动了啊。

话说74HC595那么容易 ...

我这刚学 也不懂  好像LED点阵屏上面很多吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-29 19:19:17 | 显示全部楼层
lemontreenm 发表于 2023-3-29 17:06
楼主牛逼啊,前两天刚看到你在我帖子说TM1640驱动数码管,这就自己搞显示驱动了啊。

话说74HC595那么容易 ...

我坏的那3个595有两个不同的国产牌子,都是在立创买的,(这3个是两年时间跨度)。
  现在市面流行的LED显示屏都是用595驱动,也有部分坏的机率。   我自己这个坏的还搞不明问题出在哪,怀疑是质量问题, 所以早就想换驱动电路。目前这个TM1640用着没问题,亮度调节方便,而且还不需要限流电阻。
回复 支持 反对

使用道具 举报

发表于 2023-3-29 22:18:40 | 显示全部楼层
wpll 发表于 2023-3-29 19:11
我这刚学 也不懂  好像LED点阵屏上面很多吧

对,貌似在LED点阵屏,就是一些店铺门口那种屏幕上看到用的比较多
回复 支持 反对

使用道具 举报

发表于 2023-3-29 22:20:08 | 显示全部楼层
本帖最后由 lemontreenm 于 2023-3-29 22:21 编辑
广东梁百万 发表于 2023-3-29 19:19
我坏的那3个595有两个不同的国产牌子,都是在立创买的,(这3个是两年时间跨度)。
  现在市面流行的LED ...

经常看到一些店铺的LED屏幕坏了一部分,一直不知道原因在哪里,不过显然不是LED烧坏,LED烧坏不会是一片一片的。原来是74芯片坏了。看来这货确实不耐用。

TM1640我没用过,不过一直在用TM1637,做了个LED断码屏时钟,有2个,都工作1年以上了,没有出现问题
回复 支持 反对

使用道具 举报

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

`H{D`ZP]FJ8XR2P40]E}Z{2.jpg
回复 支持 反对

使用道具 举报

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

使用道具 举报

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


STC8H4K64TL-45I-LQFP48, 是专业的 大电流 LED数码管自动涮新的 1T 8051
image.png
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-20 20:36 , Processed in 0.218400 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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