/*---------------------------------------------------------------------------
电子时钟程序
单 片 机:STC89C58RC
晶 振:12MHz
时钟芯片:DS1302
液 晶 屏:LCM-12864-ST7920
功能描述: 大数字显示时间;能显示农历、设置闹铃;
说 明:LCM12864使用并口连接方式,PSB、RST接高电平
------------------------------------------------------------------------------*/
/*-------------------------------头文件---------------------------------------*/
#include <reg52.h>
#include <intrins.h>
#include "LCD12864.h"
#include "DS1302.h"
#include "nongli.h"
#include "displaytime.h"
#include "zk.h"
#include "bell.h"
#include "HW.H"
#include "delay.h"
#include "DS18B20.h"
#define uint unsigned int
#define uchar unsigned char
/*--------------------定义按键-----------------------------------------------*/
sbit K1 = P2^3; //K1-设置
sbit K2 = P2^4; //K2-确认、返回
sbit K3 = P2^5; //K3-加
sbit K4 = P2^6; //K4-减
sbit K5 = P2^7; //K5-控制闹钟的打开与关闭,在"hw.h"中定义
sbit K6 = P2^2; //背光控制
sbit LED = P2^0; //背光灯
/*---------------------函数声明------------------------------*/
void ds_w(void);
void Conver_week(bit c,uchar year,uchar month,uchar day);
/*-----------------------------定义全局变量------------------------------*/
bit w=0; //调时标志位
unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定义时间映射全局变量(专用寄存器)
signed char address,item,item0,max,mini;
unsigned char clk_ala[2]={0x05,0x2f};//闹钟数据存放初,始值为05:27
unsigned char zwc=0,fwc=0,CKTIME_1=0,timp,timp0,timp1,timp2,hhh,mmm,sss;//用于校时
unsigned char hour=0,minute=0,time=0;//用于闹铃的设置
unsigned char gCount;
/*-----------------------------调整界面设置函数-----------------------------*/
void tiaozheng(void){
yy = read_clock(0x8d);//调用1302时钟数据中的年数据,从地址0x8d中
mo = read_clock(0x89);//调用1302时钟数据中的月数据,从地址0x89中
dd = read_clock(0x87);//从1302芯片中读取日数据,从地址0x87中
week = read_clock(0x8b);//从1302芯片中读取星期数据,从地址0x8b中
//----------------------------------
lcm_w_test(0,0x80);
lcm_w_word("20");
lcm_w_test(1,(yy/16)+0x30);
lcm_w_test(1,yy%16+0x30);
lcm_w_word("-");
//----------------------------------
lcm_w_test(1,(mo/16)+0x30);
lcm_w_test(1,mo%16+0x30);
lcm_w_word("-");
//----------------------------------
lcm_w_test(1,(dd/16)+0x30);
lcm_w_test(1,dd%16+0x30);
//----------------------------------
if(read_clock(0x85) != hh){hh = read_clock(0x85);}
lcm_w_test(0,0x88);
lcm_w_test(1,(hh/16)+0x30);
lcm_w_test(1,hh%16+0x30);
lcm_w_word(":");
//----------------------------------
if(read_clock(0x83) != mm){mm = read_clock(0x83);}
lcm_w_test(1,(mm/16)+0x30);//向液晶写数据,显示分钟的十位数
lcm_w_test(1,mm%16+0x30);//向液晶写数据,显示分钟的个位数
lcm_w_word(":");
//----------------------------------
if(read_clock(0x81) != ss){ss = read_clock(0x81);}
lcm_w_test(1,(ss/16)+0x30);
lcm_w_test(1,ss%16+0x30);
//=========显示设置闹钟的时间===================
if(read_clock(0xc7) != hour){hour = read_clock(0xc7);}
if(read_clock(0xc9) != minute){minute = read_clock(0xc9);}
lcm_w_test(0,0x8d);
lcm_w_test(1,(hour/16)+0x30);//显示闹钟小时十位
lcm_w_test(1,(hour%16)+0x30);//显示闹钟小时个位
lcm_w_word(":");
lcm_w_test(1,(minute/16)+0x30);//显示闹钟分钟的十位
lcm_w_test(1,(minute%16)+0x30);//显示闹钟分钟的个位
//=========显示设置时间校正===================
if(read_clock(0xc5) != zwc){zwc = read_clock(0xc5);} //加减标志
if(read_clock(0xc3) != fwc){fwc = read_clock(0xc3);} //调整多少秒
lcm_w_test(0,0x90);
lcm_w_word("每天零点时");
lcm_w_test(0,0x95);
if(zwc==0){lcm_w_word("加");}
if(zwc==1){lcm_w_word("减");}
lcm_w_test(0,0x96);
lcm_w_test(1,(fwc/16)+0x30);
lcm_w_test(1,(fwc%16)+0x30);
lcm_w_test(0,0x97);
lcm_w_word("秒");
}
void displayNaozh() //闹钟显示
{
if(read_clock(0xc7) != hour){
hour = read_clock(0xc7);
}
if(read_clock(0xc9) != minute){
minute = read_clock(0xc9);
}
lcm_w_test(0,0x85);
lcm_w_test(1,(hour/16)+0x30);//显示小时十位
lcm_w_test(1,(hour%16)+0x30);//显示小时个位
lcm_w_word(":");
lcm_w_test(1,(minute/16)+0x30);//显示分钟的十位
lcm_w_test(1,(minute%16)+0x30);//显示分钟的个位
lcm_w_word(" ");
}
void ds_w(void) //被调数据加一或减一,并检查数据范围,写入1302指定地址保存
{
item0=time;
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;//时间的调整
if(K3 == 0||key_add==1){//如果按动上调键
item++;//数加 1
}
if(K4 == 0||key_minish==1){//如果按动下调键
item--;//数减 1
}
if(item>max) item=mini;//查看数值是否在有效范围之内
if(item<mini) item=max;//如果数值小于最小值,则自动等于最大值
write_clock(0x8e,0x00);//允许写1302芯片操作
write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
write_clock(0x8e,0x80);//写保护,禁止写操作
time=item0;//调整后的时间重新赋值给time(Tt为Hh或Mm),这步很重要,没有将无法更新闹钟数据
}
/**********************************************************************************************************/
void Set_time(unsigned char sel){
//根据选择调整的相应项目加1并写入DS1302,函数参数是按动设置键的次数
write_com(0x30); write_com(0x06);
lcm_w_test(0,0x98);
lcm_w_word("调整>");//调用字符显示函数,显示 调整字样
//================================================================
lcm_w_test(0,0x9c);
if(sel==9) {lcm_w_word("调整多少");address=0xc2; max=29;mini=0;
tiaozheng();
ds_w();
tiaozheng();
} //按动10次显示 调整多少秒
if(sel==8) {lcm_w_word("加减调整");address=0xc4;max=1;mini=0;
tiaozheng(); //显示调整前的内容
ds_w(); //设置闹钟
tiaozheng(); //显示调整后的内容
} //按动9次显示 快还是慢
//================================================================
lcm_w_test(0,0x9c);
if(sel==7) {lcm_w_word("闹钟分钟");address=0xc8;max=59;mini=0; //数据写入1302芯片的写入地址是0xc8,最大值是59,最小值是0
tiaozheng(); //显示调整前的内容
ds_w(); //设置闹钟
tiaozheng(); //显示调整后的内容
} //按动8次显示 调整闹钟的分钟部分
if(sel==6) {lcm_w_word("闹钟小时");address=0xc6; max=23;mini=0;
tiaozheng();
ds_w();
tiaozheng();
} //按动7次显示 调整闹钟的小时部分
//================================================================
if(sel==5) {lcm_w_word("调整秒钟");address=0x80; max=59;mini=0;
tiaozheng();
ds_w();
tiaozheng();
}
if(sel==4) {lcm_w_word("调整分钟");address=0x82; max=59;mini=0;
tiaozheng();
ds_w();
tiaozheng();
}
if(sel==3) {lcm_w_word("调整小时");address=0x84; max=23;mini=0;
tiaozheng();
ds_w();
tiaozheng();
}
if(sel==2) {lcm_w_word("调整日期");address=0x86;
mo = read_clock(0x89);//读月数据
moontemp1=mo/16;
moontemp2=mo%16;
mo=moontemp1*10+moontemp2;//转换成10进制月份数据
yy = read_clock(0x8d);//读年数据
moontemp1=yy/16;
moontemp2=yy%16;
yy=moontemp1*10+moontemp2;//转换成10进制年份数据
if(mo==2&&yy%4!=0){max=28;mini=1;}//平年2月28天
if(mo==2&&yy%4==0){max=29;mini=1;}//闰年2月29天
if(mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12){max=31;mini=1;}//31天的月份
if(mo==4||mo==6||mo==9||mo==11){max=30;mini=1;}//30天的月份
tiaozheng();
ds_w();
tiaozheng();
}
if(sel==1) {lcm_w_word("调整月份");address=0x88; max=12;mini=1;
tiaozheng();
ds_w();
tiaozheng();
}
if(sel==0) {lcm_w_word("调整年份");address=0x8c; max=99; mini=0;
tiaozheng();
ds_w();
tiaozheng();
}
}
//--------------------------------------
评论2