main.c
来自「51写的一个定时时钟」· C语言 代码 · 共 468 行
C
468 行
#include<reg52.h>
#include<LCD12864.H>
/****定义按键接口**************/
sbit Mode=P2^6;
sbit Add=P2^7;
sbit Dec=P1^5;
sbit Ent=P1^6;
sbit led1=P1^1;
sbit led2=P1^0;
sbit led3=P1^4;
sbit SPK=P1^3;
unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5}; //星期月参变数
unsigned char cnt,counter,counter1;
unsigned char id,id1,word;
void Add_key1();
void Set_time(unsigned char sel,bit sel_1);
void Add_key2();
void Set_bell(unsigned char sel,bit sel_1);
bit leap_year();
unsigned char week_proc();
extern void Write_24c04( unsigned char add,unsigned char dat);
extern unsigned char Read_24C04(unsigned char add);
/*******************按键加一减一程序*******************/
void Add_key1()
{
if(Add==0)
{
Delay12864(20);
if(Add==0)
{
Set_time(id,0);
while(Add==0);
}
}
if(Dec==0)
{
Delay12864(20);
if(Dec==0)
{
Set_time(id,1);
while(Dec==0);
}
}
}
/***************设定时间**********/
void Set_time(unsigned char sel, bit sel_1) //根据选择调整相应项目并写入DS1302
{
if(sel==1){
if(sel_1==0){year++;if(year>99)year=0;}
else { year--;if(year==0)year=99;}}
if(sel==2){
if(sel_1==0){month++; if(month>12)month=1;}
else {month--;if(month==0)month=12;}}
if(sel==3){
if(sel_1==0){date++;if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
if (date>31) date=1; //大月31天
if (month==4||month==6||month==9||month==11)
if (date>30) date=1; //小月30天
if (month==2)
{if(leap_year()) //闰年的条件
{if (date>29) date=1;} //闰年2月为29天
else
{if (date>28) date=1;}}
} //平年2月为28天
else {date--;if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
if (date==0) date=31; //大月31天
if (month==4||month==6||month==9||month==11)
if (date==1) date=30; //小月30天
if (month==2)
{if(leap_year()) //闰年的条件
{if (date==0) date=29;} //闰年2月为29天
else
{if (date==0) date=28;}} //平年2月为28天
}
}
if(sel==4){
if(sel_1==0){week++;if(week>7)week=1;}
else{week--;if(week==0)week=7;}}
if(sel==5){
if(sel_1==0){hour++;if(hour>23)hour=0;}
else{hour--;if(hour==0)hour=23;}}
if(sel==6){
if(sel_1==0){min++;if(min>59)min=0;}
else{min--;if(min==0)min=59;}}
if(sel==7){
if(sel_1==0){sec++;if(hour>59)sec=0;}
else{sec--;if(sec==0)sec=59;}}
// write_clock(0x8e,0x00);//允许写操作
// write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
// write_clock(0x8e,0x80);//写保护,禁止写操作
}
/**************设定脑铃*******************/
/*******************按键加一减一程序*******************/
void Add_key2()
{
if(Add==0)
{
Delay12864(20);
if(Add==0)
{
Set_bell(id1,0);
while(Add==0);
}
}
if(Dec==0)
{
Delay12864(20);
if(Dec==0)
{
Set_bell(id1,1);
while(Dec==0);
}
}
}
/***************设定时间**********/
void Set_Bell(unsigned char sel, bit sel_1)//根据选择调整相应项目并写入24
{
signed char address,item;
signed char max,mini;
if(sel==7) {address=0x0e; max=59;mini=0;} //秒
if(sel==6) {address=0x0d; max=59;mini=0;} //分
if(sel==5) {address=0x0c; max=23; mini=0;} //时
if(sel==4) {address=0x0b; max=59;mini=0;} //秒
if(sel==3) {address=0x0a; max=59;mini=0;} //分
if(sel==2) {address=0x09; max=23; mini=0;} //时
if(sel==1)
{
// address=0x08;
if(Add ==0 || Dec ==0)
Bell_Swh=~Bell_Swh;
Write_24c04(0x08,Bell_Swh);
} //开关
item = Read_24C04(address);
if(sel_1==0)
item++;
else
item--;
if(item>max) item=mini;
if(item<mini) item=max;
Write_24c04(address,item);//写入24
}
//闰年的计算
bit leap_year()
{
bit leap;
if((year%4==0&&year%100!=0)||year%400==0)//闰年的条件
leap=1;
else
leap=0;
return leap;
}
//星期的自动运算和处理
unsigned char week_proc()
{ unsigned char num_leap;
unsigned char c;
num_leap=year/4-year/100+year/400;//自00年起到year所经历的闰年数
if( leap_year()&& month<=2 ) //既是闰年且是1月和2月
c=5;
else
c=6;
week=(year+para_month[month]+date+num_leap+c)%7;//计算对应的星期
return week;
}
/******************做日期运算*****************/
//时间和日期处理程序
void pro_timedate()
{
sec++;
if(sec > 59)
{sec = 0;
min++;
if(min>59)
{min=0;
hour++;
if(hour>23)
{hour=0;
date++;
if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
if (date>31) {date=1;month++;} //大月31天
if (month==4||month==6||month==9||month==11)
if (date>30) {date=1;month++;} //小月30天
if (month==2)
{if( leap_year()) //闰年的条件
{if (date>29) {date=1;month++;}} //闰年2月为29天
else
{if (date>28) {date=1;month++;}} //平年2月为28天
}
if (month>12) {month=1;year++;}
if (year>99) year=0;
}
}
}
week_proc();
Write_24c04( 0x01,0);
Write_24c04( 0x02,year);
Write_24c04( 0x03,month);
Write_24c04( 0x04,date);
Write_24c04( 0x05,hour);
Write_24c04( 0x06,min);
Write_24c04( 0x07,sec);
//闹钟启用时,报警时间到,启动Timer1
}
/********定时器0。做时钟用*****************/
void timer0() interrupt 1 using 0
{
TH0=0x3c;
TL0=0xb2;
cnt++;
// if((word==1)&&(Bell_Swh == 1))
// {
// TR1=0;
// }
if(cnt==20)
{
led1^=1;
cnt=0;
pro_timedate();
}
}
/********定时器0。做时钟用*****************/
void timer1() interrupt 3 using 0
{
TH1=0x3c;
TL1=0xb0;
counter1++;
counter++;
// if(Bell_Swh == 1)counter1++;//闹钟为?
if(counter==10)
{
counter=0;
flag=~flag;
}
// if(counter==20)
// {
// counter=0;
// SPK=~SPK;
}
/*****初始化定时器***********/
void Init_Timer()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb1;
TH1 =0x3c;
TL1 =0xb0;
TR0=1;
TR1=1;
ET0=1;
ET1=1;
// EA=1;
}
void main()
{
unsigned char p;
unsigned char H_time,M_time,H_24C04,M_24C04,a;
unsigned char H_time1,M_time1,H_24C02,M_24C02;
//week=6;
p=Read_24C04(0x01);
year=Read_24C04(0x02);
month=Read_24C04(0x03);
date=Read_24C04(0x04);
hour=Read_24C04(0x05);
min=Read_24C04(0x06);
sec=Read_24C04(0x07);
Bell_Swh = Read_24C04(0x08);//读取开关的状态
Init_Timer();
Init_lcd();
Clr_Scr();
Disp_Img(logo);
Delay12864(60000);
Delay12864(20000);
Lcd_Mark();
Delay12864(60000);
Lcd_Mark1();
EA=1;
while(1)
{
led2=p;
if(Dec==0&&Ent==0)
{
Delay12864(20);
if(Dec==0&&Ent==0)
{
Lcd_Mark2();
if(Bell_Swh == 0){Mcs=0;Scs=1;Disp_Chinese(2,32,guan);}//关
else {Mcs=0;Scs=1;Disp_Chinese(2,32,kai);}
while(1)
{
if(Mode==0)
{
Delay12864(20);
if(Mode==0)
{
id1++;
if(id1>8)id1=0;
while(Mode==0);
}
}
switch(id1)
{
case 0:Disp2();break;//正常显示
case 1:Kgb = 1;Add_key2();Disp2();break;//开关
case 2:Kgb= 0;Hour2=1;Add_key2();Disp2();break;//
case 3:Hour2=0;Min2=1;Add_key2();Disp2();break;
case 4:Min2=0;Sec2=1;Add_key2();Disp2();break;
case 5:Sec2=0;Hour3=1;Add_key2();Disp2();break;//
case 6:Hour3=0;Min3=1;Add_key2();Disp2();break;
case 7:Min3=0;Sec3=1;Add_key2();Disp2();break;
case 8:Sec3=0;id1 = 0;Lcd_Mark1();goto FF;break;//返回主界面
default:break;
}
}
if(Ent==0)
{
Delay12864(20);
if(Ent==0)
{
Lcd_Mark1();
while(Ent==0);
}
}
}
}
FF:
if(flag == 0)
{
Mcs=0;Scs=1;
Disp_Digit(3,8,maohao);// :闪烁
Disp_Digit(3,32,maohao);
}
else
{
Mcs=0;Scs=1;
Disp_Digit(3,8,space);//显示空格
Disp_Digit(3,32,space);
}
if (Mode == 0) // 设置和选择项目键
{
Delay12864(20);
if(Mode == 0)
{
id++;if(id>7)id=0;
}
while(Mode == 0);//等待键松开
}
switch( id )
{
case 0:ET0=1;sec1 = 0; Disp( );break;//正常显示
case 1:ET0=0;year1 = 1;Add_key1();Disp();break;//年
case 2:year1=0;month1=1;Add_key1();Disp();break;//月
case 3:month1=0;day1=1;Add_key1();Disp();break; //日
case 4:day1=0;week1=1;Add_key1();Disp();break;//星期
case 5:week1=0;hour1=1;Add_key1();Disp();break; //小时
case 6:hour1=0;min1=1;Add_key1();Disp();break; //分钟
case 7:min1=0;sec1=1;Add_key1();Disp();break; //秒
default:break;
}
if(Bell_Swh == 1)//闹钟为开
{
H_24C04=Read_24C04(0x09);//读取2408的
M_24C04=Read_24C04(0x0a);
H_24C02=Read_24C04(0x0c);//读取2408的
M_24C02=Read_24C04(0x0d);
H_time=hour;
M_time=min;
H_time1=hour;
M_time1=min;
if(H_24C04 == H_time)
{
if(M_24C04 == M_time)
{
Clr_Scr();//清屏
frame();//显示边框
Mcs=1;Scs=0;
Disp_Chinese(3,16,nao);//闹钟显示时间到!
Disp_Chinese(3,32,zhong);
Disp_Chinese(3,48,shit);
Mcs=0;Scs=1;
Disp_Chinese(3,0,jian);
Disp_Chinese(3,16,dao);
Disp_Digit(3,40,fh);
while(M_24C04 == M_time)//判断是否到闹钟设定时间
{
for(a=0; a<100; a++)//BELL脉冲输出,驱动蜂鸣器
{
if(a<50){SPK = 0;Delay(100);}
else {SPK = 1;Delay(100);}
}
M_time=min;
}
Lcd_Mark1();
}//if
}
}//if
if(Bell_Swh == 1)//闹钟为开
{
// H_24C04=Read_24C04(0x09);//读取2408的
// M_24C04=Read_24C04(0x0a);
H_24C02=Read_24C04(0x0c);//读取2408的
M_24C02=Read_24C04(0x0d);
H_time=hour;
M_time=min;
H_time1=hour;
M_time1=min;
if(H_24C02 == H_time1)
{
if(M_24C02 == M_time1)
{
Clr_Scr();//清屏
frame();//显示边框
Mcs=1;Scs=0;
Disp_Chinese(3,16,nao);//闹钟显示时间到!
Disp_Chinese(3,32,zhong);
Disp_Chinese(3,48,shit);
Mcs=0;Scs=1;
Disp_Chinese(3,0,jian);
Disp_Chinese(3,16,dao);
Disp_Digit(3,40,fh);
while(M_24C02 == M_time1)//判断是否到闹钟设定时间
{
for(a=0; a<100; a++)//BELL脉冲输出,驱动蜂鸣器
{
if(a<50){SPK = 0;Delay(100);}
else {SPK = 1;Delay(100);}
}
M_time1=min;
}
Lcd_Mark1();
}//if
}
}//if
}//while
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?