delay1ms();
}
/*********************蜂鸣器函数*****************************/
voiddidi()
{
uchari;
for(i=0;i<60;i++)
{
beep=0;
delay
(1);
beep=1;
delay
(1);
}
}
/*******************************************************************************/
voidgudingtime_1602()
{
ucharnum;
write_com(0x80);//将指针指向初始位置
for(num=0;num<11;num++)//循环函数,用于将"12--"写入液晶
write_data(table[num]);
write_com(0x80+0x40);//将指针指向1602液晶的第二行
for(num=0;num<16;num++)//功能与上同,用于将":
:
:
"写入
write_data(table1[num]);
}
/**************************显示欢迎界面函数*************************************/
voiddisplaystar(void)
{
uchari;
write_com(0x80);
for(i=0;i<16;i++)
write_data(table2[i]);
write_com(0x80+0x40);
for(i=0;i<16;i++)
write_data(table3[i]);
}
/***************************显示时间、日期子函数*********************************/
voidwrite_sfm(ucharadd,uchartime)//用于在1602上显示年、月、日、时、分、秒。
Add为显示位置,time为要显示的内容
{
ucharshiwei,gewei;
shiwei=time/16;//将从DS1302中读取的BCD码数据转化成10进制个位和10
gewei=time%16;//进制十位
write_com(add+0x80);//定义显示在液晶的什么位置
write_data(0x30+shiwei);//由1602液晶字库可知,0~9的数据码分别对应0x30~0x39
write_data(0x30+gewei);//初使化中设定了写一个字符后,地址指针加1,因此这里
}//不用重新光标写位
/**************************显示周子函数*****************************************/
/***voidwrite_zhou(uchartime1)//用于在1602上显示周信息,与显示
{//时间日期子函数类似
uchargewei;
gewei=time1%16;//一周七天,因此只需个位
write_com(0x80+15);
write_data(0x30+gewei);
}
/***************************写数据字节子函数************************************/
voidInput_1byte(ucharTD)//写一字节数据
{
uchari;
ACC=TD;
for(i=8;i>0;i--)
{
sda=ACC0;
sck=1;
sck=0;
ACC=ACC>>1;
}
}
/*************************读数据字节子函数**************************************/
ucharOutput_1byte(void)//读一字节数据
{
uchari;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=sda;
sck=1;
sck=0;
}
return(ACC);
}
/***************************写DS1302数据函数***********************************/
voidwrite_1302(ucharDS_ADD,ucharDS_DAT)//写操作
{
rst=0;
sck=0;
rst=1;
Input_1byte(DS_ADD);
Input_1byte(DS_DAT);
sck=1;
rst=0;
}
/***************************读DS1302数据函数***********************************/
ucharread_1302(ucharDS_ADD)//读操作
{
ucharDS_INF;
rst=0;
sck=0;
rst=1;
Input_1byte(DS_ADD);
DS_INF=Output_1byte();
sck=1;
rst=0;
return(DS_INF);
}
/*************************初始化DS1302子函数***********************************/
voidinital_1302()
{
write_1302(0x8e,0x00);//禁止写保护
/*write_1302(0x90,0xaa);//定义充电*/
write_1302(0x80,0x53);//秒
write_1302(0x84,0x13);//时
write_1302(0x82,0x43);//分
write_1302(0x8c,0x14);//年
write_1302(0x88,0x09);//月
write_1302(0x86,0x06);//日
write_1302(0x8a,0x06);//星期
write_1302(0xc0,0x08);//闹钟小时初始化
write_1302(0xfc,0x00);//闹钟分钟初始化
write_1302(0x8e,0x80);//开保护
}
/**************扫描函数*******************************************************/
voidkeyscan()
{
if(s1==0&&s4num==0)//按键1按下且s4再次之前未曾按过
{
delay(5);
if(s1==0&&s4num==0)
{
flag1=1;
s1num++;
while(!
s1);
didi();
if(s1num==1)
{
write_com(0x80+0x40+8);//光标移动到**位置
write_com(0x0f);//显示光标
}
if(s1num==2)
{
write_1302(0x8e,0x00);//可以写
write_1302(0x80,miao);//写入秒信息
write_1302(0x8e,0x80);//开写保护
write_com(0x80+0x40+5);
}
if(s1num==3)
{
write_1302(0x8e,0x00);
write_1302(0x82,fen);//分
write_1302(0x8e,0x80);
write_com(0x80+0x40+2);
}
if(s1num==4)
{
write_1302(0x8e,0x00);
write_1302(0x88,yue);//月
write_1302(0x8e,0x80);
write_com(0x80+13);
}
if(s1num==5)
{
write_1302(0x8e,0x00);
write_1302(0x84,shi);//时
write_1302(0x8e,0x80);
write_com(0x80+10);
}
if(s1num==6)
{
write_1302(0x8e,0x00);
write_1302(0x86,ri);//日
write_1302(0x8e,0x80);
write_com(0x80+7);
}
if(s1num==7)
{
write_1302(0x8e,0x00);
write_1302(0x8c,nian);//年
write_1302(0x8e,0x80);
write_com(0x80+4);
}
/*if(s1num==8)
{
flag1=0;
s1num=0;
write_1302(0x8e,0x00);
write_1302(0x8a,zhou);
write_1302(0x8e,0x80);
write_com(0x0c);//不显示光标
}*/
}
}
/*******************************************************************************/
if(s1num!
=0&&s4num==0)//按键1按下*次且s4再次之前未曾按过(按键按下时,时间修改函数)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!
s2);
didi();
if(s1num==1)
{
intx1,x2;
x1=miao%16;
x2=miao/16;
x1++;
if(x1==10)
{
x1=0;
x2++;
if(x2>=6)
x2=0;
}
miao=x1+x2*16;//秒
write_sfm(0x40+7,miao);//将修改的数送到1602显示
}
write_com(0x80+0x40+8);//挪回光标
}
if(s1num==2)
{
intx3,x4;
x3=fen%16;
x4=fen/16;
x3++;
if(x3==10)
{
x3=0;
x4++;
if(x4>=6)
x4=0;
}
fen=x3+x4*16;
write_sfm(4+0x40,fen);
write_com(0x80+0x40+5);//分
}
if(s1num==3)
{
intx5,x6;
x5=shi%16;
x6=shi/16;
x5++;
if(x6>=2&&x5>=4)
{
x5=0;
x6=0;
}
if(x5==10)
{
x5=0;
x6++;
}
shi=x5+x6*16;
write_sfm(1+0x40,shi);//时
write_com(0x80+0x40+2);
}
/*if(s1num==4)
{
zhou++;
if(zhou==8)
zhou=1;
write_zhou(zhou);
write_com(0x80+15);
}*/
if(s1num==4)
{
intx5,x6;
x5=ri%16;
x6=ri/16;
x5++;
if(x6>=3&&x5>=1)
{
x5=1;
x6=0;
}
if(x5==10)
{
x5=0;
x6++;
}
ri=x5+x6*16;
write_sfm(9,ri);//日
write_com(0x80+10);
}
if(s1num==5)
{
intx5,x6;
x5=yue%16;
x6=yue/16;
x5++;
if(x6>=1&&x5>=3)
{
x5=1;
x6=0;
}
if(x5==10)
{
x5=0;
x6++;
}
yue=x5+x6*16;
write_sfm(6,yue);//月
write_com(0x80+7);
}
if(s1num==6)
{
intx5,x6;
x5=nian%16;
x6=nian/16;
x5++;
if(x6>=2&&x5>=1)
{
x5=1;
x6=0;
}
if(x5==10)
{
x5=0;
x6++;
}
nian=x5+x6*16;
write_sfm(3,nian);//年
write_com(0x80+4);
}
}
}
/**********************时间调整模式**************************************/
if(s1num!
=0||s4num!
=0)//在调整模式下
{
if(s3==0)//如果确定键按下
{
delay(5);
if(s3==0)//延时并重新检测S3是否按下,用于差小误差
{
if(s1num!
=0)
{
while(!
s3);
didi();//在松手时将调整后的时间、日期及周信息写入DS1302,退出调整模式并隐藏光标,按键次数清0
write_1302(0x8e,0x00);
write_1302(0x80,miao);
write_1302(0x84,shi);
write_1302(0x82,fen);
write_1302(0x8a,zhou);
write_1302(0x8c,nian);//年
write_1302(0x88,yue);//月
write_1302(0x86,ri);
write_1302(0x8e,0x80);
flag1=0;
write_com(0x0c);
s1num=0;
}
if(s4num!
=0)
{
while(!
s3);
didi();//在松手时将调整后的时间、日期及周信息写入DS1302,退出调整模式并隐藏光标,按键次数清0
write_1302(0x8e,0x00);
write_1302(0xc0,lshi);
write_1302(0xfc,lfen);
write_1302(0x8e,0x80);
flag2=0;
s4num=0;
write_com(0x0c);
}
}
}
}
if(s4==0&&s1num==0)//按键4按下*次且s1再次之前未曾按过(闹钟位置已改好的)
{
delay(5);
if(s4==0&&s1num==0)
{
s4num++;
flag2=1;
while(!
s4);
didi();
if(s4num==1)
{
write_com(0x80+0x40+14);
write_com(0x0f);
}
if(s4num==2)
{
write_1302(0x8e,0x00);//可以写
write_1302(0xfc,lfen);//闹钟初始化
write_1302(0x8e,0x80);//开写保护
write_com(0x80+0x40+11);
}
if(s4num==3)
{
s4num=0;
flag2=0;
write_1302(0x8e,0x00);//可以写
write_1302(0xc0,lshi);//闹钟初始化
write_1302(0x8e,0x80);//开写保护
write_com(0x0c);//不显示光标
}
}
}
if(s4num!