附 录 if((u1+1)==0) { u1=59; }
if(u1>59) { u1=59; } }
Write_ds1302(rd,(u1/10)<<4 | (u1));////秒 write_sfm(fd,u1);
lcd_wcom(0x80+0x40+fd);//显示分 lcd_wcom(0x38);
lcd_wcom(0x0f);//显示功能开,有光标 }
//时的加减子函数//输入//
void hjia_key(uchar rd,uchar wd,uchar fd,uchar shi) {
u0=Read_ds1302(wd);
u0=((u0&0x70)>>4)*10+(u0&0x0F); if(shi==1) { u0++; if(u0==24) {u0=0; } } else { u0--;
if((u0+1)==0) { u0=23; }
if(u0>23) { u0=23; } }
Write_ds1302(rd,(u0/10)<<4 | (u0)); //秒 _asm(\
write_sfm(fd,u0);
lcd_wcom(0x80+0x40+fd); //显示分 _asm(\lcd_wcom(0x38);
lcd_wcom(0x0f); //显示功能开,有光标 lcd_wcom(0x80+0x40+fd); }
//日的加减子函数/输入//
void rjia_key(uchar rd,uchar wd,uchar fd,uchar day)
23
附 录 { n3=Read_ds1302(wd);
n3=((n3&0x70)>>4)*10+(n3&0x0F); if (day==1) { n3++; if(n3==32) { n3=0; } } else {n3--;
if((n3+1)==0) {
n3=31; }
_asm(\if(n3>31) { n3=31; } }
Write_ds1302(rd,(n3/10)<<4 | (n3)); _asm(\
write_sfm1(fd,n3); _asm(\
lcd_wcom(0x80+fd); //显示 lcd_wcom(0x38);
lcd_wcom(0x0f); //显示功能开,有光标 }
// 月的子函数//输入//
void yjia_key(uchar rd,uchar wd,uchar fd,uchar yue) {n2=Read_ds1302(wd);
n2=((n2&0x70)>>4)*10+(n2&0x0F); _asm(\
if(yue==1) { n2++; if(n2==13) { n2=0; } } else {n2--;
if((n2+1)==0) { n2=12; }
24
附 录 if(n2>12) { n2=12; } }
Write_ds1302(rd,(n2/10)<<4 | (n2)); _asm(\
write_sfm1(fd,n2); _asm(\
lcd_wcom(0x80+fd); _asm(\lcd_wcom(0x38);
lcd_wcom(0x0f);//显示功能开,有光标 }
// 年的子函数/输入//
void njia_key(uchar rd,uchar wd,uchar fd,uchar nian) { n1=Read_ds1302(wd);
n1=((n1&0xF0)>>4)*10+(n1&0x0F); if (nian==1) {n1++;
if(n1==100) { n1=0; } }
else {n1--;
if((n1+1)==0) { n1=99; }
if(n1>99) { n1=99; } }
Write_ds1302(rd,(n1/10)<<4 | (n1)); write_sfm1(fd,n1);
lcd_wcom(0x80+fd); //显示 lcd_wcom(0x38);
lcd_wcom(0x0f); //显示功能开,有光标 lcd_wcom(0x80+fd); }
//初始化1302,设置开始时候的时分秒 void Init_DS1302(void) {
Write_ds1302(Write_protect,0x00);
25
附 录 Write_ds1302(Write_year,0x0A);//年
Write_ds1302(Write_month,0XC); //月 Write_ds1302(Write_day,0X22); //日 Write_ds1302(Write_hour,0X23); //小时 Write_ds1302(Write_minute,0X59); //分 Write_ds1302(Write_second,0X00); //秒
Write_ds1302(Write_protect,0x80); //关闭寄存器操作; }
void write_sfm(uchar add,uchar dat) { uchar shi,ge; shi=dat/10; ge=dat;
lcd_wcom(0x80+0x40+add); lcd_wdat(table2[shi]); lcd_wdat(table2[ge]); }
void write_sfm1(uchar add,uchar dat) { uchar shi,ge; shi=dat/10; ge=dat;
lcd_wcom(0x80+add); lcd_wdat(table2[shi]); lcd_wdat(table2[ge]); }
void write_sfm2(uchar add,uchar dat) { uchar k,ge; ge=dat;
lcd_wcom(0x80+add);
for(k=(ge*3-3);k<(ge*3);k++) { lcd_wdat(table3[k]); delay(5);} }
void lcd_init1(void) //显示祝福语 { uchar i,k=0; PD_ODR=0x11; lcd_wcom(0x80); for(i=0;i<16;i++)
{ lcd_wdat(table4[i]); }
lcd_wcom(0x80+0x40); for(k=0;k<16;k++)
{ lcd_wdat(table5[k]); delay(100);
26
附 录 PD_ODR=0X18; } }
void naozhong(uchar hour1,uchar day1,uchar month1) {
if(hour1==00) //判断是否时相等 {
if(day1==23) //判断日是否相等 {
if(month1==12) //判断月是否相等 {
lcd_init1();
lcd_wcom(0x01); //清屏 lcd_init(); PD_ODR=0X00; return; } } } }
void read_shzh(void) {
u2=Read_ds1302(Read_second ); //把读取的数据暂时储存在u2 u2=((u2&0x70)>>4)*10+(u2&0x0F); //转十进制的bcd码换成十进制 write_sfm(6,u2);
u1=Read_ds1302(Read_minute ); //分
u1=((u1&0xF0)>>4)*10+(u1&0x0F); //转换成十进制 write_sfm(3,u1); //显示分
u0=Read_ds1302(Read_hour ); //时
u0=((u0&0xF0)>>4)*10+(u0&0x0F); //转换成十进制 write_sfm(0,u0); //显示小时 u3=Read_ds1302(Read_week ); //周
u3=u3&0x0F; //转换成十进制 write_sfm2(11,u3); //显示星期 n1=Read_ds1302(Read_year );
n1=((n1&0xF0)>>4)*10+(n1&0x0F); //转换成十进制 write_sfm1(2,n1); //显示年 n3=Read_ds1302(Read_day );
n3=((n3&0x30)>>4)*10+(n3&0x0F); //转换成十进制 write_sfm1(8,n3); //显示日 n2=Read_ds1302(Read_month );
n2=((n2&0x10)>>4)*10+(n2&0x0F); //转换成十进制 write_sfm1(5,n2); //显示月 if(u1==0)
27
附 录 {naozhong(u0,n3,n2); //闹钟子函数 } }
main() {
_asm(\
delay(20); //延时15ms等待电源电压稳定 GPIO_Init(); //IO口初始化 _asm(\lcd_init(); _asm(\delay(5);
Init_DS1302(); while (1) {_asm(\delay(5); read_shzh(); _asm(\} } 28