微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 点阵万年历(带时间、年月日星期调整及闹钟功能)C程序

点阵万年历(带时间、年月日星期调整及闹钟功能)C程序

时间:11-29 来源:互联网 点击:

/******************************************************/
/******************************************************/
/**********主程序(包括主显示/闹钟/按键处理)************/
/******************************************************/
/******************************************************/
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;
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top