{ case 1: nz_miao--; if(nz_miao==-1) nz_miao=59;//秒数据减到-1时自动变成59 write_sfm(14,nz_miao);//在LCD的正确位置显示改变后新的秒数 write_1602com(er+15); break; case 2: nz_fen--; if(nz_fen==-1) nz_fen=59; write_sfm(11,nz_fen); write_1602com(er+12);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置 break; case 3: nz_shi--; if(nz_shi==-1) nz_shi=23; write_sfm(8,nz_shi); write_1602com(er+9);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; } } } } }
//-------------------------------
void init(void) //定时器、计数器设置函数 { TMOD=0x11; //指定定时/计数器的工作方式为3 TH0=0; //定时器T0的高四位=0 TL0=0; //定时器T0的低四位=0 TH1=0x3C; TL1=0xB0; EA=1; //系统允许有开放的中断 ET0=1; //允许T0中断 ET1=1; IT1=1;
IT0=0; TR0=1; //开启中断,启动定时器 TR1=0; }
void alarm(void) { if((shi==nz_shi)&&(fen==nz_fen)&&(miao==0)) { TR1=1; } if((shi==nz_shi)&&(fen==(nz_fen+1))) { TR1=0; buzzer=1; } }
void ZD_baoshi(void) { buzzer=0; delay(5); buzzer=1; bsn++; if(bsn==temp_hour) { baoshi=0; } }
//*******************主函数************************** //*************************************************** void main() { P1=0xff; lcd_init(); //调用液晶屏初始化子函数 ds1302_init(); //调用DS1302时钟的初始化子函数 init(); //调用定时计数器的设置子函数 led=0; //打开LCD的背光电源 led1=0; buzzer=0; //蜂鸣器长响一次 delay(80);
buzzer=1; LED=0; while(1) //无限循环下面的语句: {
keyscan(); //调用键盘扫描子函数 led=led1; if(timerOn==1) alarm(); //闹钟输出 if((fen==0)&&(miao==0)) { if(shi>12) temp_hour=shi-12; else { if(shi==0) temp_hour=12; else temp_hour=shi; } shangyimiao=miao; baoshi=1; } if(baoshi==1) { ZD_baoshi(); do keyscan(); while(shangyimiao==miao); shangyimiao=miao; } } }
void timer0() interrupt 1 //取得并显示日历和时间 {
//Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中
// flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示
//读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83)); shi = BCD_Decimal(read_1302(0x85)); ri = BCD_Decimal(read_1302(0x87)); yue = BCD_Decimal(read_1302(0x89)); nian=BCD_Decimal(read_1302(0x8d)); //week=BCD_Decimal(read_1302(0x8b)); //不读取,直接通过日期计算得到 if((led1==0)) { if(temp_miao!=miao) { temp_miao=miao; bltime++; } if(bltime==10) { led1=1; LED=1; bltime=0; } }
if(T_NL_NZ==1) //显示农历 { uint nian_temp,temp; temp=nian; nian_temp=2000+(temp&0xF0)*10+temp&0x0F; if((nian_temp@0==0)||((nian_temp0!=0)&&(nian_temp%4==0))) 为闰年 p_r=1; else p_r=0; Conversion(0,nian,yue,ri); write_1602com(er);//时间显示固定符号写入位置? for(a=0;a<16;a++) { if(p_r==0) write_1602dat(nlp[a]);//写显示时间固定符号,两个冒号 else write_1602dat(nlr[a]); } write_nl(3,year_moon);//农历 年 write_nl(6,month_moon);//农历 月
//判断是否
}
write_nl(9,day_moon);//农历 日 do keyscan();
while(T_NL_NZ==1);
write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示 for(a=0;a<16;a++) { write_1602dat(qk[a]);//写显示时间固定符号,两个冒号 }
write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示 for(a=0;a<8;a++) { write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号 }
if(T_NL_NZ==2) //显示闹钟时间, { write_1602com(er);//时间显示固定符号写入位置? for(a=0;a<16;a++) write_1602dat(NZd[a]);//写显示时间固定符号,两个冒号 write_sfm(8,nz_shi);//农历 年 write_sfm(11,nz_fen);//农历 月 write_sfm(14,nz_miao);//农历 日
do keyscan();
while(T_NL_NZ==2);
write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示 for(a=0;a<16;a++) { write_1602dat(qk[a]);//写显示时间固定符号,两个冒号 }
write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示 for(a=0;a<8;a++) { write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号 }