?? ds18b20+ds1320+lcd12864.c
字號:
clear();
write_character(0,2,"設",0);
write_character(0,4,"置",0);
write_character(0,10,"返",0);
write_character(0,12,"回",0);
write_ascii(2,5,1,0);
write_character(2,6,"時",0);
write_character(2,8,"間",0);
write_ascii(4,5,2,0);
write_character(4,6,"鬧",0);
write_character(4,8,"鐘",0);
write_ascii(6,5,3,0);
write_character(6,6,"溫",0);
write_character(6,8,"度",0);
while(BACK1!=0)
{
if(K1==0)
{
delayms(60);
while(K1==0);
MF++;
}
if(K3==0)
{
delayms(60);
while(K3==0);
MF--;
}
if(MF==4)
{
MF=0;
}
if(MF==0xff)
{
MF=3;
}
switch(MF)
{
case 0:write_character(0,10,"返",1);
write_character(0,12,"回",1);
write_character(0,2,"設",0);
write_character(0,4,"置",0);
write_ascii(2,5,1,0);
write_character(2,6,"時",0);
write_character(2,8,"間",0);
write_ascii(4,5,2,0);
write_character(4,6,"鬧",0);
write_character(4,8,"鐘",0);
write_ascii(6,5,3,0);
write_character(6,6,"溫",0);
write_character(6,8,"度",0);
if(K2==0)
{
delayms(60);
while(K2==0);
clear();
BACK1=0;
}
break;
case 1:write_ascii(2,5,1,1);
write_character(2,6,"時",1);
write_character(2,8,"間",1);
write_character(0,2,"設",0);
write_character(0,4,"置",0);
write_character(0,10,"返",0);
write_character(0,12,"回",0);
write_ascii(4,5,2,0);
write_character(4,6,"鬧",0);
write_character(4,8,"鐘",0);
write_ascii(6,5,3,0);
write_character(6,6,"溫",0);
write_character(6,8,"度",0);
if(K2==0)
{
delayms(60);
while(K2==0);
timereset();
}
break;
case 2:write_ascii(4,5,2,1);
write_character(4,6,"鬧",1);
write_character(4,8,"鐘",1);
write_character(0,2,"設",0);
write_character(0,4,"置",0);
write_character(0,10,"返",0);
write_character(0,12,"回",0);
write_ascii(2,5,1,0);
write_character(2,6,"時",0);
write_character(2,8,"間",0);
write_ascii(6,5,3,0);
write_character(6,6,"溫",0);
write_character(6,8,"度",0);
if(K2==0)
{
delayms(60);
while(K2==0);
ringreset();
}
break;
case 3:write_ascii(6,5,3,1);
write_character(6,6,"溫",1);
write_character(6,8,"度",1);
write_character(0,2,"設",0);
write_character(0,4,"置",0);
write_character(0,10,"返",0);
write_character(0,12,"回",0);
write_ascii(2,5,1,0);
write_character(2,6,"時",0);
write_character(2,8,"間",0);
write_ascii(4,5,2,0);
write_character(4,6,"鬧",0);
write_character(4,8,"鐘",0);
if(K2==0)
{
delayms(60);
while(K2==0);
tempreset();
}
break;
}
}
}
/****************************************************************************
按鍵處理
****************************************************************************/
void keyscanf(void)
{
if(K1==0)
{
delayms(40);
while(K1==0);
tempdisplay();
delays(40);
clear();
}
if(K2==0)
{
delayms(40);
while(K2==0);
keyscanf1();
clear();
}
if(K3==0)
{
delayms(40);
while(K3==0);
ringdisplay();
delays(50);
clear();
}
}
/***************************************************************************
調整
****************************************************************************/
unsigned char turntobcd(unsigned char x,unsigned char y,unsigned char value,
unsigned char max,unsigned char min)
{
unsigned char valueh;
unsigned char valuel;
valueh=value>>4;
valuel=value&0x0f;
value=valueh*10+valuel;
while(K2!=0)
{
if(K1==0)
{
delayms(60);
while(K1==0);
value++;
}
if(K3==0)
{
delayms(60);
while(K3==0);
value--;
}
if(min==0)
{
if(value==0x0ff) value=max;
}
else
{
if(value<min) value=max;
}
if(value>max)
{
value=min;
}
if((x==4)&&(y==8))
{
if(SCNF==1) write_week(x,y,value,1);
else
{
write_ascii(x,y,12,0);
write_ascii(x,y+1,12,0);
}
}
else
{
if(SCNF==1)
{
write_ascii(x,y,value/10,1);
write_ascii(x,y+1,value%10,1);
}
else
{
write_ascii(x,y,12,0);
write_ascii(x,y+1,12,0);
}
}
}
delayms(60);
while(K2==0);
valueh=value/10;
valuel=value%10;
value=((valueh<<4)|valuel);
return value;
}
/****************************************************************************
鬧鐘音樂
****************************************************************************/
void sound(void)
{
unsigned char p,m;
unsigned char i=0;
unsigned char time=3;
initTimer1();
IE=0xaa;
play:
while((K1&&K2&&K3)&time!=0)
{
a: p=music_tab[i];
if(p==0x00)
{
time--;
i=0;
delays(8);
goto play;
}
else if(p==0xff)
{
i=i+1;
delayms(20);
TR1=0;
goto a;
}
else
{
m=music_tab[i++];
n=music_tab[i++];
}
TR1=1;
while(n!=0)
{
BUZZ=~BUZZ;
delayus(3*m);
}
TR1=0;
}
delayms(60);
while((K1&&K2&&K3)!=0);
}
/****************************************************************************
鬧鐘1顯示
****************************************************************************/
void display1(void)
{
unsigned char onoff1=read_ds1302(0x0c1);
unsigned char ring1h=read_ds1302(0x0c3);
unsigned char ring1l=read_ds1302(0x0c5);
clear();
write_character(0,5,"鬧",0);
write_character(0,9,"鐘",0);
write_week(4,2,1,0);
write_character(4,4,"路",0);
write_ascii(4,9,ring1h>>4,0);
write_ascii(4,10,ring1h&0x0f,0);
write_ascii(4,11,11,0);
write_ascii(4,12,ring1l>>4,0);
write_ascii(4,13,ring1l&0x0f,0);
write_character(6,2,"定",0);
write_character(6,4,"時",0);
write_character(6,6,"時",0);
write_character(6,8,"間",0);
write_character(6,10,"到",0);
if(onoff1==0)
{
write_character(4,6,"關",0);
}
else
{
write_character(4,6,"開",0);
}
}
/****************************************************************************
鬧鐘2顯示
****************************************************************************/
void display2(void)
{
unsigned char onoff2=read_ds1302(0x0c7);
unsigned char ring2h=read_ds1302(0x0c9);
unsigned char ring2l=read_ds1302(0x0cb);
clear();
write_character(0,5,"鬧",0);
write_character(0,9,"鐘",0);
write_week(4,2,2,0);
write_character(4,4,"路",0);
write_ascii(4,9,ring2h>>4,0);
write_ascii(4,10,ring2h&0x0f,0);
write_ascii(4,11,11,0);
write_ascii(4,12,ring2l>>4,0);
write_ascii(4,13,ring2l&0x0f,0);
write_character(6,2,"定",0);
write_character(6,4,"時",0);
write_character(6,6,"時",0);
write_character(6,8,"間",0);
write_character(6,10,"到",0);
if(onoff2==0)
{
write_character(4,6,"關",0);
}
else
{
write_character(4,6,"開",0);
}
}
/****************************************************************************
返回月大小
****************************************************************************/
bit get_lunar_day(unsigned char month_p,unsigned int table_addr)//子函數,用于讀取數據表中農歷月的大月或小月,如果該月為大返回1,為小返回0*/
{
unsigned char temp;
switch (month_p)
{
case 1:temp=year_code[table_addr]&0x08;
if(temp==0)return(0);
else return(1);
break;
case 2:temp=year_code[table_addr]&0x04;
if(temp==0)return(0);
else return(1);
break;
case 3:temp=year_code[table_addr]&0x02;
if(temp==0)return(0);
else return(1);
break;
case 4:temp=year_code[table_addr]&0x01;
if(temp==0)return(0);
else return(1);
break;
case 5:temp=year_code[table_addr+1]&0x80;
if(temp==0) return(0);
else return(1);
break;
case 6:temp=year_code[table_addr+1]&0x40;
if(temp==0)return(0);
else return(1);
break;
case 7:temp=year_code[table_addr+1]&0x20;
if(temp==0)return(0);
else return(1);
break;
case 8:temp=year_code[table_addr+1]&0x10;
if(temp==0)return(0);
else return(1);
break;
case 9:temp=year_code[table_addr+1]&0x08;
if(temp==0)return(0);
else return(1);
break;
case 10:temp=year_code[table_addr+1]&0x04;
if(temp==0)return(0);
else return(1);
break;
case 11:temp=year_code[table_addr+1]&0x02;
if(temp==0)return(0);
else return(1);
break;
case 12:temp=year_code[table_addr+1]&0x01;
if(temp==0)return(0);
else return(1);
break;
case 13:temp=year_code[table_addr+2]&0x80;
if(temp==0)return(0);
else return(1);
break;
}
}
/****************************************************************************
公歷轉農歷
****************************************************************************/
void solartolunar(void)
{
unsigned char temp1,temp2,temp3;
unsigned char month_p;
unsigned int temp4,table_addr;
unsigned char year;
unsigned char month;
unsigned char day;
bit flag2,flag_y;
readtime();
year=YEAR;
month=MONTH;
day=DAY;
temp1=year/16; //BCD->hex 先把數據轉換為十六進制
temp2=year%16;
year=temp1*10+temp2;
temp1=month/16;
temp2=month%16;
month=temp1*10+temp2;
temp1=day/16;
temp2=day%16;
day=temp1*10+temp2;
table_addr=(year+1)*0x03;
temp1=year_code[table_addr+2]&0x60; //取當年春節所在的公歷月份
temp1=_cror_(temp1,5);
temp2=year_code[table_addr+2]&0x1f; //取當年春節所在的公歷日
if(temp1==0x01) temp3=temp2-1; // 計算當年春節離當年元旦的天數,春節只會在公歷1月或2月
else temp3=temp2+0x1f-1;
temp4=day_code[month-1]+day-1; //計算公歷日離當年元旦的天數
if((month>0x02)&&(year%0x04==0)) temp4=temp4+1; //如果公歷月大于2月并且該年的2月為閏月,天數加1
if(temp4>=temp3) //判斷公歷日在春節前還是春節后
{
temp4=temp4-temp3;//公歷日在春節后或就是春節當日使用下面代碼進行運算
month=0x01;
month_p=0x01; //month_p為月份指向,公歷日在春節前或就是春節當日month_p指向首月
flag2=get_lunar_day(month_p,table_addr); //檢查該農歷月為大小還是小月,大月返回1,小月返回0
flag_y=0;
if(flag2==0)temp1=0x1d; //小月29天
else temp1=0x1e; //大小30天
temp2=year_code[table_addr]&0xf0;
temp2=_cror_(temp2,4); //從數據表中取該年的閏月月份,如為0則該年無閏月
while(temp4>=temp1)
{
temp4=temp4-temp1;
month_p=month_p+1;
if(month==temp2)
{
flag_y=~flag_y;
if(flag_y==0) month+=1;
}
else month+=1;
flag2=get_lunar_day(month_p,table_addr);
if(flag2==0) temp1=0x1d;
else temp1=0x1e;
}
day=temp4+1;
}
else //公歷日在春節前使用下面代碼進行運算
{
temp3=temp3-temp4;
if(year==0) year=59;
else year=year-1;
table_addr=table_addr-0x03;
month=0x0c;
temp2=year_code[table_addr]&0xf0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -