#include<stc8.h>
#include <intrins.h>
#define u8 unsigned char
#define u16 unsigned int
unsigned int s;
unsigned char flagkey =0; //按鍵標志
unsigned char Timer0Init_count = 0;//定時器溢出計數
sbit DIO = P3^3; //TM1637
sbit CLK = P3^2; //TM1637
sbit LED = P5^4; //led
sbit K1 = P5^5; //按鍵
//bit LED_Flash_flag;
u8 num[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFf,0xEF}; //0-9
u16 second,min,hour; //TM1637六段
void Delays(unsigned int t); //函數聲明
/*------------TM1637----------------*/
void Delay2us() //@12.01MHz
{
unsigned char i;
i = 6;
while (--i);
}
void Delay3us() //@12MHz
{
unsigned char i;
i = 10;
while (--i);
}
void Delay5us() //@12MHz
{
unsigned char i;
i = 18;
while (--i);
}
void I2CStart()
{
CLK = 1;
DIO = 1;
Delay2us();
DIO = 0;
}
void I2CAsk()
{
CLK = 0;
Delay5us();
while(DIO);
CLK = 1;
Delay2us();
CLK = 0;
}
void I2CStop()
{
CLK = 0;
Delay2us();
DIO = 0;
Delay2us();
CLK = 1;
Delay2us();
DIO = 1;
}
void I2CWriteByte(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
CLK = 0;
if(dat&0x01)
{
DIO = 1;
}
else
{
DIO = 0;
}
Delay3us();
dat>>=1;
CLK = 1;
Delay3us();
}
}
void Display(u8 m,u8 s)
{
I2CStart(); //1637 開始
I2CWriteByte(0x40);
I2CAsk();
I2CStop();
I2CStart();
I2CWriteByte(0xC0); //設置顯示首地址即第一個LED
I2CAsk();
I2CWriteByte(num[m/10]);
I2CAsk();
I2CWriteByte(num[m%10]);
I2CAsk();
I2CWriteByte(num[s/10]);
I2CAsk();
I2CWriteByte(num[s%10]);
I2CAsk();
I2CWriteByte(0xFF);
I2CAsk();
I2CWriteByte(0xFF);
I2CAsk();
I2CStop();
I2CStart();
I2CWriteByte(0x8F);
I2CAsk();
I2CStop();
}
/*------------定時器----------------*/
void Timer0Init(void) //12M晶振,延時10Ms
{
TMOD = 0x01; // 設置定時器0為模式1
TH0 = 0x0D8; // 設置定時器0的初始值,用于產生10ms的定時中斷
TL0 = 0x0F0;
EA = 1; // 允許中斷
ET0 = 1; // 允許定時器0中斷
//TR0 = 1; // 啟動定時器0
}
/*------------檢察按鍵----------------*/
void anjian(void)
{
if(K1 == 0){ // 檢測按鍵是否按下
TR0 = 1;//按鍵按下開始計時,溢出后中斷
}else{
flagkey=0;
}
}
void Init_Timer1(void)
{
TMOD |= 0x10; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH1=0xB8; //給定初值,這里使用定時器最大值從0開始計數一直到65535溢出
TL1=0x00;
EA=1; //總中斷打開
ET1=1; //定時器中斷打開
TR1=1; //定時器開關打開
}
/*------------主程序----------------*/
void main()
{
P3M0=0x00;
P3M1=0x00;
P5M0=0x00;
P5M1=0x00;
Timer0Init(); //定時器0初始化
Init_Timer1();//定時器1初始化
LED= 1;//led關
while(1)
{
Display(min,second);
anjian();
switch(second)
{
case 1:if(s==3000){LED=0;Delays(50000);LED=1;};
break;
case 2:if(s==1500|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 3:if(s==1000|s==2000|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 4:if(s==750|s==1500|s==2250|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 5:if(s==600|s==1200|s==1800|s==2400|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 6:if(s==500|s==1000|s==1500|s==2000|s==2500|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 7:if(s==422|s==844|s==1300|s==1700|s==2100|s==2600|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 8:if(s==375|s==750|s==1125|s==1500|s==1875|s==2250|s==2625|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 9:if(s==335|s==670|s==1000|s==1335|s==1670|s==2000|s==2335|s==2670|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 10:if(s==300|s==600|s==900|s==1200|s==1500|s==1800|s==2100|s==2400|s==2700|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 11:if(s==275|s==550|s==825|s==1100|s==1375|s==1650|s==1925|s==2200|s==2475|s==2750|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 12:if(s==250|s==500|s==750|s==1000|s==1250|s==1500|s==1750|s==2000|s==2250|s==2500|s==2750|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 13:if(s==236|s==470|s==700|s==940|s==1180|s==1420|s==1660|s==1900|s==2140|s==2380|s==2620|s==2860|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 14:if(s==214|s==428|s==642|s==870|s==1084|s==1298|s==1512|s==1726|s==1940|s==2154|s==2369|s==2583|s==2797|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 15:if(s==200|s==400|s==600|s==800|s==1000|s==1200|s==1400|s==1600|s==1800|s==2000|s==2200|s==2400|s==2600|s==2800|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 16:if(s==187|s==400|s==562|s==750|s==937|s==1125|s==1312|s==1500|s==1687|s==1875|s==2063|s==2250|s==2438|s==2625|s==2813|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 17:if(s==176|s==352|s==529|s==706|s==882|s==1058|s==1235|s==1411|s==1588|s==1764|s==1941|s==2117|s==2294|s==2471|s==2647|s==2824|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 18:if(s==166|s==333|s==500|s==666|s==833|s==1000|s==1166|s==1333|s==1500|s==1666|s==1833|s==2000|s==2166|s==2333|s==2500|s==2666|s==2833|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 19:if(s==157|s==315|s==472|s==630|s==788|s==945|s==1103|s==1261|s==1418|s==1576|s==1734|s==1891|s==2049|s==2207|s==2364|s==2522|s==2680|s==2837|s==3000){LED=0;Delays(50000);LED=1;};
break;
case 20:if(s==150|s==300|s==450|s==600|s==750|s==900|s==1050|s==1200|s==1350|s==1500|s==1650|s==1800|s==1950|s==2100|s==2250|s==2400|s==2550|s==2700|s==2850|s==3000){LED=0;Delays(50000);LED=1;};
break;
}
}
}
/*------------定時器中斷子程序----------------*/
void Timer0Interrupt(void) interrupt 1
{
if(flagkey==0)
{
flagkey=1;
Timer0Init_count ++;
if(Timer0Init_count>5)
{
TR0 = 0;//關定時器
TH0 = 0x0D8;//賦初值
TL0 = 0x0F0;
Timer0Init_count=0;
second++;
if(second==21)
{
second=0;
}
}
}
}
void Timer1_isr(void) interrupt 3 using 1
{
TH1=0xB8; //重新賦值 20ms
TL1=0x00;
s++;
if(s==3010)
{
s=0;
}
}
void Delays(unsigned int t)
{
while(--t);
}
|