找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 139|回复: 1
收起左侧

TM1640驱动16位8段LED数码管实验

[复制链接]
ID:97023 发表于 2025-9-5 11:53 | 显示全部楼层 |阅读模式
前段时间发了用洞洞板制作LED数码管模块的文章,
本坛网友“chxelc”建议,可以用TM1640等芯片通过两根线就可以驱动多位数码管,所以买了10片TM1640再次进行实验。
TM1640.jpg
封装:SSOP-28
封装.png
共阴电路原理图:
电路图:共阴.png
用“立创”的EDA设计了PCB:
PCB设计.png
0.36寸四位LED数码管长度是3.0CM,4个的长度就是12CM,排成一行的话就超过了“立创”10CM边长免费的限制,但想到10CM边长正方形对角线的长度已超过12CM,经实际放置,确实如此。因此就将整个PCB板旋转45度,把最长的边放在对角线上进行布局。
顶层布线:
顶层.png
底层布线:
底层.png
2D效果图:
2D效果.png
3D效果图:
3D效果.png
最后的成品:
成品1.jpg


成品2.jpg

成品3.jpg
单片机系统:STC15F2K08S2。
无小数显示:16进制所有数字。
显示效果(无小数).jpg
带小数显示:16进制所有数字。
显示效果(有小数).jpg
16位同时依次显示各段:A、B、C、D、E、F、G、DP段。
同时依次显示各段.jpg
16位同时显示数字:0~F。
各位同时显示数字.jpg
由于LED数码管是活动的,所以该模块还可以测试数码管的好坏。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的奖励!

查看全部评分

回复

使用道具 举报

ID:97023 发表于 2025-9-5 12:02 | 显示全部楼层
  1. #include <STC15.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5.        
  6. #define TM1640MEDO_ADD  0x44         //地址模式的设置0x40自动加一模式 0x44固定地址模式
  7. #define TM1640MEDO_DISPLAY  0x88     //设置亮度小:0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8f最大0x80关闭
  8. #define TM1640MEDO_DISPLAY_OFF  0x80  //宏定义 关亮度设置

  9. #define Delay(us){_nop_();_nop_();_nop_();_nop_();}

  10. sbit DIN  = P3^7; //TM1640数据线
  11. sbit SCLK = P3^6; //TM1640时钟线

  12. uchar buff[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};        //数字0~F
  13. //                0    1    2    3    4    5    6    7    8    9    A    b    C    d    E    F    -   
  14. //**************************************************************************************************
  15. //功能:延时1毫秒
  16. //***************************************************************************************************
  17. void Delay_xms(uint x)
  18. {
  19.   uint i,j;
  20.   for(i=0;i<x;i++)
  21.     for(j=0;j<112;j++);
  22. }

  23. //功能:12us延时
  24. void Delay_us(uint t)                                          
  25. {
  26.   for(;t>0;t--)
  27.    {
  28.         _nop_();
  29.    }
  30. }

  31. //启始
  32. void TM1640_start()
  33. {
  34.         DIN=1;
  35.         SCLK=1;
  36.         Delay_us(1);
  37.         DIN=0;
  38.         Delay_us(1);
  39.         SCLK=0;
  40.         Delay_us(1);
  41. }

  42. //结束        
  43. void TM1640_stop()
  44. {
  45.         DIN=0;
  46.         SCLK=1;
  47.         Delay_us(1);
  48.         DIN=1;
  49.         Delay_us(1);
  50. }

  51. //写数据        
  52. void TM1640_write(uchar date)
  53. {        
  54.         uchar i;
  55.         uchar aa;
  56.         aa=date;
  57.         DIN=0;
  58.         SCLK=0;
  59.         for(i=0;i<8;i++)
  60.         {
  61.                 SCLK=0;
  62.                 Delay_us(1);
  63.                 if(aa&0x01)
  64.                 {
  65.                         DIN=1;
  66.             Delay_us(1);
  67.         }
  68.                 else
  69.                 {
  70.             DIN=0;
  71.             Delay_us(1);
  72.         }
  73.         SCLK=1;
  74.         Delay_us(1);
  75.         aa=aa>>1;
  76.         }
  77.         DIN=0;
  78.         SCLK=0;
  79. }

  80. //TM1640初始化
  81. void TM1640_Init(void)
  82. {   
  83.         TM1640_start();
  84.         TM1640_write( TM1640MEDO_ADD ); //设置工作模式
  85.         TM1640_stop();
  86.         TM1640_start();
  87.         TM1640_write( TM1640MEDO_DISPLAY );//设置显示亮度
  88.         TM1640_stop();                                       
  89. }

  90. //固定地址模式的显示输出函数
  91. void TM1640_display(uchar address,uchar date)
  92. {
  93.    TM1640_start();
  94.    TM1640_write( 0xc0 + address );      //传显示数据对应的地址,0-15位数码管
  95. //   TM1640_write( buff[date] + 0x80 ); //传1BYTE显示数据,对应显示buff[]数组内容,显示小数点
  96.    TM1640_write( buff[date] );              //传1BYTE显示数据,对应显示buff[]数组内容,不显示小数点
  97.    TM1640_stop();
  98. }

  99. void main()
  100. {
  101.         uchar i,j,k;
  102.         TM1640_Init();
  103.        
  104.         while(1)
  105.         {
  106.                 //16位同时依次显示各段
  107.                 j=1;
  108.                 for(i=0; i<8; i++)
  109.                 {
  110.                         for(k=0; k<16; k++)
  111.                         {
  112.                                 TM1640_start();
  113.                                 TM1640_write( 0xc0 + k );
  114.                                 TM1640_write(j);
  115.                                 TM1640_stop();
  116.                         }
  117.                         Delay_xms(3000);
  118.                         j = j<<1;
  119.                 }
  120.                
  121.                 //16位同时依次显示:0~F
  122.                 for(i=0; i<16; i++)
  123.                 {
  124.                         for(j=0; j<16; j++)
  125.                         {
  126.                                 TM1640_display( j, i );
  127.                         }
  128.                         Delay_xms(5000);
  129.                 }
  130.                
  131.                 //从0~F,各位同时显示数字
  132.                 for(i=0; i<16; i++)
  133.                 {
  134.                         TM1640_display(i,i);
  135.                 }
  136.                 Delay_xms(50000);
  137.         }
  138. }
复制代码


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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