?? shiz.c
字號:
#define uint unsigned int
#define uchar unsigned char
#include <reg51.h>
#include <math.h>
sbit SDA = P3^1; //二線通信
sbit SCL = P3^0;
sbit LEDA = P3^3; //倒計時運行指示燈
sbit FY1 = P3^5; //放音控制1,高電平有效
sbit FY2 = P3^6; //放音控制2,高電平有效
sbit FY3 = P3^7; //放音控制3,高電平有效
bit c_flash = 0; //小時位閃爍標志
bit m_flash = 0; //分鐘位閃爍標志
bit s_flash = 0; //秒位閃爍標志
bit ibflag;
//bit sf = 1; //定時標志位,sf=1:時間顯示;sf=0:定時顯示
#define M41T0_ADR 0xD0 //時鐘芯片地址
#define WRITE 0x00 // WRITE command
#define READ 0x01 // READ command
uchar code tab[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共陽帶圓點
unsigned long dingshi; //定時時長
void nop(uchar j);
void msec(uint x);
void display(uchar *p);
uchar RMT_SCAN(void);
void M41T0_Send (uchar *p);
uchar *M41T0_Receive (void);
uchar *read_time(void);
unsigned long time_to_long(void);
void timer_adj(void);
void clock_adj(void);
main()
{uchar key;
uchar *p;
EA = 0;
SDA = 1;
SCL = 1;
while(1)
{key = RMT_SCAN(); //遙控
switch(key)
{//case 4:sf = ~sf;break; //SWITCH_KEY,時間與定時切換
case 2:timer_adj();break; //TIMER_KEY,定時設(shè)定
case 1:clock_adj();break; //CLOCK_KEY,時間設(shè)定
default:break;
}
p = read_time();
display(p);
}
}
void nop(uchar j)
{uchar i;
for(i=0;i<j;i++)
{;}
}
void msec(uint x)
{ unsigned char j;
while (x--)
{ for (j=0;j<125;j++)
{;}
}
}
void display(uchar *pt)
{uchar i;
uchar temp;
temp = 0x01;
P2 = ~temp;
for(i = 0;i < 6;i++)
{P0 = pt[i];
msec(2);
temp <<= 1;
P2 = ~temp;
}
}
uchar RMT_SCAN(void)
{uchar temp1,temp2;
uchar i;
i = P1;
temp1 = i & 0xf0;
if(temp1)
{do{i = P1;
temp2 = i&0xf0;
}while(temp2);
temp1>>=4;
temp1 &= 0x0f;
return temp1;
}
else return 0;
}
uchar *read_time(void)
{uchar *pt,day[8];
uchar show[6]; //數(shù)碼管顯示數(shù)組
uchar i;
pt = M41T0_Receive();
for(i = 0;i < 8;i++)day[i] = *(pt+i);
show[0] = tab[day[0]&0x0f]; //秒個位
show[1] = tab[(day[0]&0x70)>>4]; //秒十位
show[2] = tab[day[1]&0x0f]; //分個位
show[3] = tab[(day[1]&0x70)>>4]; //分十位
show[4] = tab[day[2]&0x0f]; //時個位
show[5] = tab[(day[2]&0x30)>>4]; //時十位
return(show);
}
unsigned long time_to_long(void)
{uchar *pt,day[8];
uchar shi,feng,miao,i;
unsigned long th;
pt = M41T0_Receive();
for(i = 0;i < 8;i++)day[i] = *(pt+i);
shi = (day[2]&0x0f) + (day[2]>>4)*10;
feng = (day[1]&0x0f) + (day[1]>>4)*10;
miao = (day[0]&0x0f) + (day[0]>>4)*10;
th = miao + feng*60 + shi*3600;
return th;
}
void timer_adj(void)
{uchar idata day[3],*pt,dat[8];
uchar show[6]; //數(shù)碼管顯示數(shù)組
uchar shi,feng,miao,i;
uchar key;
bit ff;
uchar jm;
unsigned long th;
uchar flag = 1;
bit nflag,pflag;
day[2] = 0;
day[1] = 0;
day[0] = 0;
c_flash = 1;m_flash = 0;s_flash = 0;
while(1)
{if(c_flash){if(nflag){if(day[2]==0)day[2] = 23;
else day[2] = day[2] - 1;
nflag = 0;
}
if(pflag){if(day[2]==23)day[2] = 0;
else day[2] = day[2] + 1;
pflag = 0;
}
if(day[2]>23)day[2] = 0; //防止超閾值數(shù)據(jù)
} //時
if(m_flash){if(nflag){if(day[1]==0)day[1] = 59;
else day[1] = day[1] - 1;
nflag = 0;
}
if(pflag){if(day[1]==59)day[1] = 0;
else day[1] = day[1] + 1;
pflag = 0;
}
if(day[1]>59)day[1] = 0; //防止超閾值數(shù)據(jù)
} //分
if(s_flash){if(nflag){if(day[0]==0)day[0] = 59;
else day[0] = day[0] - 1;
nflag = 0;
}
if(pflag){if(day[0]==59)day[0] = 0;
else day[0] = day[0] + 1;
pflag = 0;
}
if(day[0]>59)day[0] = 0; //防止超閾值數(shù)據(jù)
}
//秒
show[0] = tab[day[0]%10]; //秒個位
show[1] = tab[day[0]/10]; //秒十位
show[2] = tab[day[1]%10]; //分個位
show[3] = tab[day[1]/10]; //分十位
show[4] = tab[day[2]%10]; //時個位
show[5] = tab[day[2]/10]; //時十位
if(c_flash)
{if(ff){show[4] = 0x7f; //圓點不滅
show[5] = 0xff;
if(jm++ > 15){ff = 0;jm = 0;}
}
else if(jm++ > 60){ff = 1; jm = 0;} //閃爍頻率
}
if(m_flash)
{if(ff){show[2] = 0x7f;
show[3] = 0xff;
if(jm++ > 15){ff = 0;jm = 0;}
}
else if(jm++ >60){ff = 1; jm = 0;} //閃爍頻率
}
if(s_flash)
{if(ff){show[0] = 0xff;
show[1] = 0xff;
if(jm++ > 15){ff = 0;jm = 0;}
}
else if(jm++ > 60){ff = 1; jm = 0;} //閃爍頻率
}
display(show);
key = RMT_SCAN(); //遙控
switch(key)
{case 4:flag = flag + 1; //SWITCH_KEY,時段切換
if(flag > 3)flag = 1;
switch(flag){case 1:c_flash = 1;m_flash = 0;s_flash = 0;break;
case 2:c_flash = 0;m_flash = 1;s_flash = 0;break;
case 3:c_flash = 0;m_flash = 0;s_flash = 1;break;
default:break;
}
break;
case 8:pflag = 1;break; //ADJUST_KEY,數(shù)字增加
case 1:nflag = 1;break; //CLOCK_KEY,數(shù)字減小
case 2: {dingshi = (unsigned long)day[2]*3600+(unsigned long)day[1]*60+(unsigned long)day[0];
//TIMER_KEY,保存退出
if(dingshi < 301)break;//小于5分鐘無效
th = time_to_long();
dingshi = dingshi + th;
goto pre_end;
}
default:break;
}
}
pre_end:{c_flash = 0;m_flash = 0;s_flash = 0; LEDA = 0;}//倒計時啟動,指示燈亮
FY1 = 1;//地址選擇,啟動倒計時
/*************定時狀態(tài)******************/
while(1){pt = M41T0_Receive();
for(i = 0;i < 8;i++)dat[i] = *(pt+i);
shi = (dat[2]&0x0f) + (dat[2]>>4)*10;
feng = (dat[1]&0x0f) + (dat[1]>>4)*10;
miao = (dat[0]&0x0f) + (dat[0]>>4)*10;
th = miao + feng*60 + shi*3600;
th = dingshi - th; //當前定時時間
if(th > 86399)th = th - 86400; //總時長超過24小時,當前時間進入第二天
if(th == 300)FY2 = 1; //定時狀態(tài),倒計時5分鐘語音提示
if(th < 2 ){LEDA = 1;FY3 = 1; break;} //定時結(jié)束,指示燈滅
shi = th/3600;
feng = (th%3600)/60;
miao = th%60;
show[0] = tab[miao%10]; //秒個位
show[1] = tab[miao/10]; //秒十位
show[2] = tab[feng%10]; //分個位
show[3] = tab[feng/10]; //分十位
show[4] = tab[shi%10]; //時個位
show[5] = tab[shi/10]; //時十位
display(show);
}
}
void clock_adj(void)
{uchar idata day[8];
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -