|
只是簡(jiǎn)單的改這一部分不能解決問(wèn)題,給你改了一下,冗余的部分全部去掉,你試試。
- #include <reg52.h>
- #include<intrins.h>
- sbit CLK = P0^0; //時(shí)鐘信號(hào)
- sbit DIO = P0^1; //數(shù)據(jù)/地址數(shù)據(jù)
- //這里需要增加一個(gè)輸出端口
- //sbit OUT = P1^0; //共陰極數(shù)碼管
- 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}; //有小數(shù)點(diǎn)只用于地址0xc1
- unsigned char dpFlag = 0; //控制第二個(gè)數(shù)碼管的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 sec,min,hour;
- bit time=1;
- /*
- struct
- {
- char shi;
- char ge;
- }Hour;
- struct
- {
- char shi;
- char ge;
- }Min;
- */
- /***********************************************************
- *****
- ***** 主函數(shù)
- *****
- ***********************************************************/
- void main( void )
- {
- timer0_init();
- // time_set(5,0); //設(shè)置5小時(shí)倒計(jì)時(shí)
- // OUT=1;//加電輸出
- while(1)
- {
- if(time)//判斷停止計(jì)時(shí)標(biāo)志
- {
- if(countTime <=10)//閃秒
- {
- dpFlag = 0;
- }
- else
- {
- dpFlag = 1;
- }
- if(countTime >=20)
- {
- countTime = 0;
- time_judge();
- }
- }
- time_display(); //顯示時(shí)間
- }
- }
- /*
- void time_set(char hour, char min)
- {
- Hour.shi = hour/10;
- Hour.ge = hour%10;
- Min.shi = min/10;
- Min.ge = min%10;
- }
- */
- /*************************************************************
- * 名稱 : time_judge( void )
- * 功能 : 判斷時(shí)間變化
- * 輸入 : void
- * 輸出 : 無(wú)
- **************************************************************/
- void time_judge( void )
- {
- if(++sec>=60) //60秒
- {
- sec=0;
- if(++min>=60)
- {
- min=0;
- if(++hour>=5)//正計(jì)時(shí)5小時(shí)到
- {
- time=0;//計(jì)時(shí)結(jié)束
- // OUT=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 )
- * 功能 : 顯示時(shí)間
- * 輸入 : void
- * 輸出 : 無(wú)
- **************************************************************/
- void time_display( void )
- {
- TM1637_writeCammand(0x44);
- TM1637_writeData(0xc0, SEGData[hour/10]);
- if(dpFlag)
- TM1637_writeData(0xc1, SEGDataDp[hour%10]); //小數(shù)點(diǎn)標(biāo)志為1則用小數(shù)點(diǎn)那個(gè)數(shù)組
- else
- TM1637_writeData(0xc1, SEGData[hour%10]);
- TM1637_writeData(0xc2, SEGData[min/10]);
- TM1637_writeData(0xc3, SEGData[min%10]);
- TM1637_writeCammand(0x8a);
- /*
- TM1637_writeCammand(0x44);
- TM1637_writeData(0xc0, SEGData[Hour.shi]);
- if(dpFlag)
- TM1637_writeData(0xc1, SEGDataDp[Hour.ge]); //小數(shù)點(diǎn)標(biāo)志為1則用小數(shù)點(diǎn)那個(gè)數(shù)組
- 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信號(hào)
- * 輸入 : void
- * 輸出 : 無(wú)
- **************************************************************/
- void TM1637_start( void )
- {
- CLK = 1;
- DIO = 1;
- delay_140us();
- DIO = 0;
- delay_140us();
- CLK = 0;
- delay_140us();
- }
- /********************************************************************
- * 名稱 : void TM1637_stop( void )
- * 功能 : stop信號(hào)
- * 輸入 : void
- * 輸出 : 無(wú)
- **************************************************************/
- 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 )
- {
- CLK = 0;
- delay_140us();
- if(mBit)
- DIO = 1;
- else
- DIO = 0;
- delay_140us();
- CLK = 1;
- delay_140us();
- }
- /********************************************************************
- * 名稱 : void TM1637_write1Byte(unsigned char mByte)
- * 功能 : 寫(xiě)1byte
- * 輸入 : unsigned char mByte
- * 輸出 : 無(wú)
- **************************************************************/
- 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); //獲得應(yīng)答位
- }
- /********************************************************************
- * 名稱 : void TM1637_writeCammand(unsigned char mData)
- * 功能 : 寫(xiě)指令1byte
- * 輸入 : unsigned char mData
- * 輸出 : 無(wú)
- **************************************************************/
- void TM1637_writeCammand(unsigned char mData)
- {
- TM1637_start();
- TM1637_write1Byte(mData); //數(shù)據(jù)
- TM1637_stop();
- }
- /********************************************************************
- * 名稱 : void TM1637_writeData(unsigned char addr, unsigned char mData)
- * 功能 : 固定地址寫(xiě)數(shù)據(jù)1byte
- * 輸入 : unsigned char addr, unsigned char mData
- * 輸出 : 無(wú)
- **************************************************************/
- void TM1637_writeData(unsigned char addr, unsigned char mData)
- {
- TM1637_start();
- TM1637_write1Byte(addr); //地址
- TM1637_write1Byte(mData); //數(shù)據(jù)
- TM1637_stop();
- }
- void timer0_init( void )
- {
- TMOD=0X01;
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- ET0=1;
- EA=1;
- TR0=1;
- }
- /********************************************************************
- * 名稱 :
- * 功能 : 定時(shí)50ms,實(shí)際運(yùn)行中由于指令運(yùn)行造成的延時(shí),實(shí)際時(shí)間肯定大于50ms
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- **************************************************************/
- void timer0_isr() interrupt 1
- {
- TH0=(65535-50000)/256; //50ms
- TL0=(65535-50000)%256; //
- countTime++;
- }
- /********************************************************************
- * 名稱 : Delay_1ms(unsigned int i)
- * 功能 : 延時(shí)子程序,延時(shí)時(shí)間為 140us
- * 輸入 :
- * 輸出 : 無(wú)
- **************************************************************/
- void delay_140us( void )
- {
- int i;
- for(i=0; i<20; i++)
- _nop_();
- }
- /********************************************************************
- * 名稱 : Delay_1ms(unsigned int i)
- * 功能 : 延時(shí)子程序,延時(shí)時(shí)間為 1ms * x
- * 輸入 : x (延時(shí)一毫秒的個(gè)數(shù))
- * 輸出 : 無(wú)
- ***********************************************************************/
- /*
- void Delay_1ms(unsigned int i)//1ms延時(shí)
- {
- unsigned char x,j;
- for(j=0;j<i;j++)
- for(x=0;x<=148;x++);
- }
- */
復(fù)制代碼 |
|