idata unsigned char day,sec,min,hour,date,month,year,hms,n,fla_cou; unsigned
char
code
yejing[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; /*------------------子函数声明 (时钟部分 )--------------*/ void InputByte(unsigned char Date); void WriteTo1302(unsigned char Addr,unsigned char Date); ReadFrom1302(unsigned char Addr); void SetTime(unsigned char *pSecDa); void GetTime(unsigned char Curtime[]); void Init_T0(void); void FlashKey(void); void Add(void); void Init_Clock(void); void Refresh(void); void StartMenu(void)
/*------------------------时钟固定汉字显示-----------------------*/ void ClockMsg(void) {
Clr_Scr(); // 先清屏 CS2=1;CS1=0; // 左屏
hz_disp16(1,32,1,xing);?? //星//期// 2// 0// 年//时
CS2=0;CS1=1; // 右屏
hz_disp16(3,0,1,yue);?? //月//日//分//秒 }
/*----------------时钟部分-------------------------------*/ /*----------------函数:写入字节子函数-----------*/ void InputByte(unsigned char dat) {
unsigned char i; ACC = dat;
for(i=8; i>0; i--) {
IO = ACC0;
CLK = 1; //下降沿写入数据// CLK = 0;
ACC = ACC >> 1; } }
/*----------------函数:读出字节子函数-----------*/ OutputByte(void) //上升沿读出数据// ??
/*----------------函数:设置初始时间-------------------*/ void SetTime(unsigned char *pSecDa) { ??
WriteTo1302(0x8e,0x00); // 控制命令,WP=0,写操作 // for(i =7;i>0;i--) {
WriteTo1302(Addr,*pSecDa); // 秒 分 时 日 月 星期 年 // pSecDa++; Addr +=2; }
WriteTo1302(0x8e,0x80); // 控制命令,WP=1,写保护 // } /*----------------函数:读取DS1302当前时间-------------------*/ void GetTime(void) { ??
for (i=0;i<7;i++)
{ Curtime[i] = ReadFrom1302(Addr); Addr += 2; }
sec = Curtime[0];?? //Min//hour //day //date //month //year }
/*----------------函数:初始化定时器T0子函数-------------------*/ void Init_T0(void) {
TMOD=0x01; //定时器T0,工作模式1// TH0=0x3c; //50ms// ?? }
/*----------------函数:产生闪烁信号子函数------------------------*/ void T0_flash(void) interrupt 1 // 中断程序,产生时钟秒信号 // /*----------------函数:时间闪烁子函数----------------------------*/ /*----------------功能:选择确定闪烁位等待调整--------- -----*/ void FlashKey(void) //闪烁子函数// void Add(void) //调时子函数// void Init_Clock(void) //时钟初始化子函数// void Refresh(void) //刷新显示子函数// void Add(void) //调时子函数// {
if(P1_2==0) //按P0_2键进行时间调整// {
while(P1_2==0) Refresh();
if(KT==1) //检验可调标志位KT// { hms++; switch(n)
{case 1:year=hms;break; //根据n不同,返回给不同的位:n=1 -> 返回给小时位// ??}
if((sec&0x0f)==0x0a) {sec&=0xf0; sec+=0x10;} // 如果秒位满十,向十秒位进一
??
if(day==8) {day=1;} // 如果星期满七,重新从星期一开始计 //
if((sec&0xf0)==0x60) {sec&=0x0f;} // 如果十秒位满六,清零 //
if(((date&0xf0)==0x30)&((date&0x0f)==0x02)) {date&=0x00;}
if(((month&0xf0)==0x10)&((month&0x0f)==0x03)) {month&=0x00;} if((year&0xf0)==0xa0) {year&=0x0f;}
Curtime[0] = sec; Curtime[1] = min; ??
SetTime(&Curtime[0]); // 将调整过后的时间值写入DS1302 // }
/ *--------------------时钟初始化子函数----------------------------*/ void Init_Clock(void) {
K1=1; K2=1; K3=1; K4=1; K5=1; K6=1; K7=1; KT=0; n=0; Init_T0(); }
/*-------------------------刷新显示子函数--------------------------*/ void Refresh(void) {
GetTime(); CS1=1;CS2=0; if(K6)
{ sz_disp16(5,40,1,shuzi[sec&0x0f]); // 秒位 // sz_disp16(5,32,1,shuzi[sec>>4]); } // 十秒位 // else
{ hz_disp16(5,32,1,kongbai2); } // 秒位 十秒位 // if(K5)
{ sz_disp16(5,8,1,shuzi[min&0x0f]); // 分钟位 //