tm1637驱动数码管程序

LED驱动

61人已加入

描述

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

  引脚功能:

  TM1637

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

  传输过程:

 TM1637

  TM1637

 TM1637

  TM1637

  TM1637

  下面仅是数码管驱动程序:

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

  


 /*******************************
 **** Describe: TM1673控制芯片,可以设置时间的倒计时(定时不准,可以自己校准),四个数码管0xc0,0xc1,0xc2,0xc3
 ****     Time: 2015.05.14
 ****   Author: zys
 ********************************/
#include
#include

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     for(x=0;x<=148;x++); 
}
*/

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分