|
#include <reg52.h>
#include<intrins.h>
sbit CLK = P0^0; //時鐘信號
sbit DIO = P0^1; //數(shù)據(jù)/地址數(shù)據(jù)
//共陰極數(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ù)點只用于地址0xc1
unsigned char dpFlag = 0; //控制第二個數(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 time, sec;
struct {
char shi;
char ge;
}Hour;
struct {
char shi;
char ge;
}Min;
/***********************************************************
*****
***** 主函數(shù)
*****
***********************************************************/
void main( void )
{
timer0_init();
time_set(5, 0); //設(shè)置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)
{
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]); //小數(shù)點標(biāo)志為1則用小數(shù)點那個數(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信號
* 輸入 : 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); //獲得應(yīng)答位
}
/********************************************************************
* 名稱 : void TM1637_writeCammand(unsigned char mData)
* 功能 : 寫指令1byte
* 輸入 : unsigned char mData
* 輸出 : 無
**************************************************************/
void TM1637_writeCammand(unsigned char mData)
{
TM1637_start();
TM1637_write1Byte(mData); //數(shù)據(jù)
TM1637_stop();
}
/********************************************************************
* 名稱 : void TM1637_writeData(unsigned char addr, unsigned char mData)
* 功能 : 固定地址寫數(shù)據(jù)1byte
* 輸入 : unsigned char addr, unsigned char mData
* 輸出 : 無
**************************************************************/
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;
}
/********************************************************************
* 名稱 :
* 功能 : 定時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 (延時一毫秒的個數(shù))
* 輸出 : 無
***********************************************************************/
/*
void Delay_1ms(unsigned int i)//1ms延時
{
unsigned char x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
*/
|
評分
-
查看全部評分
|