只是簡單的改這一部分不能解決問題,給你改了一下,冗余的部分全部去掉,你試試。
- #include <reg52.h>
- #include<intrins.h>
- sbit CLK = P0^0; //時鐘信號
- sbit DIO = P0^1; //數據/地址數據
- //這里需要增加一個輸出端口
- //sbit OUT = P1^0; //共陰極數碼管
- 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 sec,min,hour;
- bit time=1;
- /*
- struct
- {
- char shi;
- char ge;
- }Hour;
- struct
- {
- char shi;
- char ge;
- }Min;
- */
- /***********************************************************
- *****
- ***** 主函數
- *****
- ***********************************************************/
- void main( void )
- {
- timer0_init();
- // time_set(5,0); //設置5小時倒計時
- // OUT=1;//加電輸出
- while(1)
- {
- if(time)//判斷停止計時標志
- {
- if(countTime <=10)//閃秒
- {
- dpFlag = 0;
- }
- else
- {
- dpFlag = 1;
- }
- if(countTime >=20)
- {
- countTime = 0;
- time_judge();
- }
- }
- time_display(); //顯示時間
- }
- }
- /*
- 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 )
- * 功能 : 判斷時間變化
- * 輸入 : void
- * 輸出 : 無
- **************************************************************/
- void time_judge( void )
- {
- if(++sec>=60) //60秒
- {
- sec=0;
- if(++min>=60)
- {
- min=0;
- if(++hour>=5)//正計時5小時到
- {
- time=0;//計時結束
- // 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 )
- * 功能 : 顯示時間
- * 輸入 : void
- * 輸出 : 無
- **************************************************************/
- void time_display( void )
- {
- TM1637_writeCammand(0x44);
- TM1637_writeData(0xc0, SEGData[hour/10]);
- if(dpFlag)
- TM1637_writeData(0xc1, SEGDataDp[hour%10]); //小數點標志為1則用小數點那個數組
- 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]); //小數點標志為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 )
- {
- 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( 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++);
- }
- */
復制代碼 |