找回密码
 立即注册

QQ登录

只需一步,快速开始

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

网上51单片机+TM1637模块的官方例程

  [复制链接]
跳转到指定楼层
楼主
ID:380108 发表于 2021-11-13 15:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
网上可以买到模块,现在附上官方的例程,方便大家测试编程。

特性描述
TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数
字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良,质量可靠。主要应用于电磁炉、
微波炉及小家电产品的显示屏驱动。采用DIP/SOP20的封装形式。

功能特点
  采用功率CMOS 工艺
  显示模式(8 段×6 位),支持共阳数码管输出
  键扫描(8×2bit),增强型抗干扰按键识别电路
  辉度调节电路(占空比 8 级可调)
  两线串行接口(CLK,DIO)
  振荡方式:内置RC 振荡(450KHz+5%)
  内置上电复位电路
  内置自动消隐电路
  封装形式:DIP20/SOP20

单片机源程序如下:
  1. /*
  2. * 深圳天微电子
  3. *文件名: TM1637
  4. *当前版本: 1.0
  5. *单片机型号: AT89S52
  6. *开发环境: Keil uVision3
  7. *晶震频率: 11.0592M
  8. *程序功能: 把 TM1637 所有显示寄存器地址全部写满数据 0xff,并开显示,然后再读按键值。
  9. */
  10. #include<reg52.h>
  11. #include<intrins.h>
  12. //定义端口
  13. sbit clk = P1^2;
  14. sbit dio = P1^1;
  15. ///=======================================
  16. void Delay_us(unsigned int i) //nus 延时
  17. {
  18. for(;i>0;i--)
  19. _nop_();
  20. }
  21. ///======================================
  22. void I2CStart(void) //1637 开始
  23. {
  24. clk = 1;
  25. dio = 1;
  26. Delay_us(2);
  27. dio = 0;
  28. }
  29. ///=============================================
  30. void I2Cask(void) //1637 应答
  31. {
  32. clk = 0;
  33. Delay_us(5); //在第八个时钟下降沿之后延时 5us,开始判断 ACK 信号
  34. while(dio);
  35. clk = 1;
  36. Delay_us(2);
  37. clk=0;
  38. }
  39. ///========================================
  40. void I2CStop(void)  // 1637 停止
  41. {
  42. clk = 0;
  43. Delay_us(2);
  44. dio = 0;
  45. Delay_us(2);
  46. clk = 1;
  47. Delay_us(2);
  48. dio = 1;
  49. }
  50. ///=========================================
  51. void I2CWrByte(unsigned char oneByte) //写一个字节
  52. {
  53. unsigned char i;
  54. for(i=0;i<8;i++)
  55. {  clk = 0;
  56. if(oneByte&0x01)  //低位在前
  57. {
  58. dio = 1;
  59. }
  60. else
  61. {
  62. dio = 0;
  63. }
  64. Delay_us(3);
  65. oneByte=oneByte>>1;
  66. clk=1;
  67. Delay_us(3);
  68. }
  69. }
  70. ///-------------------------------------------------
  71. unsigned char ScanKey(void) //读按键
  72. {
  73. unsigned char rekey,rkey,i;
  74. I2CStart();
  75. I2CWrByte(0x42); //读按键命令
  76. I2Cask();
  77. dio=1; // 在读按键前拉高数据线
  78. for(i=0;i<8;i++) //从低位开始读
  79. {  clk=0;
  80. rekey=rekey>>1;
  81. Delay_us(30);
  82. clk=1;
  83. if(dio)
  84. {
  85. rekey=rekey|0x80;
  86. }
  87. else
  88. {
  89. rekey=rekey|0x00;
  90. }
  91. Delay_us(30);
  92. }
  93. I2Cask();
  94. I2CStop();
  95. return (rekey);
  96. }
  97. ///================================================
  98. void SmgDisplay(void) //写显示寄存器
  99. {
  100. unsigned char i;
  101. I2CStart();
  102. I2CWrByte(0x40); // 40H 地址自动加 1 模式,44H 固定地址模式,本程序采用自加 1 模式
  103. I2Cask();
  104. I2CStop();
  105. I2CStart();
  106. I2CWrByte(0xc0);  //设置首地址,
  107. I2Cask();
  108. for(i=0;i<6;i++)  //地址自加,不必每次都写地址
  109. {
  110. I2CWrByte(0xff); //送数据
  111. I2Cask();
  112. }
  113. I2CStop();
  114. I2CStart();
  115. I2CWrByte(0x8f); //开显示 ,最大亮度
  116. I2Cask();
  117. I2CStop();
  118. }
  119. ///==============================================
  120. void init() //初始化子程序
  121. {
  122. //初始化略
  123. }
  124. ///==============================================
  125. void main(void)
  126. {
  127. unsigned char keydate;
  128. init(); //初始化
  129. SmgDisplay(); //写寄存器并开显示
  130. while(1)
  131. {
  132. keydate=Scankey();  //读按键值 ,读出的按键值不作处理。
  133. }
  134. }
  135. //===========end==================================
复制代码


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:121859 发表于 2022-8-15 17:13 | 只看该作者
程序基本可以用,就是显示数据为空,按键读出来没有处理。在这个程序基础上,稍加修改,可以显示按键,代码如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
//uchar code ktab[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef};
uchar code ktab[]={0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xef,0xee,0xed,0xec,0xeb,0xea,0xe9,0xe8};
//定义端口
sbit clk = P1^2;
sbit dio = P1^1;

uchar buf[6]={1,2,3,4,5,6};
uchar keyval;
///=======================================
void Delay_us(unsigned int i) //nus 延时
{
for(;i>0;i--)
_nop_();
}
///======================================
void I2CStart(void) //1637 开始
{
clk = 1;
dio = 1;
Delay_us(2);
dio = 0;
}
///=============================================
void I2Cask(void) //1637 应答
{
clk = 0;
Delay_us(5); //在第八个时钟下降沿之后延时 5us,开始判断 ACK 信号
while(dio);
clk = 1;
Delay_us(2);
clk=0;
}
///========================================
void I2CStop(void)  // 1637 停止
{
clk = 0;
Delay_us(2);
dio = 0;
Delay_us(2);
clk = 1;
Delay_us(2);
dio = 1;
}
///=========================================
void I2CWrByte(unsigned char oneByte) //写一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{  clk = 0;
if(oneByte&0x01)  //低位在前
{
dio = 1;
}
else
{
dio = 0;
}
Delay_us(3);
oneByte=oneByte>>1;
clk=1;
Delay_us(3);
}
}
//-------------------------------------------------
unsigned char Scankey(void) //读按键
{
unsigned char rekey,i;
I2CStart();
I2CWrByte(0x42); //读按键命令
I2Cask();
dio=1; // 在读按键前拉高数据线
for(i=0;i<8;i++) //从低位开始读
{  clk=0;
rekey=rekey>>1;
Delay_us(30);
clk=1;
if(dio)
{
rekey=rekey|0x80;
}
else
{
rekey=rekey|0x00;
}
Delay_us(30);
}
I2Cask();
I2CStop();
return (rekey);
}
///================================================
void SmgDisplay(void) //写显示寄存器
{
unsigned char i;
I2CStart();
I2CWrByte(0x40); // 40H 地址自动加 1 模式,44H 固定地址模式,本程序采用自加 1 模式
I2Cask();
I2CStop();
I2CStart();
I2CWrByte(0xc0);  //设置首地址,
I2Cask();
for(i=0;i<6;i++)  //地址自加,不必每次都写地址
{
I2CWrByte(table[buf[i]]); //送数据
I2Cask();
}
I2CStop();
I2CStart();
I2CWrByte(0x8f); //开显示 ,最大亮度
I2Cask();
I2CStop();
}
//-----------------------------------------------
void keydeal(uchar kdat)
{
        uchar i;
        for(i=0;i<16;i++)
        {
                if(kdat==ktab[i])break;
        }
        keyval=i;
}
///==============================================
void init() //初始化子程序
{
//初始化略
}
///==============================================
void main(void)
{
uchar keydate,keyo;
init(); //初始化
SmgDisplay(); //写寄存器并开显示
        while(1)
        {
                keydate=Scankey();  //读按键值 ,读出的按键值不作处理。
                if(keydate!=0xff && keydate!=keyo)
                {
                        keyo=keydate;
                        keydeal(keydate);
                        buf[5]=buf[4];
                        buf[4]=buf[3];
                        buf[3]=buf[2];
                        buf[2]=buf[1];
                        buf[1]=buf[0];
                        buf[0]=keyval;
                        SmgDisplay(); //写寄存器并开显示
                }
        }
}
//===========end==================================
回复

使用道具 举报

板凳
ID:468415 发表于 2023-7-18 19:18 | 只看该作者
zhxiufan 发表于 2022-8-15 17:13
程序基本可以用,就是显示数据为空,按键读出来没有处理。在这个程序基础上,稍加修改,可以显示按键,代码 ...

你好!
请问同样驱动0.36英寸共阳的,为什么0.56的就不能点亮呢?而0.36是正常显示的
回复

使用道具 举报

地板
ID:1064915 发表于 2023-7-19 10:39 | 只看该作者
AIP1637_LED显示驱动_规格书.PDF (710.49 KB, 下载次数: 23)
回复

使用道具 举报

5#
ID:1085441 发表于 2023-7-20 00:12 | 只看该作者
fzzz321 发表于 2023-7-18 19:18
你好!
请问同样驱动0.36英寸共阳的,为什么0.56的就不能点亮呢?而0.36是正常显示的

不应该这样,我用来驱动0.36或0.56都行,是不是数码管引脚没接对?0.56的是不是共阴的?还有,不同厂家的0.56数码管,引脚也有不一样的。
回复

使用道具 举报

6#
ID:195666 发表于 2024-4-17 12:59 | 只看该作者
这家的0.56寸没点亮,暂时没找到问题
猫id=645475641900
回复

使用道具 举报

7#
ID:195666 发表于 2024-4-17 19:11 | 只看该作者
06123 发表于 2024-4-17 12:59
这家的0.56寸没点亮,暂时没找到问题
猫id=645475641900

问题找到了,他家的板子在信号线上接电容了  
回复

使用道具 举报

8#
ID:1111684 发表于 2024-4-21 14:28 | 只看该作者
06123 发表于 2024-4-17 19:11
问题找到了,他家的板子在信号线上接电容了

官方规格书上两个信号线是要接100P电容到地,我也买了断0.56寸的,始终未能点亮。
以为芯片坏了,更换芯片后,也不能点亮,检查了模块上的数码管,贴片电阻电容都
好的,奇怪得很?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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