?? zdbwnl.c
字號:
Disp_Digit(4,48,space); //顯示空格
Disp_Digit(4,56,space);
}
}
else
{
d=read_clock(0xc3);//讀鬧鐘小時的數值
e=d;
d=d>>4;
e=e&0x0f;
Mcs=1;Scs=0;
Disp_Digit(4,48,zero+d*16);
Disp_Digit(4,56,zero+e*16);
}
if(Minb==1) //分鐘閃爍標志位
{
if(flag==1)
{
d=read_clock(0xc5);//讀鬧鐘分鐘的數值
e=d;
d=d>>4;
e=e&0x0f;
Mcs=0;Scs=1;
Disp_Digit(4,8,zero+d*16);
Disp_Digit(4,16,zero+e*16);
}
else
{
Mcs=0;Scs=1;
Disp_Digit(4,8,space); //顯示空格
Disp_Digit(4,16,space);
}
}
else
{
d=read_clock(0xc5);//讀鬧鐘分鐘的數值
e=d;
d=d>>4;
e=e&0x0f;
Mcs=0;Scs=1;
Disp_Digit(4,8,zero+d*16);
Disp_Digit(4,16,zero+e*16);
}
if(Secb==1) //秒閃爍標志位
{
if(flag==1)
{
d=read_clock(0xc7);//讀鬧鐘秒的數值
e=d;
d=d>>4;
e=e&0x0f;
Mcs=0;Scs=1;
Disp_Digit(4,32,zero+d*16);
Disp_Digit(4,40,zero+e*16);
}
else
{
Mcs=0;Scs=1;
Disp_Digit(4,32,space); //顯示空格
Disp_Digit(4,40,space);
}
}
else
{
d=read_clock(0xc7);//讀鬧鐘秒的數值
e=d;
d=d>>4;
e=e&0x0f;
Mcs=0;Scs=1;
Disp_Digit(4,32,zero+d*16);
Disp_Digit(4,40,zero+e*16);
}
}
/******************************************************************************/
void id_case1_key(void)//id為1時的下一級選擇
{
if(Add_Key == 0) //增加
{
Delay(100);
if(Add_Key == 0)
Set_time(id,0); //調用Set_time函數
while(Add_Key ==0);
}
if (Dec_Key==0) //減少
{
Delay(100);
if(Dec_Key == 0)
Set_time(id,1);
while(Dec_Key ==0);
}
}
/******************************************************************************/
void Set_time(unsigned char sel, bit sel_1) //根據選擇調整相應項目并寫入DS1302
{
signed char address,item;
signed char max,mini;
if(sel==7) {address=0x80; max=0;mini=0;} //秒
if(sel==6) {address=0x82; max=59;mini=0;} //分鐘
if(sel==5) {address=0x84; max=23;mini=0;} //小時
if(sel==3) {address=0x86; max=31;mini=1;} //日
if(sel==2) {address=0x88; max=12;mini=1;} //月
if(sel==1) {address=0x8c; max=99; mini=0;} //年
if(sel==4) {address=0x8a; max=7;mini=1;} //星期
//讀取1302某地址上的數值轉換成10進制賦給item
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(sel_1==0)
item++;
else
item--;
if(item>max) item=mini;
if(item<mini) item=max;
write_clock(0x8e,0x00);//允許寫操作
write_clock(address,(item/10)*16+item%10);//轉換成16進制寫入1302
write_clock(0x8e,0x80);//寫保護,禁止寫操作
}
/******************************************************************************/
void id_case2_key(void)//id為1時的下一級選擇
{
if(Add_Key == 0) //增加1
{
Delay(100);
if(Add_Key == 0)
Set_Bell(id2,0); //調用Set_Bell函數
while(Add_Key ==0);//等待鍵松開
}
if(Dec_Key == 0) //減少1
{
Delay(100);
if(Dec_Key == 0)
Set_Bell(id2,1); //調用Set_Bell函數
while(Dec_Key ==0);//等待鍵松開
}
}
/******************************************************************************/
void Set_Bell(unsigned char sel, bit sel_1)//根據選擇調整相應項目并寫入
{
signed char address,item;
signed char max,mini;
if(sel==4) {address=0xc6; max=59;mini=0;} //秒
if(sel==3) {address=0xc4; max=59;mini=0;} //分
if(sel==2) {address=0xc2; max=23; mini=0;} //時
if(sel==1) //標志位
{
address=0xc8;//for read
if(Add_Key ==0 || Dec_Key ==0)
Bell_Swh=~Bell_Swh;
write_clock(address,Bell_Swh);
} //開關
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(sel_1==0)
item++;
else
item--;
if(item>max) item=mini;
if(item<mini) item=max;
write_clock(0x8e,0x00);//允許寫操作
write_clock(address,(item/10)*16+item%10);//轉換成16進制寫入1302
write_clock(0x8e,0x80);//寫保護,禁止寫操作
}
/******************************************************************************/
void Timer0_Init(void)//定時器0初始化
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
/******************************************************************************/
void Timer0(void) interrupt 1 using 1//中斷入口,冒號閃爍
{
static unsigned char timecount = 0;
TH0=(65535-50000)/256; //50ms定時
TL0=(65535-50000)%256;
timecount++;
if(timecount > 9)//500MS
{
timecount = 0;
flag = ~flag;
}
}
/******************************************************************************/
void Init_1302(void)//設置1302的初始時間
{
write_clock(0x8e,0x00);//允許寫操作
write_clock(0x8c,0x05);//年
write_clock(0x8a,0x06);//星期
write_clock(0x88,0x01);//月
write_clock(0x86,0x01);//日
write_clock(0x84,0x12);//小時
write_clock(0x82,0x00);//分鐘
write_clock(0x80,0x00);//秒
write_clock(0x90,0xa5);//充電
write_clock(0x8e,0x80);//禁止寫操作
}
/******************************************************************************/
void Lcd_Mark1(void)//在預定的位置上寫入漢字
{
Clr_Scr();//清屏
frame();//顯示邊框
Mcs=1;Scs=0;
Disp_Chinese(5,8,shi);//顯示室溫,星期,年, . ,℃
Disp_Chinese(5,24,wen);
Disp_Chinese(3,8,xing);
Disp_Chinese(3,24,qi);
Disp_Chinese(1,40,nian);
Disp_Digit(5,56,point);
Mcs=0;Scs=1;
Disp_Chinese(5,8,sheshidu);
if(Bell_Swh == 1)//鬧鐘為開
{
Mcs=0;Scs=1;
Disp_Chinese(5,40,biaozhi);//顯示鬧鐘圖標
}
}
/******************************************************************************/
void Lcd_Mark2(void)
{
Clr_Scr();//清屏
frame();//顯示邊框
Mcs=1;Scs=0;//顯示鬧鐘設定等幾個漢字
Disp_Chinese(2,16,nao);
Disp_Chinese(2,32,zhong);
Disp_Chinese(2,48,she);
Mcs=0;Scs=1;
Disp_Chinese(2,0,ding);
Disp_Digit(4,0,maohao);//顯示:
Disp_Digit(4,24,maohao);
}
/******************************************************************************/
void Beep(void)//BELL 蜂明器發聲,整點報警
{
Bell_Out = 0;
Delay(6000);//50ms
Bell_Out = 1;
Delay(6000);//50ms
}
/*****************************************************************************/
void Bell_now(void)
{
Bell_Out = 0;
Delay(31250); //for 250ms
Bell_Out = 1;
Delay(6350); //50ms
Bell_Out = 0;
Delay(18750);//150ms
Bell_Out = 1;
Delay(50000);//400ms
}
/******************************************************************************/
void main(void) //主函數
{
//初始化狀態
Bell_Out = 1;//蜂明器關閉
Bak_Light = 0;//開機背光開
Timer0_Init();
Init_lcd();//設置液晶顯示器
Clr_Scr();//清屏
Disp_Img(logo); //顯示湘靈電子LOGO開機畫面
Delay12864(60000);//Delay 4s
Bak_Light = 1;//關閉背光
Bell_Swh = read_clock(0xc9);//讀取開,關的狀態
Lcd_Mark1();
while(1)//主循環
{
//設置時鐘的初始值,顯示05年1月1號星期六12:00:00
if(Rst_Key == 0)//按下系統復位鍵,S4
{
Delay(1000);//延時消抖
if(Rst_Key == 0)
{
Init_1302();//初始化時鐘
}
}
if(OK_Key == 0 && Dec_Key ==0 )//進入鬧鐘設置界面
{
Delay12864(100);
if(OK_Key == 0 && Dec_Key ==0 )
{
Lcd_Mark2();
if(Bell_Swh == 0){Mcs=0;Scs=1;Disp_Chinese(2,32,guan);}//關
else {Mcs=0;Scs=1;Disp_Chinese(2,32,kai);}
while(1)
{
if (OK_Key == 0) // 設置和選擇項目鍵
{
Delay(1000);
if(OK_Key == 0)
{
id2++;if(id2>5) id2=0;
}
while(OK_Key == 0);//等待鍵松開
}
switch( id2 )
{
case 0:Disp2();break;//正常顯示
case 1:Kgb = 1;id_case2_key();Disp2();break;//開關
case 2:Kgb= 0;Hourb=1;id_case2_key();Disp2();break;//
case 3:Hourb=0;Minb=1;id_case2_key();Disp2();break;
case 4:Minb=0;Secb=1;id_case2_key();Disp2();break;
case 5:Secb=0;id2 = 0;Lcd_Mark1();goto FF;break;//返回主界面
default:break;
}
}//while(1)
}//if
}//if
/*****************************************/
FF: //返回主界面
/*****************************************/
if(flag == 0)
{
Mcs=0;Scs=1;
Disp_Digit(3,8,maohao);// :閃爍
Disp_Digit(3,32,maohao);
}
else
{
Mcs=0;Scs=1;
Disp_Digit(3,8,space);//顯示空格
Disp_Digit(3,32,space);
}
if (OK_Key == 0) // 設置和選擇項目鍵
{
Delay(1000);
if(OK_Key == 0)
{
id++;if(id>7)id=0;
}
while(OK_Key == 0);//等待鍵松開
}
switch( id )
{
case 0:sec = 0; Disp( );break;//正常顯示
case 1:year = 1;id_case1_key();Disp();break;//年
case 2:year=0;mon=1;id_case1_key();Disp();break;//月
case 3:mon=0;day=1;id_case1_key();Disp();break; //日
case 4:day=0;weekk=1;id_case1_key();Disp();break;//星期
case 5:weekk=0;hour=1;id_case1_key();Disp();break; //小時
case 6:hour=0;min=1;id_case1_key();Disp();break; //分鐘
case 7:min=0;sec=1;id_case1_key();Disp();break; //秒
default:break;
}
if(Bell_Swh == 1)//鬧鐘為開
{
H_Bell=read_clock(0xc3);//讀取鬧鐘的時
S_Bell=read_clock(0xc5);//讀取鬧鐘的分
H_1302=read_clock(0x85);//讀小時
S_1302=read_clock(0x83);//讀分鐘
if(H_Bell == H_1302)
{
if(S_Bell == S_1302)
{
Clr_Scr();//清屏
frame();//顯示邊框
Mcs=1;Scs=0;
Disp_Chinese(3,16,nao);//鬧鐘顯示時間到!
Disp_Chinese(3,32,zhong);
Disp_Chinese(3,48,shit);
Mcs=0;Scs=1;
Disp_Chinese(3,0,jian);
Disp_Chinese(3,16,dao);
Disp_Digit(3,40,fh);
while(S_Bell == S_1302)//判斷是否到鬧鐘設定時間
{
Bak_Light = 0;//鬧鐘時間到,打開LCD背光
Bell_now();//鬧鐘響
S_1302=read_clock(0x83);//讀分鐘
if(OK_Key == 0 || Dec_Key ==0 || Add_Key == 0)
{
Bak_Light = 1;//關閉背光
Bell_Swh = 0;//關閉鬧鐘
break; //終止鬧鐘按任意鍵退出!
}
}
Lcd_Mark1();//返回萬年歷時鐘界面
}//if(S_Bell == S_1302)
}//if(H_Bell == H_1302)
}//if鬧鐘開
}//while
}//main
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -