📄 time.c
字号:
#include"1602.h"
#include"sd2000.h"
#define uint unsigned int
#define uchar unsigned char
extern unsigned char date[7]; //日期数组
/*date[0]=year,date[1]=month,date[2]=day,date[3]=week,
date[4]=hour,date[5]=minute,date[6]=second*/
//定义时间变量
uchar time_ms,time_s,time_m,time_h,time_w,time_d,time_mo,time_y;
//毫秒时间、秒、分、时,周,日,月,年等时间变量
bit flag_s,flag_m,flag_h; //每秒、每分、每时的标志
uchar flag_sy[11]; //闹钟的声音种类
uchar flag_sw[11]; //闹钟允许标志 //10组闹钟,第10个用来贪睡功能
uchar alarm[11][2]; //闹钟数组
bit flag_alarm; //闹钟标志
bit flag_op;//进入操作界面标志
uchar num_op; //界面操作数,00为闹钟0,01为闹钟1,08为闹钟8,09为闹钟9,0a为正常时钟
uchar num_fsn;//组时分闹的操作数。00为组,01为时,02为分,03为闹多久,04为闹钟声音种类;
uchar key_temp; //按键临时变量
bit flag_flag_s;//秒钟闪动标志
uchar at;
void delay(uint time) //24M晶振 1ms
{
uint i,j;
for(i=0;i<time;i++)
{
j=215;
while(j--);
}
}
static void TransmitInterrupt (void)
{
TI=0;
}
static void ReceiveInterrupt (void)
{
RI=0;
}
//串口中断处理程序
void com_isr(void) interrupt 4 using 1
{
EA=0;
if (RI) ReceiveInterrupt ();
if (TI) TransmitInterrupt ();
EA=1;
}
//////////////////////////////////////////////////////////
//SD2000每分钟中断//
void SD2000_isr(void) interrupt 3 using 3
{
flag_m=1; //标志
}
//定时中断处理程序
void t0_isr(void) interrupt 1 using 2
{
TH0=0x3C; //
TL0=0xB8;
time_ms++;
if(time_ms==20) //0.5秒
{ time_ms=0;
time_s++;
flag_s=1;
}//end if(time_ms==20)
}
////////////////////////////////////////////////////////////////
main()
{
uchar ii;
TMOD=0x21; //T0为方式1的16位定器数,T1为方式2的波特率发生器
TH0=0x3C; //
TL0=0xB8; //24M晶振的25ms定时为0x3CB0 8为修正
TH1=0xCC; //
TL1=0xCC; //24M晶振的的1200B
SCON=0xd0; //串口方式3
IE=0x92; //开串口T0
TR0=1;
TR1=1;
time_ms=0;
time_s=0;
time_m=58;
time_h=23;
flag_s=0;
flag_m=0;
flag_h=0;
flag_alarm=0;
flag_op=0;
num_op=0;
num_fsn=0;
for(ii=0;ii<12;ii++)
{
alarm[ii][0]=0;
flag_sw[ii]=0;
flag_sy[ii]=0;
}
for(ii=0;ii<12;ii++)
{
alarm[ii][1]=0;
}
inst_lcd(); //初始化LCD
disp(0,0,time_h); //时钟显示
dispchar(2,0,0x3a); //冒号显示
disp(3,0,time_m); //分钟显示
//////////////////////////////////////////////////////////////////////////////
I2CWriteStatus(); //写SD2000状态寄存器
I2CWriteTime(); //写SD2000时间寄存器
I2CReadDate();//读入实时数据
disp_bcd(6,0,date[0]);//年显示
dispchar(8,0,0x2e); //间隔号“小点”显示
disp_bcd(9,0,date[1]);//月显示
dispchar(11,0,0x2e); //间隔号“小点”显示
disp_bcd(12,0,date[2]);//日显示
dispchar(14,0,0x2e); //间隔号“小点”显示
dispchar(15,0,0x30|date[3]); //星期显示
while(1)
{
if(flag_s) //秒钟闪动显示程序
{
flag_s=0;
if(flag_flag_s)
{
dispchar(2,0,0x3a);
flag_flag_s=0;
}
else
{
dispchar(2,0,0x20);
flag_flag_s=1;
}
if(flag_op) //进入操作界面后闪动操作的数组
{
switch(num_fsn)
{
case 0 :
{
dispchar(0,1,0x20);
delay(100);
}break;
case 1 :
{
dispchar(1,1,0x20);
dispchar(2,1,0x20);
delay(50);
} break;
case 2:
{
dispchar(4,1,0x20);
dispchar(5,1,0x20);
delay(50);
}break;
case 3:
{
dispchar(6,1,0x20);
delay(100);
} break;
case 4:
{
dispchar(7,1,0x20);
delay(100);
}
default:
break;
} //end switch(num_fsn)
} //end if(flag_op)
}//end if(flag_s)
if(flag_m) //每分钟软件定时中断处理*********************************************************
{
flag_m=0;
if(flag_alarm)//正在闹铃,是否关闹铃
{
if(flag_sw[at]==0) //闹一分钟的,关闹钟
{
flag_alarm=0;
}
} //end if(flag_alarm)
//实时时钟更正,判断年、月、日、星期、时、分是否应该更正//
I2CReadDate();//读入实时数据
if(time_y!= date[0])
{
time_y=date[0];
disp_bcd(6,0,time_y);//年
}
dispchar(8,0,0x2e);
if(time_mo!= date[1])
{
time_mo=date[1];
disp_bcd(9,0,time_mo);//月
}
dispchar(11,0,0x2e);
if(time_d!= date[2])
{
time_d=date[2];
disp_bcd(12,0,time_d);//日
}
dispchar(14,0,0x2e);
if(time_w!= date[3])
{
time_w=date[3];
dispchar(15,0,0x30|time_w);//星期
}
if(time_h!=date[4])
{
time_h=date[4];
disp_bcd(0,0,time_h);//时
}
time_m=date[5];
disp_bcd(3,0,time_m);//分
//实时时钟更正,判断年、月、日、星期、时、分是否应该更正//////////////////////////////////////////
for(at=0;at<11;at++) //闹钟检测
{
if (alarm[at][0]==time_h)//比较时钟
{
if (alarm[at][1]==time_m)//比较分钟
{
flag_alarm=1; //标志闹钟标志
break;
}
}
}//end for
}//end if(flag_m)
if(flag_op) //进入操作界面后的显示程序
{
dispchar(3,1,0x3a); //显示“:”
if(num_op==0x0a)
{
dispchar(0,1,0x54); //显示“T”表示正常时间 T的代码为54
disp(1,1,time_h); //显示时钟
disp(0,0,time_h); //更新时钟
disp(4,1,time_m); //显示分钟
disp(3,0,time_m); //更新分钟
dispchar(6,1,0x20); //闹钟长久位不显示
dispchar(7,1,0x20); //闹钟种类位不显示
}
else
{
dispchar(0,1,0x30|num_op); //显示闹钟号(0--9)的代码为30-39
disp(1,1,alarm[num_op][0]); //显示时钟
disp(0,0,time_h); //更新时钟
disp(4,1,alarm[num_op][1]); //显示分钟
disp(3,0,time_m); //更新分钟
if(flag_sw[num_op]) //永远闹
{
dispchar(6,1,0x4f);//显示“P”
}
else //只闹一分钟
{
dispchar(6,1,0x5f); //显示“-”
}
dispchar(7,1,0x30|flag_sy[num_op]); //显示闹钟声音种类号
}//end else
} //end if(flag_op)
if(flag_alarm) //闹钟提示操作
{
dispchar(10,1,0xf4); //打开闹铃提示显示“”
//闹铃响铃操作函数,根据flag_sy[at]来进行
}
else
{
dispchar(10,1,0x20); //关闭闹铃提示显示“0”
//闹铃闭铃操作函数,根据flag_sy[at]来进行
}
key_temp=P3;
key_temp&=0xf0; //取P3.4到P3.7四位
switch(key_temp)
{
case 0x70: //P3.7按下 //长按3秒进入操作界面
{
delay(50); //延时50ms
key_temp=P3&0xf0; //再次读取键值
if(key_temp==0x70)
{
delay(1000); //延时1s
key_temp=P3&0xf0; //再次读取键值
if(key_temp==0x70)
{
delay(2000); //延时2s
key_temp=P3&0xf0; //再次读取键值
if(key_temp==0x70) //延时3s后还是 --3秒长按即可进入操作界面
{
if(flag_op) //进入界面后
{
flag_op=0; //退出界面,清除显示
dispchar(0,1,0x20);
dispchar(1,1,0x20);
dispchar(2,1,0x20);
dispchar(3,1,0x20);
dispchar(4,1,0x20);
dispchar(5,1,0x20);
dispchar(6,1,0x20);
dispchar(7,1,0x20); //闹钟种类位不显示
}
else //末进入界面
{
flag_op=1; //标志进入界面操作
num_op=0x0a;
}
}//end if(key_temp==0x38)
}//end if(key_temp==0x38)
}//end if(key_temp==0x38)
}break; //end case 0x38:
///////////////////////////////////////////////////////////////////////////////
case 0xb0: //P3.6按下 上翻
{
if(flag_op)//进入操作界面后的操作
{
delay(50); //延时50ms
key_temp=P3&0xf0; //再次读取键值
if(key_temp==0xb0)
{
switch(num_fsn)//num_fsn;组时分闹的操作数。00为组,01为时,02为分,03为闹;
{
case 0: //操作数加
{
num_op++;
if(num_op==0x0b)
{
num_op=0;
}
}break; //end case 0:
case 1: //小时加
{
if(num_op==0x0a)//时钟小时加
{
time_h++;
if(time_h==24)
{
time_h=0;
}
}
else //0-9组闹钟小时加
{
alarm[num_op][0]++;
if(alarm[num_op][0]==24)
{
alarm[num_op][0]=0;
}
}
}break; //end case 1:
case 2: //分加
{
if(num_op==0x0a)//时钟小时加
{
time_m++;
if(time_m==60)
{
time_m=0;
}
}
else //0-9组闹钟小时加
{
alarm[num_op][1]++;
if(alarm[num_op][1]==60)
{
alarm[num_op][1]=0;
}
}
}break; //end case 2:
case 3: //闹钟长久选择
{
if(flag_sw[num_op])
{
flag_sw[num_op]=0;
}
else
{
flag_sw[num_op]=1;
}
}break; //end case 3:
case 4: //闹钟声音种类选择
{
flag_sy[num_op]++;
if(flag_sy[num_op]==10)
{
flag_sy[num_op]=0;
}
}break;//end case 4:
default:
break;
}//end switch(num_fsn)
}//end if(key_temp==0x34)
} //end if(flag_op)
else
{
if(flag_alarm)
{
flag_alarm=0;
dispchar(10,1,0x20); //关去闹铃提示,显示“ ”
}
}//end else
}break; //end case 0x34:
///////////////////////////////////////////////////////////////////////////////////////////////
case 0xd0: //P3.5按下 下翻
{
if(flag_op)//进入操作界面后的操作
{
delay(50); //延时50ms
key_temp=P3&0xf0; //再次读取键值
if(key_temp==0xd0)
{
switch(num_fsn)//num_fsn;组时分闹的操作数。00为组,01为时,02为分,03为闹;
{
case 0: //操作数减
{
num_op--;
if(num_op==255)
{
num_op=0x0a;
}
}break;//end case 0:
case 1: //小时减
{
if(num_op==0x0a)//时钟小时减
{
time_h--;
if(time_h==0)
{
time_h=23;
}
}
else //0-9组闹钟小时减
{
alarm[num_op][0]--;
if(alarm[num_op][0]==255)
{
alarm[num_op][0]=23;
}
}
}break; //end case 1:
case 2: //分减
{
if(num_op==0x0a)//时钟小时减
{
time_m--;
if(time_m==255)
{
time_m=59;
}
}
else //0-9组闹钟小时减
{
alarm[num_op][1]--;
if(alarm[num_op][1]==255)
{
alarm[num_op][1]=59;
}
}
}break; //end case 2:
case 3: //闹钟长久选择
{
if(flag_sw[num_op]) //交互设置
{
flag_sw[num_op]=0;
}
else
{
flag_sw[num_op]=1;
}
}break; //end case 3:
case 4: //闹钟声音种类选择
{
flag_sy[num_op]--;
if(flag_sy[num_op]==255)
{
flag_sy[num_op]=9;
}
}break;//end case 4:
default:
break;
}//end switch(num_fsn)
} //end if(key_temp==0x2C)
}//end if(flag_op)
else //末进入操作界面的操作-关闹钟
{
if(flag_alarm)
{
flag_alarm=0;
dispchar(10,1,0x20); //关去闹铃提示显示“ ”
}
}//end else
}break; //end 0x2C:
/////////////////////////////////////////////////////////////////////////////
case 0xe0: //P3.4按下 换组
{
if(flag_op) //进入操作界面后的操作-换组
{
delay(20); //延时20ms
key_temp=P3&0xf0; //再次读取键值
if(key_temp==0xe0)
{
num_fsn++;
if(num_fsn==5) //num_fsn;组时分闹的操作数。00为组,01为时,02为分,03为闹铃长久,04为闹钟声音种类;
{
num_fsn=0;
}
}
}//end if(flag_op)
else //末进入操作界面的操作-关闹钟,起动贪睡功能
{
if(flag_alarm) //在有闹钟出现的情况下
{
flag_alarm=0;
dispchar(10,1,0x20); //关去闹铃提示显示“ ”
if((alarm[at][1]+5)>60) //给贪睡闹钟置值
{
alarm[10][0]=alarm[at][0];
alarm[10][1]=(alarm[at][1]+5)-60;
}
else
{
alarm[10][0]=alarm[at][0];
alarm[10][1]=alarm[at][1]+5;
}
flag_sy[10]=flag_sy[at]; //声音种类置值
} //end if(flag_alarm)
}//end else
}break; //end case 0x1C:
default:
break;
} //end switch(key_temp)
}//end while(1)
} //end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -