TM1637是一种带键盘扫描接口的<span style="font-family:Calibri;">LED(</span>发光二极管显示器<span style="font-family:Calibri;">)</span>驱动控制专用电路,内部集成有<span style="font-family:Calibri;">MCU</span>数字接口,数据锁存器,<span style="font-family:Calibri;">LED</span>高压驱动,键盘扫描等电路。

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

引脚功能:

当传输数据时,当SCL高电平时,DIO由高变低则代表开始信号,当SCL高电平时,DIO由低变高则代表停止信号,只有当SCL低电平时DIO上的数据才可以发生改变,在SCL高电平时DIO上的数据要保持不变,此时数据发送出去,当正确传输8位数据后TM1637会第九个时钟在DIO管脚上给出一个ACK信号,把DIO拉低。传输时序类似于I2C通信。传输数据是低位在前高位在后。

传输过程:

下面仅是数码管驱动程序:(注有待改进)

驱动的下面这种数码管,普通也行,只是看不到1s的闪烁效果。

 /*********************************** Describe: TM1673控制芯片,可以设置时间的倒计时(定时不准,可以自己校准),四个数码管0xc0,0xc1,0xc2,0xc3****     Time: 2015.05.14****   Author: zys********************************/
#include <reg52.h>
#include<intrins.h>sbit CLK = P0^0;  //时钟信号
sbit DIO = P0^1;  //数据/地址数据//共阴极数码管
unsigned char code SEGData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//1-9
unsigned char code SEGDataDp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小数点只用于地址0xc1unsigned char dpFlag = 0; //控制第二个数码管的dp的显示void TM1637_start( void );
void TM1637_stop( void );
void TM1637_write1Bit(unsigned char mBit);
void TM1637_write1Byte(unsigned char mByte);
void TM1637_writeCammand(unsigned char mData);
void TM1637_writeData(unsigned char addr, unsigned char mData);
void time_set(char hour, char min);
void time_judge( void );
void time_display( void );
void timer0_init( void );void delay_140us( void );
void delay_1ms(unsigned int i);unsigned int countTime = 0;
unsigned char time, sec;
struct {char shi;char ge;
}Hour;struct {char shi;char ge;
}Min;/***********************************************************
*****
***** 主函数
*****
***********************************************************/
void main( void )
{timer0_init();time_set(5, 0);  //设置5小时倒计时while(1){time_display();   //显示时间if(countTime <= 10){dpFlag = 0;         }elseif(countTime <= 20){dpFlag = 1;   }else{countTime = 0;time_judge(); }}
}/********************************************************************
* 名称 : void time_set(char hour, char min)
* 功能 : 设置时间
* 输入 : char hour, char min
* 输出 : 无
**************************************************************/
void time_set(char hour, char min)
{if((hour < 0) || (min<0)){hour = 0;min = 0;}Hour.shi = hour/10;Hour.ge = hour%10;Min.shi = min/10;Min.ge = min%10;
}/*************************************************************
* 名称 : time_judge( void )
* 功能 : 判断时间变化
* 输入 : void
* 输出 : 无
**************************************************************/
void time_judge( void )
{if(++sec == 60)       //60秒{   sec = 0;if((Hour.shi || Hour.ge || Min.shi || Min.ge) && (--Min.ge <= -1)){Min.ge = 9;if((Hour.shi) ||(Hour.ge) && (--Min.shi <= -1)){Min.shi = 5;if(Hour.shi && (--Hour.ge <= -1)){Hour.ge = 9;if(--Hour.shi <= -1){Hour.shi = 0; }}elseif((!Hour.shi) && (--Hour.ge <= -1)){Hour.ge = 0;}}elseif((!Hour.shi) && (!Hour.ge) && (--Min.shi <= -1)){Min.shi = 0;}}elseif(((!Hour.shi) && (!Hour.ge) && (!Min.shi) ) && (Min.ge <= -1)){Min.ge = 0;}}
}/********************************************************************
* 名称 : void time_display( void )
* 功能 : 显示时间
* 输入 : void
* 输出 : 无
**************************************************************/
void time_display( void )
{TM1637_writeCammand(0x44);TM1637_writeData(0xc0, SEGData[Hour.shi]);if(dpFlag)TM1637_writeData(0xc1, SEGDataDp[Hour.ge]); //小数点标志为1则用小数点那个数组 elseTM1637_writeData(0xc1, SEGData[Hour.ge]);TM1637_writeData(0xc2, SEGData[Min.shi]);TM1637_writeData(0xc3, SEGData[Min.ge]);TM1637_writeCammand(0x8a);
}/********************************************************************
* 名称 : void TM1637_start( void )
* 功能 : start信号
* 输入 : void
* 输出 : 无
**************************************************************/
void TM1637_start( void )
{CLK = 1;DIO = 1;delay_140us();DIO = 0;delay_140us();CLK = 0;delay_140us();
}/********************************************************************
* 名称 : void TM1637_stop( void )
* 功能 : stop信号
* 输入 : void
* 输出 : 无
**************************************************************/
void TM1637_stop( void )
{CLK = 0;delay_140us();DIO = 0;delay_140us();CLK = 1;delay_140us();DIO = 1;delay_140us();
}/********************************************************************
* 名称 : void TM1637_write1Bit(unsigned char mBit )
* 功能 : 写1bit
* 输入 : unsigned char mBit
* 输出 : 无
**************************************************************/
void TM1637_write1Bit(unsigned char mBit )
{CLK = 0;delay_140us();if(mBit)DIO = 1;elseDIO = 0;delay_140us();    CLK = 1;delay_140us();
}/********************************************************************
* 名称 : void TM1637_write1Byte(unsigned char mByte)
* 功能 : 写1byte
* 输入 : unsigned char mByte
* 输出 : 无
**************************************************************/
void TM1637_write1Byte(unsigned char mByte)
{char loop = 0;for(loop = 0; loop < 8; loop++){TM1637_write1Bit((mByte>>loop)&0x01); //取得最低位   }CLK = 0;delay_140us();DIO = 1;delay_140us();CLK = 1;delay_140us();while(DIO == 1);  //获得应答位
}/********************************************************************
* 名称 : void TM1637_writeCammand(unsigned char mData)
* 功能 : 写指令1byte
* 输入 : unsigned char mData
* 输出 : 无
**************************************************************/
void TM1637_writeCammand(unsigned char mData)
{TM1637_start();TM1637_write1Byte(mData);  //数据TM1637_stop();
}/********************************************************************
* 名称 : void TM1637_writeData(unsigned char addr, unsigned char mData)
* 功能 : 固定地址写数据1byte
* 输入 : unsigned char addr, unsigned char mData
* 输出 : 无
**************************************************************/
void TM1637_writeData(unsigned char addr, unsigned char mData)
{TM1637_start();TM1637_write1Byte(addr);  //地址TM1637_write1Byte(mData);  //数据TM1637_stop();
}/********************************************************************
* 名称 : void timer0_init()
* 功能 : 定时50ms,实际运行中由于指令运行造成的延时,实际时间肯定大于50ms
* 输入 : 无
* 输出 : 无
**************************************************************/
void timer0_init( void )
{TMOD=0X01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;ET0=1;EA=1;TR0=1;
}         /********************************************************************
* 名称 :
* 功能 : 定时50ms,实际运行中由于指令运行造成的延时,实际时间肯定大于50ms
* 输入 : 无
* 输出 : 无
**************************************************************/
void timer0_isr() interrupt 1
{TH0=(65535-50000)/256;  //50msTL0=(65535-50000)%256; //countTime++;
}/********************************************************************
* 名称 : Delay_1ms(unsigned int i)
* 功能 : 延时子程序,延时时间为 140us
* 输入 :
* 输出 : 无
**************************************************************/
void delay_140us( void )
{int i;for(i=0; i<20; i++)_nop_();
}/********************************************************************
* 名称 : Delay_1ms(unsigned int i)
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
/*
void Delay_1ms(unsigned int i)//1ms延时
{unsigned char x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);
}
*/

转载于:https://www.cnblogs.com/v-BigdoG-v/p/7398657.html

TM1637驱动数码管相关推荐

  1. STM32 TM1637驱动数码管 IIC通信

    最近在做iic实验的过程中发现手边刚好有一个数码管他的驱动正好是使用iic,话不多说直接上代码了 这里就不赘述iic通信的原理和时序图了,网上相关资源也很多这里就附一篇iic的文章,这篇文章相当详细. ...

  2. 树莓派3B+实现TM1637驱动数码管

    自己学遇到的一些难点记录一下,下面这张图是我自己接的线 #include <stdio.h> #include <stdlib.h> #include <string.h ...

  3. Arduino使用TM1637四位数码管

    index 1. 简介 引脚 2. Grove - 4-Digit Display Library 2.1类中比较实用的函数有: 2.1.1 库中提供了三个示例 2.2 库文件及帮助 2.3 利用tm ...

  4. 物联网开发笔记(75)- 使用Micropython开发ESP32开发板之控制tm1637时钟数码管显示

    一.目的 这一节我们学习如何使用我们的ESP32开发板来控制4位tm1637时钟数码管显示. 二.环境 ESP32 + 4位tm1637时钟数码管(wokwi仿真也可) + Thonny IDE + ...

  5. 定时器驱动数码管c语言程序,74hc595驱动数码管时间程序

    74hc595驱动数码管时间程序 这里是电路图: 下面是51单片机驱动74hc595芯片的程序: #include                            //包含51单片机的头文件 # ...

  6. KST-51单片机利用HC138芯片驱动数码管显示

    学习笔记--HC138芯片驱动数码管显示 说说今天心情,刚刚上完学校老师里的单片机课,自己也迫不及待的拿出尘封已久的KST-51开发板在宿舍写写C51代码,玩玩数码管显示.初次写笔记,不好见谅哈! 本 ...

  7. 基于Proteus学习单片机系列(二)——驱动数码管

    获取更多资源,请关注微信公众号:嵌入式基地 获取项目资源:公众号后台回复:单片机仿真 基于Proteus学习单片机系列(一)--点亮LED 基于Proteus学习单片机系列(二)--驱动数码管 基于P ...

  8. Arduino 74HC595驱动数码管0-9循环显示+Proteus仿真

    Arduino 74HC595驱动数码管0-9循环显示+Proteus仿真 Proteus仿真 实例代码(do{}while();实现方法) /*74HC595控制1位共阳数码管* * * * * * ...

  9. TM1638驱动数码管的一点建议,附程序

      年过完了,首先祝大家开工大吉! TM1638是一种带键盘扫描接口的数码管驱动芯片.可以驱动共阳极数码管或共阴极数码管,相比单片机直接驱动数码管的方案,可以省去很多单片机的端口,也不需要浪费资源去扫 ...

最新文章

  1. 经历过这三个NLP项目的洗礼,成功拿下NLP算法Offer!
  2. Extra data: line 1 column 342004 (char 342003)
  3. 【算法集中营】循环冗余校验
  4. php tp框架调用方法,thinkPHP框架使用方法
  5. Asp.Net第二章服务器端控件
  6. 以python程序调用的系统_python 系统调用的实例详解
  7. android 左滑按钮,android开发类似微信列表向左滑动按钮操作
  8. component、 filters(过滤器)、computed(计算属性)、$watch(观察属性)、设定计算属性
  9. 小升初想择校,英语跟语数一样重要吗?
  10. CentOS 7 常用命令
  11. 90后告别第一份工作后,更青睐新一线城市开启职场第二步
  12. qq linux五笔输入法下载软件,qq五笔输入法2017
  13. 二元二次不定方程(佩尔方程)
  14. CentOS 安装 Xware 迅雷远程下载程序
  15. 计算机毕业设计太难做不出来怎么办?
  16. 数学脱式计算在线计算机,三年级数学脱式计算.doc
  17. Web前端大作业—里约热内卢奥运会(html+css+javascript)
  18. 优麒麟服务器配置备忘
  19. 计算机课专业介绍听后感,最新计算机课心得体会范文
  20. 机器学习——python scikit-learn 贝叶斯

热门文章

  1. 矩阵与逆矩阵的特征向量相同
  2. 学数据结构,是不是一定要先学离散数学
  3. 收藏 | 自然语言处理(NLP)数据集汇总(附下载链接)
  4. composer 自定安装包路径
  5. 开源一个win10二十四节气壁纸自动更换的程序
  6. 15、【易混淆概念集】-第九章 职责分配矩阵(RAM) 活动资源估算、资源分解结构 获取资源 资源/项目/自然日历区别 虚拟团队、集中办公、认可与奖励 塔克曼阶梯理论 冲突管理 权力类型
  7. java web实验_javaweb实验报告
  8. HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 html网页规划与设计
  9. APICloud数据云3.0使用教程
  10. bzoj 4763: 雪辉