📄 main.c
字号:
case 3://日期设置的日
RealClock.Day--;//日变量减1
if(0==RealClock.Day)RealClock.Day=1;//到0归1
//将其转换成16进制,以方便写入Ds1302的日寄存器单元
i=((RealClock.Day/10)<<4)|(RealClock.Day%10);
Write_Ds1302_RTC(0x8e,0x00);//Ds1302的允许写打开
Write_Ds1302_RTC(0x86,i);//写入Ds1302的天寄存器单元
Write_Ds1302_RTC(0x8e,0x80);//Ds1302的禁止写禁止
break;
case 4://日期设置的星期
RealClock.Week--;//星期减1
if(0==RealClock.Week)RealClock.Week=1;//到0归1
//将其转换成16进制,以方便写入Ds1302的星期寄存器单元
i=RealClock.Week%10;
Write_Ds1302_RTC(0x8e,0x00);//Ds1302的允许写打开
Write_Ds1302_RTC(0x8a,i);//写入Ds1302的星期寄存器单元
Write_Ds1302_RTC(0x8e,0x80);//Ds1302的禁止写禁止
break;
}
}
//在设置状态下将所调节的内容装入显示缓冲区
if(((DateKeyID>0)||(TimeKeyID>0))&&(0==AlarmKeyID))
{
//将调整的结果送到LED显示缓冲区
LEDBuffer[0]=RealClock.second%10; //秒的个位
LEDBuffer[1]=RealClock.second/10; //秒的十位
LEDBuffer[2]=RealClock.Minute%10; //分的个位
LEDBuffer[3]=RealClock.Minute/10; //分的十位
LEDBuffer[4]=RealClock.Hour%10; //时的个位
LEDBuffer[5]=RealClock.Hour/10; //时的十位
LEDBuffer[6]=RealClock.Week; //星期
LEDBuffer[7]=RealClock.Day%10; //日的个位
LEDBuffer[8]=RealClock.Day/10; //日的十位
LEDBuffer[9]=RealClock.Month%10; //月的个位
LEDBuffer[10]=RealClock.Month/10; //月的十位
LEDBuffer[11]=RealClock.Year%10; //年的个位
LEDBuffer[12]=RealClock.Year/10; //年的十位
}
}
while(0==NUMBERsUBKEY);//等待数字减调节释放
}
//-------------------------------------------------------
//-------------------------------------------------------
//---温度数据采集和滤波完毕,将结果送到显示缓冲区
if(TRUE==TemperatureDisplayFlag)
{
TemperatureDisplayFlag=FALsE;
temp=RealClock.Temp;
temp*=500;
temp/=256;
temp-=273;//将A/D转换的数据根据AD590计算公式转换成温度值
LEDBuffer[15]=16;//数码管灭
if(0x80000000==(temp & 0x80000000))//测量温度为负
{
temp=~temp;//取反
temp++;//加1
}
LEDBuffer[15]=17;//数码管显示负号
LEDBuffer[14]=temp/10;//将温度值存储到缓冲区
LEDBuffer[13]=temp%10;
}
//-------------------------------------------------------
//-------------------------------------------------------
//---定时半秒时间到,读取Ds1302日历和闪烁现象产生
if(TRUE==second_Halfs.Enable)
{
second_Halfs.Enable=FALsE;
if((0==DateKeyID)&&(0==TimeKeyID)&&(0==AlarmKeyID))
{
i=Read_Ds1302_RTC(0x81);//读取Ds1302的秒
RealClock.second=(i/16)*10+(i%16);
i=Read_Ds1302_RTC(0x83);//读取Ds1302的分
RealClock.Minute=(i/16)*10+(i%16);
i=Read_Ds1302_RTC(0x85);//读取Ds1302的时
RealClock.Hour=(i/16)*10+(i%16);
i=Read_Ds1302_RTC(0x87);//读Ds1302的日
RealClock.Day=(i/16)*10+(i%16);
i=Read_Ds1302_RTC(0x89);//读Ds1302的月
RealClock.Month=(i/16)*10+(i%16);
i=Read_Ds1302_RTC(0x8b);//读Ds1302的星期
RealClock.Week=i%16;
i=Read_Ds1302_RTC(0x8d);//读Ds1302的年
RealClock.Year=(i/16)*10+(i%16);
}
//---------------------------------------------------
if(AlarmKeyID>0)
{
switch(AlarmKeyID)
{
case 1:
if(0==AlarmClock.status)
{
LEDBuffer[12]=10;//"A"
LEDBuffer[11]=18;//"L"
LEDBuffer[10]=19;//"r"
LEDBuffer[9] =20;//"O"
LEDBuffer[8] =15;//"F"
LEDBuffer[7] =15;//"F"
}
else
{
LEDBuffer[12]=10;//"A"
LEDBuffer[11]=18;//"L"
LEDBuffer[10]=19;//"r"
LEDBuffer[9] =16;//" "
LEDBuffer[8] =20;//"O"
LEDBuffer[7] =21;//"N"
}
break;
case 2:
if((16==LEDBuffer[4])&&(16==LEDBuffer[5]))//灭状态
{
LEDBuffer[4]=AlarmClock.Hour%10;//装入闹铃时钟内容
LEDBuffer[5]=AlarmClock.Hour/10;
}
else
{
LEDBuffer[4]=16;//装入LED灭的内容
LEDBuffer[5]=16;
}
break;
case 3:
if((16==LEDBuffer[2])&&(16==LEDBuffer[3]))//灭状态
{
LEDBuffer[2]=AlarmClock.Minute%10;//装入闹铃分钟内容
LEDBuffer[3]=AlarmClock.Minute/10;
}
else
{
LEDBuffer[2]=16;//装入LED灭的内容
LEDBuffer[3]=16;
}
break;
case 4:
if((16==LEDBuffer[0])&&(16==LEDBuffer[1]))//灭状态
{
LEDBuffer[0]=AlarmClock.Day%10;//装入闹铃秒钟内容
LEDBuffer[1]=AlarmClock.Day/10;
}
else
{
LEDBuffer[0]=16;//装入LED灭的内容
LEDBuffer[1]=16;
}
break;
}
}
//---------------------------------------------------
//---------------------------------------------------
//---校准日期和星期时,以闪烁现象提示
if(DateKeyID>0)
{
switch(DateKeyID)
{
case 1:
if((16==LEDBuffer[11])&&(16==LEDBuffer[12]))//灭状态
{
LEDBuffer[11]=RealClock.Year%10;//装入年份内容
LEDBuffer[12]=RealClock.Year/10;
}
else
{
LEDBuffer[11]=16;//装入LED灭的内容
LEDBuffer[12]=16;
}
break;
case 2:
if((16==LEDBuffer[9])&&(16==LEDBuffer[10]))//灭状态
{
LEDBuffer[9]=RealClock.Month%10;//装入月份内容
LEDBuffer[10]=RealClock.Month/10;
}
else
{
LEDBuffer[9]=16;//装入LED灭的内容
LEDBuffer[10]=16;
}
break;
case 3:
if((16==LEDBuffer[7])&&(16==LEDBuffer[8]))//灭状态
{
LEDBuffer[7]=RealClock.Day%10;//装入年份内容
LEDBuffer[8]=RealClock.Day/10;
}
else
{
LEDBuffer[7]=16;//装入LED灭的内容
LEDBuffer[8]=16;
}
break;
case 4:
if(16==LEDBuffer[6])LEDBuffer[6]=RealClock.Week;
else LEDBuffer[6]=16;
break;
}
}
//---------------------------------------------------
//---------------------------------------------------
//---校准时间时,以闪烁现象提示
if(TimeKeyID>0)
{
switch(TimeKeyID)
{
case 1:
if((16==LEDBuffer[4])&&(16==LEDBuffer[5]))//灭状态
{
LEDBuffer[4]=RealClock.Hour%10;//装入时钟内容
LEDBuffer[5]=RealClock.Hour/10;
}
else
{
LEDBuffer[4]=16;//装入LED灭的内容
LEDBuffer[5]=16;
}
break;
case 2:
if((16==LEDBuffer[2])&&(16==LEDBuffer[3]))//灭状态
{
LEDBuffer[2]=RealClock.Minute%10;//装入分钟内容
LEDBuffer[3]=RealClock.Minute/10;
}
else
{
LEDBuffer[2]=16;//装入LED灭的内容
LEDBuffer[3]=16;
}
break;
case 3:
if((16==LEDBuffer[0])&&(16==LEDBuffer[1]))//灭状态
{
LEDBuffer[0]=RealClock.Day%10;//装入秒钟内容
LEDBuffer[1]=RealClock.Day/10;
}
else
{
LEDBuffer[0]=16;//装入LED灭的内容
LEDBuffer[1]=16;
}
break;
}
}
//---------------------------------------------------
//---------------------------------------------------
//---将闪烁现象送到LED数码管显示
if((DateKeyID>0)||(TimeKeyID>0)||(AlarmKeyID>0))
sendDataToLED(LEDBuffer,sizeof(LEDBuffer));
//---------------------------------------------------
}
//-------------------------------------------------------
//---定时1s时间到,送出显示
if(TRUE==second_1s.Enable)
{
second_1s.Enable=FALsE;
if((0==DateKeyID)&&(0==TimeKeyID)&&(0==AlarmKeyID))
sendDataToLED(LEDBuffer,sizeof(LEDBuffer));
}
//-------------------------------------------------------
}
}
//-------------------------------------------------------------
//---低优先中断服务程序
#pragma interruptlow TMR0_TMR1_IsR
void TMR0_TMR1_IsR(void)
{
unsigned char i,j,temp;
if(TRUE==INTCONbits.TMR0IF)//定时100ms溢出
{
INTCONbits.TMR0IF=FALsE;//清TMR0溢出中断标志
TMR0L=256-25;//装入新的初值
second_Halfs.Interval++;
if(5==second_Halfs.Interval)//每0.5秒读Ds1302和闪烁
{
second_Halfs.Interval=0;
second_Halfs.Enable=TRUE;
}
second_1s.Interval++;
if(10==second_1s.Interval)
{
second_1s.Interval=0;
second_1s.Enable=TRUE;
}
if(0==ADCON0bits.DONE)//判断A/D转换是否完毕
{
ADCBuffer[ADCBufferPointer]=ADRESH;//装入当前缓冲区
ADCON0bits.GO=1;//重新启动A/D开始转换
ADCBufferPointer++;//指针加1
if(ADCBufferPointer==sizeof(ADCBuffer))//缓冲区装满否
{
ADCBufferPointer=0;//指针初始化
//将缓冲区的内容按从大到小排序
for(i=0;i<sizeof(ADCBuffer);i++)
for(j=i;j<sizeof(ADCBuffer);j++)
{
if(ADCBuffer[i]<ADCBuffer[j])
{
temp=ADCBuffer[i];
ADCBuffer[i]=ADCBuffer[j];
ADCBuffer[j]=temp;
}
}
//取缓冲区中间的数值作为当前测量到的温度值数据
RealClock.Temp=ADCBuffer[sizeof(ADCBuffer)/2];
TemperatureDisplayFlag=TRUE;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -