数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

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

话说74HC595那么容易 ...

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

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-17 21:09 , Processed in 0.249601 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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