点阵万年历(带时间、年月日星期调整及闹钟功能)C程序
if(f!=0)//如果标志位不为0,则执行以下内容-------调整日
{
xianriyue(yue,ri);
if(key1==0)//加日部分
{
delay(10);
if(key1==0)
{
xianriyue(yue,ri);
ri++;
if(ri==32)
ri=1;
write1302(0x8e,0x00);//去掉保护
write1302(0x86,((ri/10)<<4)|(ri%10));//日数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x87);
ri=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
while(!key1);
}
}
if(key2==0)//减日部分
{
delay(10);
if(key2==0)
{
xianriyue(yue,ri);
ri--;
if(ri==(1-1))
ri=31;
write1302(0x8e,0x00);//去掉保护
write1302(0x86,((ri/10)<<4)|(ri%10));//日数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x87);
ri=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
while(!key2);
}
}
}
if(g!=0)//如果标志位不为0,则执行以下内容-----星期调整部分
{
xi(xin);
if(key1==0)//星期加部分
{
delay(10);
if(key1==0)
{
xi(xin);
xin++;//将星期+1
if(xin==8)//如果星期到了8就清它清1
xin=1;//清1
write1302(0x8e,0x00);//去掉保护
write1302(0x8a,((xin/10)<<4)|(xin%10));//显示星期天
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x8b);//读星期
xin=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//将星期值还原
while(!key1);
}
}
if(key2==0)//星期减部分
{
delay(10);
if(key2==0)
{
xi(xin);
xin--;//减1
if(xin==(1-1))//如果到了(1-1)就给它7,因为星期只1---7
xin=7;//将它给7
write1302(0x8e,0x00);//去掉保护
write1302(0x8a,((xin/10)<<4)|(xin%10));//显示星期天
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x8b);
xin=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//读星期值
while(!key2);
}
}
}
if(h!=0)////如果标志位不为0,则执行以下内容------------以下是闹钟小时调整部分
{
xianniao(shin,fenn,2);//调整闹钟小时与分钟显示子程序
if(key1==0)//闹钟小时加处理
{
delay(10);
if(key1==0)
{
xianniao(shin,fenn,2);
shin++;//将星期+1
if(shin==24)//如果星期到了8就清它清1
shin=0;//清1
while(!key1);
}
}
if(key2==0)//闹钟小时减处理
{
delay(10);
if(key2==0)
{
xianniao(shin,fenn,2);
shin--;
if(shin==(0-1))
shin=23;
while(!key2);
}
}
}
if(i!=0)//如果标志位不为0,则执行以下内容----------闹钟分钟调整
{
xianniao(shin,fenn,2);
if(key1==0)//闹钟分钟加处理
{
delay(10);
if(key1==0)
{
xianniao(shin,fenn,2);
fenn++;//将星期+1
if(fenn==60)//如果星期到了8就清它清1
fenn=0;//清1
while(!key1);
}
}
if(key2==0)//闹钟分钟减处理
{
delay(10);
if(key2==0)
{
xianniao(shin,fenn,2);
fenn--;
if(fenn==(0-1))
fenn=59;
while(!key2);
}
}
}
}
/******************************************************/
/*******************响闹子程序*************************/
/******************************************************/
void xiangniao()
{
bit clock;//定义一个标志位
if(clockbiao==0)//闹钟总标志为0时才可以执行闹钟处理程序
{
if(clock==0)//如果标志位为0,就执行下面内容
{
if(shin==shi)//主时间小时与闹钟小时相等吗?
{
if(fenn==fen)//主时间分钟与闹钟分钟相等吗?
bbtsoud();//相等了就执行闹钟响一声子程序,即小时与分钟都相等了就执行闹铃
}
}
if(fenn!=fen)//如果分钟不等
clock=0;//将标志位清0,以便下次再响铃
if(key1==0)//判断加"+"按键有没有被按下,如果按下了,就让闹铃停止响
{
delay(10);
if(key1==0)
{
clock=1;//将标志位清0,让闹钟在响铃时立马停下来
while(!key1);
}
}
}
if(key2==0)//如果减按键按下了,则则关闭闹铃全部功能
{
delay(10);
if(key2==0)//如果加按键按下了,则全部复位
{
clockbiao=~clockbiao;
bbtsoud();//蜂鸣器响一声子程序
while(!key2);//按键释放
}
}
}本文引用地址:https://www.eepw.com.cn/article/201611/323389.htm
/******************************************************/
/******************************************************/
/**********主程序(包括主显示/闹钟/按键处理)************/
/******************************************************/
/******************************************************/
void main()
{
init1302();
TMOD=0X11;//寄存器工作方式
EA=1;//开总中断
TR0=1;//开定时器
ET0=1;//开定时器中断
TH0=(65536-20000)/256;//赋值给高位
TL0=(65536-20000)%256;//赋值给低位
TR1=1;//开定时器
ET1=1;//开定时器中断
TH1=(65536-50000)/256;//赋值给高位
TL1=(65536-50000)%256;//赋值给低位
while(1)
{
if(flag==0)//如果标志位为0,就让它执行主程序,不让它读按键处理部分,省资源
{
value();//调用DS1302时间转换子程序
xianzhu(nian,yue,ri,xin);//调用主显示
xiangniao();//调用响闹子程序
}
skey();//调用按键处理子程序
}
}
/******************************************************/
/*******************定时中断0子程序********************/
/******************************************************/
void zhong() interrupt 3
{
uchar ding;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ding++;
if(ding>=10)//模拟普通闹钟小数闪烁处理部分
{
ding=0;
dian=~dian;//0.5秒闪一次,它不参与具体计时,具体计时只是DS1302内部
}
}
/******************************************************/
/*******************定时中断1子程序********************/
/******************************************************/
void zhong1() interrupt 1//T1中断服务程序
{
uchar ding1,ding2;
TH0=(65536-10000)/256;//赋值给高位
TL0=(65536-10000)%256;//赋值给低位
ding1++;
ding2++;
if(ding2>=50)//进入调整模式时闪烁标志位处理
{
ding2=0;
flag1=~flag1;
}
switch(yin)//以下是主功能按键处理子程序
{
case 0:if(ding1>=250)//长按功能按键进入调整模式,否则怕误按-------------进入查看年月日功能
{
ding1=0;//将定时器清0
if(key==0)
{
delay(100);
if(key==0)
{
yin++;//将标志位加1
lk=8;//些句是调用"年月日星期"显示的关键一步,即打开下屏显示
shr=1;//将标志位置1
bbtsoud();//蜂鸣器响一声
while(!key);//按键释放
}
}
}
break;
case 1:if(key==0)//-----------------------------进入调整模式闪烁功能
{
delay(100);
if(key==0)
{
yin++;//以便进入一个功能
a=1;//标志位置1,以便进入按键功能
shr=0;//将上次标志位清0,以免与现在的键值产生冲突
lk=0;//将下半屏清掉
flag=1;//将主程序中的标志位置1
bbtsoud();//蜂鸣器响一声
TR1=0;//将定时器关掉
dian=0;//将主时间中的两位小数点标志位打开
write1302(0x8e,0x00);//去掉DS1302保护
write1302(0x80,0x80);//当它等于0X80时,让DS1302时间停下来,以便调整
write1302(0x8e,0x80);//让DS1302保护
while(!key);
}
}
break;
case 2: if(key==0)//-----------------------------进入主时间小时调整功能
{
delay(100);
if(key==0)
{
yin++;//以下便进行下一功能
b=1;//标志位置1
a=0;
bbtsoud();
while(!key);
}
}
break;
case 3: if(key==0)//---------------------------进入主时间分钟时调整功能
{
delay(100);
if(key==0)
{
yin++;
b=0;
c=1;
bbtsoud();
while(!key);
}
}
break;
case 4: if(key==0)//---------------------------------进入日期年调整功能
{
delay(100);
if(key==0)
{
yin++;
c=0;
d=1;
bbtsoud();
while(!key);
}
}
break;
case 5:if(key==0)//-----------------------------------进入日期月调整功能
{
delay(100);
if(key==0)
{
yin++;
d=0;
e=1;
bbtsoud();
while(!key);
}
}
break;
case 6: if(key==0)//-----------------------------------进入日期日调整功能
{
delay(100);
if(key==0)
{
yin++;
e=0;
f=1;
bbtsoud();
while(!key);
}
}
break;
case 7:if(key==0)//---------------------------------进入日期星期调整功能
{
delay(100);
if(key==0)
{
yin++;
f=0;
g=1;
bbtsoud();
while(!key);
}
}
break;
case 8: if(key==0)//------------------------------进入闹钟小时调整功能
{
delay(100);
if(key==0)
{
yin++;
g=0;
h=1;
bbtsoud();
while(!key);
}
}
break;
case 9:if(key==0)//------------------------------进入闹钟分钟调整功能
{
delay(100);
if(key==0)
{
yin++;
h=0;
i=1;
bbtsoud();
while(!key);
}
}
break;
case 10:if(key==0)//----------------------将系统全部复位,即回到主程序
{
delay(100);
if(key==0)
{
yin=0;//总计数器复位为0
i=0;//上次功能标志位清0
flag=0;//主程序标志位清0
TR1=1;//打开定时器
write1302(0x8e,0x00);//去掉DS1302保护
write1302(0x80,0x00);//当它等于0X00时,让时间就开始走 即0X00就让时间开始走,0X80让时停
write1302(0x8e,0x80);//让时间停下来
bbtsoud();
while(!key);
}
}
break;
}
}
评论