?? clock.c
字號:
/*****************************************************************************/
//DS1302寫數(shù)據(jù)(底層協(xié)議)
void write_clock(unsigned char ord, unsigned char dd){
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}
/*****************************************************************************/
/*****************************************************************************/
//設(shè)置1302的初始時間
void Init_1302(void){//(2007年1月1日00時00分00秒星期一)
write_clock(0x8e,0x00);//允許寫操作
write_clock(0x8c,0x07);//年.
write_clock(0x8a,0x01);//星期.
write_clock(0x88,0x12);//月.
write_clock(0x86,0x31);//日.
write_clock(0x84,0x23);//小時.
write_clock(0x82,0x59);//分鐘.
write_clock(0x80,0x00);//秒.
write_clock(0x90,0xa5);//充電.
write_clock(0x8e,0x80);//禁止寫操作.
}
/*****************************************************************************/
/*****************************************************************************/
//向LCM中填寫 小時 數(shù)據(jù)
void lcm_w_hh(void){
if(read_clock(0x85) != hh){
hh = read_clock(0x85);
// if (hh > 0x07 && hh < 0x22 && w == 0){
// beep = 0; led_r = 0;
// DelayM(100);
// beep = 1; led_r = 1;
// }
}
lcm_w_test(0,0x88);
lcm_w_test(1,(hh/16)+0x30);
lcm_w_test(1,hh%16+0x30);
} //}
/*****************************************************************************/
/*****************************************************************************/
//向LCM中填寫 日 數(shù)據(jù)
void lcm_w_dd(void){
if(read_clock(0x87) != dd){
dd = read_clock(0x87);
lcm_w_test(0,0x92);
if(dd/16 != 0){lcm_w_test(1,(dd/16)+0x30);} //十位消隱
else{lcm_w_test(1,0x20);}//同上
lcm_w_test(1,dd%16+0x30);
lcm_w_test(0,0x93);
lcm_w_word("日 ");
} }
/*****************************************************************************/
/*****************************************************************************/
//星期處理并送入LCM的指定區(qū)域
void lcm_w_xq(void){
unsigned char sel;
if(read_clock(0x8b) != xq){
xq = read_clock(0x8b);
sel = (read_clock(0x8b))%16; //字節(jié)低4位的BCD碼放入sel
lcm_w_test(0,0x97);//寫入指定區(qū)域(97H 第二行第8個字)
if(sel==7) {lcm_w_word("日");} //
if(sel==6) {lcm_w_word("六");} //
if(sel==5) {lcm_w_word("五");} //
if(sel==4) {lcm_w_word("四");} //
if(sel==3) {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因為“三”的內(nèi)碼失效。
if(sel==2) {lcm_w_word("二");} //
if(sel==1) {lcm_w_word("一");} //星期一
lcm_w_test(0,0x95);
lcm_w_word("星期");
}
}
/*****************************************************************************/
/*****************************************************************************/
//向LCM中填寫 月 數(shù)據(jù)
void lcm_w_mo(void){
if(read_clock(0x89) != mo){
mo = read_clock(0x89);
lcm_w_test(0,0x90);
if(mo/16 != 0){lcm_w_test(1,(mo/16)+0x30);} //十位消隱
else{lcm_w_test(1,0x20);}//同上
lcm_w_test(1,mo%16+0x30);
lcm_w_test(0,0x91);
lcm_w_word("月");
} }
/*****************************************************************************/
/*****************************************************************************/
//向LCM中填寫 年 數(shù)據(jù)
void lcm_w_yy(void){
if(read_clock(0x8d) != yy){
yy = read_clock(0x8d);
lcm_w_test(0,0x83);
lcm_w_word("20");
lcm_w_test(0,0x84);
lcm_w_test(1,(yy/16)+0x30);
lcm_w_test(1,yy%16+0x30);
}
}
/*****************************************************************************/
/*****************************************************************************/
//刷新數(shù)據(jù)
void updata (void){
lcm_w_hh();//刷新 小時
lcm_w_dd();//刷新 日
lcm_w_xq();//更新星期值
lcm_w_mo();//刷新 月
lcm_w_yy();//刷新 年
}
/*****************************************************************************/
/*****************************************************************************/
//向LCM中填寫 分鐘 數(shù)據(jù)
void lcm_w_mm(void){
if(read_clock(0x83) != mm){
mm = read_clock(0x83);
if( w == 0){
// days(); //節(jié)日顯示
updata (); //刷新數(shù)據(jù)
}
}
lcm_w_test(0,0x89);
lcm_w_test(1,0x3a); //":"
lcm_w_test(1,(mm/16)+0x30);
lcm_w_test(1,mm%16+0x30);
lcm_w_test(1,0x2e); //"."
}
/*****************************************************************************/
/*****************************************************************************/
//向LCM中填寫 秒 數(shù)據(jù)
void lcm_w_ss(void){
unsigned int i=0;
unsigned char a=0,b=0,c=0;
if(read_clock(0x81) != ss){ //判斷是否需要更新
ss = read_clock(0x81); //更新數(shù)據(jù)
lcm_w_test(0,0x8b); //秒值在LCM上的寫入位置
lcm_w_test(1,(ss/16)+0x30); //寫十位
lcm_w_test(1,ss%16+0x30); //寫個位
lcm_w_mm();//刷新 分
// lcm_w_test(0,0x8d); //溫度在LCM上的寫入位置
}
}
/*****************************************************************************/
/*****************************************************************************/
//調(diào)時用加1程序
void Set_time(unsigned char sel){ //根據(jù)選擇調(diào)整的相應(yīng)項目加1并寫入DS1302
signed char address,item;
signed char max,mini;
lcm_w_test(0,0x9a);
lcm_w_word("調(diào)整");
//if(sel==6) {lcm_w_word("秒鐘");address=0x80; max=0;mini=0;} //秒7
if(sel==5) {lcm_w_word("分鐘");address=0x82; max=59;mini=0;} //分鐘6
if(sel==4) {lcm_w_word("小時");address=0x84; max=23;mini=0;} //小時5
if(sel==3) {lcm_w_word("星期");address=0x8a; max=7;mini=1;} //星期4
if(sel==2) {lcm_w_word("日期");address=0x86; max=31;mini=1;} //日3
if(sel==1) {lcm_w_word("月份");address=0x88; max=12;mini=1;} //月2
if(sel==0) {lcm_w_word("年份");address=0x8c; max=99; mini=0;} //年1
//讀取1302某地址上的數(shù)值轉(zhuǎn)換成10進制賦給item
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(date[2]==0x19){
item++;//數(shù)加 1
}
if(date[2]==0x1D){
item--;//數(shù)減 1
}
if(item>max) item=mini;//查看數(shù)值有效范圍
if(item<mini) item=max;
write_clock(0x8e,0x00);//允許寫操作
write_clock(address,(item/10)*16+item%10);//轉(zhuǎn)換成16進制寫入1302
write_clock(0x8e,0x80);//寫保護,禁止寫操作
updata (); //刷新數(shù)據(jù)
lcm_w_mm();//刷新 分
}
/*****************************************************************************/
//---主程序---//
main() {
unsigned char e=0;
SP=0x60; //堆棧指針
EX0=1; //允許外部中斷0,用于檢測紅外遙控器按鍵
EA=1; //總中斷開
yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各數(shù)據(jù)刷新 .
DelayM(900);
lcm_init();//初始化液晶顯示器
lcm_clr();//清屏 .
lcm_w_word(" 12864LcdClock Hello !! from DoYoung.net");//顯示歡迎字
DelayM(3000); //顯示等留3秒
lcm_clr();//清屏 .
while(1)
{
P0=date[3];
lcm_w_ss();
// date[3]=0xff;
//-----------------------------
if(date[2]==0x00)
{
Init_1302();
date[2]=0xff;
}
//-----------------------------
//----------------------------
if(date[2]==0x01)
{
write_clock(0x8e,0x00);//允許寫操作
write_clock(0x80,0x00);//秒.
write_clock(0x90,0xa5);//充電.
write_clock(0x8e,0x80);//禁止寫操作.
date[2]=0xff;
}
//----------------------------------------------------------
if(date[2]==0x0c && w == 1) //當(dāng)是調(diào)時狀態(tài) 本鍵用于調(diào)整下一項.
{
e++;
if (e >= 6 ){e = 0;}
Set_time(e);//調(diào)整
date[2]=0xff;
}
if(date[2] == 0x0c && w == 0) //當(dāng)是正常狀態(tài)時就進入調(diào)時狀態(tài)
{
lcm_clr();//清屏.
w=1; //進入調(diào)時
Set_time(e);//調(diào)整
date[2]=0xff;
}
//---------------------------------------------------------------
//***************************************************************************
if(date[2]==0x19 && w == 1){
Set_time(e);//調(diào)整
date[2]=0xff;
}
//***************************************************************************
//***************************************************************************
if(date[2]==0x1D && w == 1){
Set_time(e);//調(diào)整.
date[2]=0xff;
}
//****************************************************************************
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -