采用功率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
#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++);?
}
*/
評論