zoukankan      html  css  js  c++  java
  • TM1637驱动数码管

     
    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}; //有小数点只用于地址0xc1
    
    unsigned 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;			
    		}
    		else
    		if(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;	
    					}
    				}
    				else
    				if((!Hour.shi) && (--Hour.ge <= -1))
    				{
    					Hour.ge = 0;
    				}
    			}
    			else
    			if((!Hour.shi) && (!Hour.ge) && (--Min.shi <= -1))
    			{
    				Min.shi = 0;
    			}
    		}
    		else
    		if(((!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则用小数点那个数组 
    	else
    		TM1637_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;
    	else
    		DIO = 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;  //50ms
    	TL0=(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++);	
    }
    */
    
    不负自己
  • 相关阅读:
    使用JAVA API 解析ORC File
    spark Graph 的PregelAPI 理解和使用
    流程图引擎
    JMX
    Spring走向注解驱动编程
    java@ 注解原理与使用
    Maven打包SpringBoot
    Java根据实体快速生成对象
    VBA基础出发
    “嗝嗝老师”
  • 原文地址:https://www.cnblogs.com/v-BigdoG-v/p/7398657.html
Copyright © 2011-2022 走看看