基于51单片机+DS1302+LCD12864显示电子日历设计软件程序源码包

#define uchar unsigned  char 
#define uint  unsigned  int
#include <reg51.h>
#include <intrins.h>


extern uchar dbuf[4];

sbit DQ=P1^6;
bdata  uchar dat;
sbit   dat0=dat^0;
sbit   dat7=dat^7;

//uchar code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c};
uchar dbuf[4]={0,0,0,0};// 显示缓存

void  Delay15(uchar n)
 { do {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        n--;
        }while(n);
  }
//2*x+5
void Delay_Xus(uchar x)        //x取值1~255;
{
    while(--x);
}

//该函数返回为0,表示有DS1820,否则没有
bit Reset(void) 
 { bit err;
   DQ=0;
   Delay15(40);
   DQ=1;
   Delay15(6);
   err=DQ;
   Delay15(18);
   return(err);
 }

void WrByte(uchar d)
 { uchar i;
   dat=d;
   for(i=8;i>0;i--)
     { DQ=0;
       Delay15(1);
       DQ=dat0;
       dat=dat>>1;
       Delay15(1);
       DQ=1;
      }
 }

/* uchar  RdByte(void)
  {  uchar i;
     dat=0;
     for(i=8;i>0;i--)
     {  dat=dat>>1;
        DQ=0;
        _nop_();
        DQ=1;
        Delay15(1);
        dat7=DQ;
      }
     return(dat);
  }             */

uchar RdByte(void)
{
    uchar i;
    uchar tmp = 0;
    DQ = 1;                            //准备读;
    _nop_();
    for(i=0;i<8;i++)
    {
        tmp >>= 1;                //低位先发;
        DQ = 0;                        //Read init;
        _nop_();                    //2ms;
        DQ = 1;                        //必须写1,否则读出来的将是不预期的数据;
        Delay_Xus(2);            //延时9us;
        _nop_();
        if(DQ)                        //在12us处读取数据;
            tmp |= 0x80;
        Delay_Xus(2);        //延时55us;
        DQ = 1;                        //恢复One Wire Bus;
        _nop_();;
    }
    return tmp;    

void Convert(void)
 { bit err;
   err=Reset();
   WrByte(0xcc);  //跳过多传感器识别
   WrByte(0x44);  //启动温度转换
 }
 
int Readt(void)
 {  uchar h,l;
    bit err;
    err=Reset();
    WrByte(0xcc); //跳过多传感器识别
    WrByte(0xbe); //读暂存器
    l=RdByte(); //温度低位
    h=RdByte(); //温度高位
    
   // return(h*256+l);
    return l;
 }
//****************************************************************************************

#include <reg52.h>
//#include "ds1302.h"

#define uchar unsigned char
#define uint  unsigned int

#define SECOND 0x80        //秒
#define MINUTE 0x82        //分鍾
#define HOUR   0x84        //小時
#define DAY       0x86        //天
#define MONTH  0x88        //月
#define WEEK   0x8a        //星期
#define YEAR   0x8c        //年

sbit DS1302_RST=P3^0;
sbit DS1302_SCLK=P3^1;
sbit DS1302_IO=P3^2;
    
typedef struct systime
{
    uchar     cYear;
    uchar    cMon;
    uchar    cDay;
    uchar    cHour;
    uchar    cMin;
    uchar    cSec;
    uchar    cWeek;
}SYSTIME;
         
void DS1302_Write(uchar D)
{
    uchar i;    
    for(i=0;i<8;i++)
    {    
        DS1302_IO=D&0x01;
        DS1302_SCLK=1;
        DS1302_SCLK=0;
        D=D>>1;                
    }    
}

uchar DS1302_Read()
{
    uchar TempDat=0,i;
    for(i=0;i<8;i++)
    {    
        TempDat>>=1;     
        if(DS1302_IO) TempDat=TempDat|0x80;
        DS1302_SCLK=1;
        DS1302_SCLK=0;
        
    }    
    return TempDat;
}

void WDS1302(uchar ucAddr, uchar ucDat)    
{
    DS1302_RST = 0;
    DS1302_SCLK = 0;
    DS1302_RST = 1;
    DS1302_Write(ucAddr);           // 地址,命令 
    DS1302_Write(ucDat);           // 写1Byte数据
    DS1302_SCLK = 1;
    DS1302_RST = 0;

uchar RDS1302(uchar ucAddr)
{
    uchar ucDat;
    DS1302_RST = 0;
    DS1302_SCLK = 0;
    DS1302_RST = 1;
    DS1302_Write(ucAddr);           // 地址,命令 
    ucDat=DS1302_Read();       
    DS1302_SCLK = 1;
    DS1302_RST = 0;
    return ucDat;
}

void SetTime(SYSTIME sys)
{

    WDS1302(YEAR,sys.cYear); 
    WDS1302(MONTH,sys.cMon&0x1f);
    WDS1302(DAY,sys.cDay&0x3f);
    WDS1302(HOUR,sys.cHour&0xbf);
    WDS1302(MINUTE,sys.cMin&0x7f);
    WDS1302(SECOND,sys.cSec&0x7f);    
    WDS1302(WEEK,sys.cWeek&0x07);

}

void GetTime(SYSTIME *sys)
{
    uchar uiTempDat;
    uiTempDat=RDS1302(YEAR|0x01);              
    (*sys).cYear=(uiTempDat>>4)*10+(uiTempDat&0x0f);

//    uiTempDat=RDS1302(0x88|0x01);
//    (*sys).cMon=((uiTempDat&0x1f)>>4)*10+(uiTempDat&0x0f);
    uiTempDat=RDS1302(0x88|0x01);
    (*sys).cMon=((uiTempDat&0x1f)>>4)*10+(uiTempDat&0x0f);    

    uiTempDat=RDS1302(DAY|0x01);
    (*sys).cDay=((uiTempDat&0x3f)>>4)*10+(uiTempDat&0x0f);

    uiTempDat=RDS1302(HOUR|0x01);
    (*sys).cHour=((uiTempDat&0x3f)>>4)*10+(uiTempDat&0x0f);

    uiTempDat=RDS1302(MINUTE|0x01);
    sys->cMin=((uiTempDat&0x7f)>>4)*10+(uiTempDat&0x0f);

    uiTempDat=RDS1302(SECOND|0x01);
    sys->cSec=((uiTempDat&0x7f)>>4)*10+(uiTempDat&0x0f);

    uiTempDat=RDS1302(MONTH|0x01);
    (*sys).cMon=uiTempDat&0x17;

    uiTempDat=RDS1302(WEEK|0x01);
    sys->cWeek=uiTempDat&0x07;
}

//****************************************************************************************

//#include "Includes.h"            //文件包含
#include         <reg52.h>
#include    <intrins.h>
#include    <string.h>
#include     "One-Wire.h"

#define int8u unsigned char

/*************************************************
    模块级变量申明                 
*************************************************/
/* void     OneWire_Rst(void);
 void     OneWire_Init(void);
 void     OneWire_WriteByte(int8u cmd);
 int8u     OneWire_ReadByte(void);
 void     OneWire_Idle(void);      */

 void Delay_Xus(int8u x)        //x取值1~255;
{
    while(--x);
//    int8u i;
//    x /= 8;
//    for(i=0;i<x;i++);
    }

 void Delay_Xms(int8u x)        //x取值1~255;
{
    int8u i,j;
    for(i=0;i<x;i++)
    for(j=0;j<200;j++)
    {
        _nop_();
        _nop_();
    }
}

/*************************************************
    子函数定义                  
*************************************************/


 void OneWire_Init(void)
{
    DQ = 1;
    _nop_();;
    DQ = 0;                        //拉低数据线,准备Reset OneWire Bus;
    Delay_Xus(125);        //延时510us,Reset One-Wire Bus.
    Delay_Xus(125);
    
    DQ = 1;                        //提升数据线;
    Delay_Xus(15);        //延时35us;
    
    while(DQ)                    //等待Slave 器件Ack 信号;
    {
        _nop_();;
        }
    Delay_Xus(60);        //延时125us;    
    DQ = 1;                        //提升数据线,准备数据传输;
    }

 void OneWire_Rst(void)
{
    DQ = 0;                        //拉低数据线,准备Reset OneWire Bus;
    Delay_Xus(125);        //延时511us,Reset One-Wire Bus.
    DQ = 0;
    Delay_Xus(125);
    }
/*******************************************************************************
*** 函 数 名:  void OneWire_WriteByte(int8u cmd)
*** 功能描述: 写一个字节;
*** 全局变量: NO !
*** 输        入: cmd:8bit;
*** 输        出: NO !
*** 函数说明: cmd主要有Rom操作指令和E2Ram操作指令两种;
/******************************************************************************/
 void OneWire_WriteByte(int8u cmd)
{
    int8u i;
    for(i=0;i<8;i++)
    {
        if(cmd & 0x01)        //低位在前;
            {
                DQ = 0;                //结束Recovery time;
                _nop_();;
                _nop_();;
                _nop_();;
                DQ = 1;                //发送数据;
                }
        else
            {
                DQ = 0;                //结束Rec time;
                _nop_();;
                _nop_();;
                _nop_();;        
                //DQ = 0;            //发送数据;
                }
        Delay_Xus(30);        //等待Slave Device采样;
        DQ = 1;                        //Recovery;
        _nop_();;                        //Recovery Time Start;
        cmd >>= 1;
        }
    }
/*******************************************************************************
*** 函 数 名:  int8u OneWire_ReadByte(void)
*** 功能描述: 读取一个字节;
*** 全局变量: NO !
*** 输        入: NO !
*** 输        出: 8bit data;
*** 函数说明: 读之前必须首先写1;
/******************************************************************************/
 int8u OneWire_ReadByte(void)
{
    int8u i;
    int8u tmp = 0;
    DQ = 1;                            //准备读;
    _nop_();;
    for(i=0;i<8;i++)
    {
        tmp >>= 1;                //低位先发;
        DQ = 0;                        //Read init;
        _nop_();                    //2ms;
        DQ = 1;                        //必须写1,否则读出来的将是不预期的数据;
        Delay_Xus(2);            //延时9us;
        _nop_();
        if(DQ)                        //在12us处读取数据;
            tmp |= 0x80;
        Delay_Xus(30);        //延时55us;
        DQ = 1;                        //恢复One Wire Bus;
        _nop_();;
        }
    return tmp;    
    }
/*******************************************************************************
*** 函 数 名:  void OneWire_Idle(void)
*** 功能描述: 总线空闲模式;
*** 全局变量: NO !
*** 输        入: NO !
*** 输        出: NO !
*** 修 改 人:                                         日期:2006-11-28
*** 函数说明: 
/******************************************************************************/
 void OneWire_Idle(void)
{
    DQ = 1;
    _nop_();;
    }
/*******************************************************************************
*** 函 数 名:  void DS18B20_Init(void)
*** 功能描述: 器件DS18B20初始化;
*** 全局变量: NO !
*** 输        入: NO !
*** 输        出: NO !
*** 修 改 人:                                         日期:2006-11-28
*** 函数说明: 
/******************************************************************************/
 void DS18B20_Init(void)
{
    OneWire_Init();
    }
/*******************************************************************************
*** 函 数 名:  void DS18B20_RomCmd(int8u romCmd)
*** 功能描述: DS18B20Rom操作命令写;
*** 全局变量: NO !
*** 输        入: romCmd;
*** 输        出: NO !

*** 函数说明: 0x33:Read Rom; 0x55:Match Rom; 0xcc:Skip rom; 0xf0: Search rom;
                            0xec:Alarm Search.
/******************************************************************************/
 void DS18B20_RomCmd(int8u romCmd)        //仅写了SkipRom例程;
{
    switch(romCmd)
    {
        case 0xcc:            //Skip Rom command;
            OneWire_WriteByte(0xcc);
            break;
        
        default:
            break;    
        }
    }
/*******************************************************************************
*** 函 数 名:  void DS18B20_MemCmd(int8u memCmd)
*** 功能描述: DS18B20Memory 操作命令;
*** 全局变量: NO !
*** 输        入: NO !
*** 输        出: NO !

*** 函数说明: 仅写了ConvertT(0x44) 和0xBE命令;
                            0x44:Convert T; 0xbe:Read Scratch-pad;
/******************************************************************************/
 void DS18B20_MemCmd(int8u memCmd)        
{
    switch(memCmd)
    {
        case 0x44:        //Start to Convert temperature;
            OneWire_WriteByte(0x44);
            _nop_();;
            DS18B20_Busy();
            Delay_Xms(250);        //延时750ms;
            Delay_Xms(250);
            Delay_Xms(250);
            break;
        
        case 0xbe:        //Read scratchpad;
            OneWire_WriteByte(0xbe);
            break;
                
        default:
            break;    
        }
    }
/*******************************************************************************
*** 函 数 名:  void DS18B20_ReadDat(int8u len,int8u *buf)
*** 功能描述: 读取DS18B20内部的Scratchpad内容;
*** 全局变量: NO !
*** 输        入: len:将要读取的数据长度;
*** 输        出: buf:数据缓存;
*
*** 函数说明: 
/******************************************************************************/
 void DS18B20_ReadDat(int8u len,int8u *buf)
{
    int8u i;
    for(i=0;i<len;i++)
    {
        buf[i] = OneWire_ReadByte();
        }
    OneWire_Rst();
    OneWire_Idle();    
    }
/*******************************************************************************
*** 函 数 名:  void DS18B20_Busy(void)
*** 功能描述: 内部模数转换中,忙
*** 全局变量: NO !
*** 输        入: NO !
*** 输        出: NO !

*** 函数说明: 
/******************************************************************************/
 void DS18B20_Busy(void)
{
    OneWire_Idle();
    }
 

//****************************************************************************************

#include <reg52.h>

#include "12864.h"
#include "model.h"
#include "ds1302.h"
#include "one-wire.h"
#include "lunar.h"
#include "input_080627.h"
//#include "yinli.h"

#define uchar unsigned char
#define uint unsigned int

#define NoUpLine     1
#define UpLine       0
#define NoUnderLine 1
#define UnderLine    0

#define FALSE    0
#define TRUE    1


uchar bdata gTmp;
sbit t0 = gTmp^0;
sbit t1 = gTmp^1;
sbit t2 = gTmp^2;
sbit t3 = gTmp^3;
sbit t4 = gTmp^4;
sbit t5 = gTmp^5;
sbit t6 = gTmp^6;
sbit t7 = gTmp^7;


uchar dispBuf[7];
uchar T0_Count=0,Tmp_Count=0;
bit T0_Flag,Tmp_Flag,Flash_Flag;

SYSTIME sys;           //系统日期
SPDATE SpDat;           //农历日期

//设置时间的标志
bit Hour_Flag=TRUE,Min_Flag=TRUE,Sec_Flag=TRUE;
bit Year_Flag=TRUE,Mon_Flag=TRUE,Day_Flag=TRUE;

uchar State_Set=0;     //设置状态 (用来区分此时是在设置时,分,秒,日,月,年)   

bit   State_Flag=FALSE,Inc_Flag=FALSE,Dec_Flag=FALSE;    //用来标志三个按键是否按下。

uchar code Mon2[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,
                  0,31,29,31,30,31,30,31,31,30,31,30,31};

/***********************************************************
    cDat:        要显示的数
    X:            行数 0~7
    Y:          列数 0~127
    show_flag:  是否反白显示,0反白,1不反白 
    upline:     上划线, 0表示带上划线
    underline:  下划线, 0表示带下划线
    返回:       无
************************************************************/
void LCD_ShowTime(char cDat,uchar X,uchar Y,bit show_flag,bit up,bit under)
{
    uchar s[2];
       s[0]=cDat/10+'0';
    s[1]=cDat%10+'0';
    en_disp(X,Y,2,Asc,s,show_flag,up,under);
}

/***********************************************************
// 函数名:      Show_YMD()
// 入口参数:    void 
// 出口参数:  void 
// 功能:        显示公历与农历的年、月、日、星期
// 说明:        普通模式每天刷新一次
//                设置模式每次循环刷新一次

***********************************************************/
void Show_YMD()        //显示年月日星期
{
    uchar uiTempDat;
       uiTempDat=RDS1302(0x88|0x01);
    sys.cMon=((uiTempDat&0x1f)>>4)*10+(uiTempDat&0x0f);    
    LCD_ShowTime(sys.cMon,2,5,Mon_Flag,NoUpLine,NoUnderLine);            //月
    hz_disp(4,5,1,uMod[1],1,NoUpLine,NoUnderLine);
    Show16X32(2,27,ucNum3216[sys.cDay/10],Day_Flag);
    Show16X32(2,43,ucNum3216[sys.cDay%10],Day_Flag);                      //年

    /

    hz_disp(6,8,2,ucLunar[13],1,UpLine,UnderLine);
    if(sys.cWeek==7)
    hz_disp(6,40,1,uMod[2],1,UpLine,UnderLine);                     //星期日
    else
    hz_disp(6,40,1,ucLunar[sys.cWeek],1,UpLine,UnderLine);         //星期

      /                
                                           
    LCD_ShowTime(20,0,9,1,UpLine,UnderLine);
      LCD_ShowTime(sys.cYear,0,25,Year_Flag,UpLine,UnderLine);
    hz_disp(0,41,1,uMod[0],1,UpLine,UnderLine);                      //年
                   

    

    SpDat=GetSpringDay(sys.cYear,sys.cMon,sys.cDay);    //得到农历日期

//显示农历日期
    if(SpDat.cMon==1)                                               //农历月
      hz_disp(4,64,1,ucLunar[15],1,UpLine,NoUnderLine);               //"正"
    else if(SpDat.cMon==11)
      hz_disp(4,64,1,ucLunar[16],1,UpLine,NoUnderLine);               //"冬"
    else if(SpDat.cMon==12)
      hz_disp(4,64,1,ucLunar[17],1,UpLine,NoUnderLine);               //"腊"
    else
      hz_disp(4,63,1,ucLunar[SpDat.cMon],1,UpLine,NoUnderLine);    //"二"~"十"

     if(SpDat.cDay/10==1 && SpDat.cDay%10>0)                       //显示"十" 例如"十四"而不是"一四"
     hz_disp(4,95,1,ucLunar[10],1,UpLine,NoUnderLine);
     else if(SpDat.cDay/10==2 && SpDat.cDay%10>0)                  //显示"廿" 例如"廿三"而不是"二四"
     hz_disp(4,95,1,ucLunar[19],1,UpLine,NoUnderLine);
     else
     hz_disp(4,95,1,ucLunar[SpDat.cDay/10],1,UpLine,NoUnderLine);  //正常显示数字

    if(!(SpDat.cDay%10))       //                                   //"十"
     hz_disp(4,111,1,ucLunar[10],1,UpLine,NoUnderLine);
    else                                                            //正常数字
     hz_disp(4,111,1,ucLunar[SpDat.cDay%10],1,UpLine,NoUnderLine);

    
//显示生肖
     hz_disp(0,104,1,SX[(uint)(2000+SpDat.cYear)%12],1,UpLine,UnderLine);   //生肖

    
//显示天干地支
     hz_disp(2,95,1,TianGan[(uint)(2000+SpDat.cYear)%10],1,NoUpLine,NoUnderLine); //天干
     hz_disp(2,111,1,DiZhi[(uint)(2000+SpDat.cYear)%12],1,NoUpLine,NoUnderLine);  //地支

}

/**************************************************************
// 函数名:      LCD_ShowTemp()
// 入口参数:    void 
// 出口参数:  void 
// 功能:        采集温度并显示
// 说明:        30秒更新一次

***************************************************************/
void LCD_ShowTemp()
{
    uchar datTm[2];
    
    float temp;
    uchar buftmp;
    
              
    if(!Tmp_Flag) return;
    Tmp_Flag=FALSE;

    DS18B20_Init();
    DS18B20_RomCmd(0xcc);    //Skip Rom command;
    Delay_Xms(20);
    DS18B20_MemCmd(0x44);    //Convert T command;
    
    DS18B20_Init();
    DS18B20_RomCmd(0xcc);
    DS18B20_MemCmd(0xbe);
    DS18B20_ReadDat(2,datTm);
        
    gTmp = datTm[0];
    temp = (uchar)t0 * 0.0625 + (uchar)t1 * 0.125 + (uchar)(t2) * 0.25 + (uchar)(t3) * 0.5;
    buftmp = (uchar)(temp*10);
    dispBuf[2] = '.';
    dispBuf[3] = buftmp + '0';
    
    buftmp = (uchar)t4 + (uchar)t5*2 + (uchar)t6*4 + (uchar)t7*8;
    gTmp = datTm[1];
    gTmp &= 0x07;
    buftmp += (gTmp * 16);
    dispBuf[0] = (buftmp/10) + '0';
    dispBuf[1] = (buftmp%10) + '0';
    
    dispBuf[4] = 0xdf;        //摄氏度;
    dispBuf[2] = 'C';
    en_disp(0,65,2,Asc,dispBuf,1,UpLine,UnderLine); 
}


/***********************************************************
// 函数名:      LCD_ShowWNL()
// 入口参数:    void 
// 出口参数:  void 
// 功能:        显示万年历
// 说明:        

***********************************************************/
void LCD_ShowWNL()
{
    

    LCD_ShowTime(sys.cSec,6,111,Sec_Flag,UpLine,UnderLine);         //秒   每次循环钟刷新一次

    if(!sys.cSec || State_Set)                                     //分   在普通模式时每分钟刷新一次
    LCD_ShowTime(sys.cMin,6,87,Min_Flag,UpLine,UnderLine);         //     在设置模式时每次循环刷新一次
     
    if(!sys.cSec && !sys.cMin || State_Set)                         //时   在普通模式时每小时刷新一次
    LCD_ShowTime(sys.cHour,6,63,Hour_Flag,UpLine,UnderLine);     //     在设置模式时每次循环刷新一次
    
    if(!sys.cSec && !sys.cMin && !sys.cHour || State_Set )       //公历农历的年、月、日、星期
    {                                                             //普通模式每天刷新一次
        Show_YMD();                                              //设置模式每次循环刷新一次
        if(State_Set==7) State_Set=0;
    }    
}

/***********************************************************
// 函数名:      CAL_Init()
// 入口参数:    void 
// 出口参数:  void 
// 功能:        日期初始化
// 说明:        星期通过计算得到

***********************************************************/
void CAL_Init()
{
    sys.cYear=0x09;
    sys.cMon=0x05;
    sys.cDay=0x05;
    sys.cHour=0x10;
    sys.cMin=0x27;
    sys.cSec=0x00;
    sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay);
}


/***********************************************************
// 函数名:      SFR_Init()
// 入口参数:    void 
// 出口参数:  void 
// 功能:        寄存器初始化
// 说明:        定时器0控制温度采集,定时器1控制按键扫描

***********************************************************/
void SFR_Init()
{
    T0_Flag=FALSE;
    Tmp_Flag=TRUE;
    Flash_Flag=FALSE;
    TMOD=0x11;
    ET0=1;
    ET1=1;
    TH0= (-50000)/256;
    TL0= (-50000)%256;
    TH1= (-10000)/256;
    TL1= (-10000)%256;
    EA=1;
}

/***********************************************************
// 函数名:      GUI_Init()
// 入口参数:    void 
// 出口参数:  void 
// 功能:        图形界面初始化
// 说明:        一些永远不耍更新的图形(如线条,"年"、"月"、"日"等)
                只是在初始化时写入,中间过程不再更新。

***********************************************************/
void GUI_Init()
{
     uint i,j;
     进入界面///
     LCD12864_init();
     ClearLCD();
     LCD_ShowTemp();        //在显示图片之前启动温度转换
     img12864_disp(uBmp);    //显示图片
     
     for(i=0;i<10;i++)
     for(j=0;j<32767;j++);
                                 
     ClearLCD();

     /描绘框架//
     Rect(0,0,127,63,1);
     Line(62,0,62,62,1);
     Line(0,48,127,48,1);
     Line(0,15,127,15,1);
     Line(24,15,24,48,1);

     Line(63,32,128,32,1);
     Line(97,0,97,15,1);
     //Line(24,15,24,48,1);

     时间初始化//
     SetTime(sys);                   //设置时间
     GetTime(&sys);                   //获得时间
     
     Show_YMD();

     LCD_ShowTime(sys.cSec,6,111,Sec_Flag,UpLine,UnderLine);
     en_disp(6,103,1,Asc,":",1,UpLine,UnderLine);
     LCD_ShowTime(sys.cMin,6,87,Min_Flag,UpLine,UnderLine); 
     en_disp(6,79,1,Asc,":",1,UpLine,UnderLine);     
     LCD_ShowTime(sys.cHour,6,63,Hour_Flag,UpLine,UnderLine);

     hz_disp(2,64,1,ucLunar[11],1,NoUpLine,NoUnderLine);       //"农"
     hz_disp(2,80,1,ucLunar[12],1,NoUpLine,NoUnderLine);       //"历"
     hz_disp(4,79,1,uMod[1],1,UpLine,NoUnderLine);               //"月"
     显示初始化温度//
     en_disp(0,65,2,Asc,dispBuf,1,UpLine,UnderLine); 
     hz_disp(0,81,1,ucLunar[18],1,UpLine,UnderLine); 
}


/***********************************************************
// 函数名:      DecToBCD()
// 入口参数:    void 
// 出口参数:  void 
// 功能:        把时间由10进制转为BCD
// 说明:        DS1302以BCD存储

***********************************************************/
void DecToBCD()
{
    sys.cHour=(((sys.cHour)/10)<<4)+((sys.cHour)%10);
    sys.cMin=(((sys.cMin)/10)<<4)+((sys.cMin)%10);
    sys.cSec=((sys.cSec/10)<<4)+((sys.cSec)%10);
      sys.cYear=((sys.cYear/10)<<4)+((sys.cYear)%10);
    sys.cMon=((sys.cMon/10)<<4)+((sys.cMon)%10);
    sys.cDay=((sys.cDay/10)<<4)+((sys.cDay)%10);
}

/***********************************************************
// 函数名:      Time_Set()
// 入口参数:    void 
// 出口参数:  void 
// 功能:        时间设置
// 说明:        具体的时间设置

***********************************************************/
void Time_Set()
{
       
    if(State_Flag)                    //设置键按下
    {
        State_Flag=FALSE;
        State_Set++;
        //State_Set%=7;
        if(State_Set==8) State_Set=0;
    }

    Hour_Flag=TRUE;Min_Flag=TRUE;Sec_Flag=TRUE;
    Year_Flag=TRUE;Mon_Flag=TRUE;Day_Flag=TRUE;

    switch(State_Set)               //设置类型
    {
            case 0:                 //无设置
            
            break;
             
            case 1:                    //设置时
            Hour_Flag=FALSE;
            break;

            case 2:                       //设置分
            Min_Flag=FALSE;
            break;
    
    
            case 3:                     //设置秒
            Sec_Flag=FALSE;
            break;
    
            case 4:                     //设置天
             Day_Flag=FALSE;
            break;
    
            case 5:
             Mon_Flag=FALSE;         //设置月
            break;
    
            case 6:
             Year_Flag=FALSE;         //设置年
            break;

            case 7:                     //无动作,设置此值为让"年"的反白消失。

            break;
      }       
      
    if(Inc_Flag)                      //加键被按下
    {   
        Inc_Flag=FALSE;
        switch(State_Set)
        {
            case 0:
            
            break;
    
            case 1:                        //小时加
            sys.cHour++;
            (sys.cHour)%=24;
            break;
    
            case 2:                        //分加
            sys.cMin++;
            sys.cMin%=60;
            break;
    
            case 3:                     //秒加
            sys.cSec++;
            sys.cSec%=60;
            break;
    
            case 4:                     //天加
            (sys.cDay)=(sys.cDay%Mon2[YearFlag(sys.cYear)][sys.cMon])+1;           
            break;
    
            case 5:                     //月加
            sys.cMon=(sys.cMon%12)+1;
            break;
    
            case 6:
            sys.cYear++;             //年加
            sys.cYear=sys.cYear%100;
            break;
          }    
        sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay);    //算出星期
        DecToBCD();            //转为BCD
        SetTime(sys);        //存入DS1302
    }

    if(Dec_Flag)                     //减键按下
    {   
        Dec_Flag=FALSE;
        switch(State_Set)
        {
            case 0:
            
            break;
    
            case 1:       
            sys.cHour=(sys.cHour+23)%24;              //时减
            break;
    
            case 2:                                      //分减
            sys.cMin=(sys.cMin+59)%60;
            break;
    
            case 3:                                    //秒减
            sys.cSec=(sys.cSec+59)%60;
            break;
    
            case 4:                                    //天减
            sys.cDay=((sys.cDay+Mon2[YearFlag(sys.cYear)][sys.cMon]-1)%Mon2[YearFlag(sys.cYear)][sys.cMon]);           
            if(sys.cDay==0) sys.cDay=Mon2[YearFlag(sys.cYear)][sys.cMon];
            break;
    
            case 5:                                    //月减
            sys.cMon=(sys.cMon+11)%12;
            if(sys.cMon==0) sys.cMon=12;
            break;
    
            case 6:                                    //年减
            sys.cYear=(sys.cYear+99)%100;
            break;
          }    
        sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay);          
        DecToBCD();
        SetTime(sys);    
    }

}
void  main()
{
     SFR_Init();
     CAL_Init();
     GUI_Init();
     TR0=1;
     TR1=1;
     while(1)     
     {
        GetTime(&sys);        //获得时间
        LCD_ShowTemp();        //显示温度
        LCD_ShowWNL();        //显示万年历
        Time_Set();         //时间设置
     }    
}

void timer0() interrupt  1     //控制温度采集
{
    TH0= (-50000)/256;
    TL0= (-50000)%256;
    T0_Count++;
    if(T0_Count==20)
    {    
        Tmp_Count++;
        T0_Count=0;
    }

    if(Tmp_Count==33)
    {
        Tmp_Count=0;
        Tmp_Flag=TRUE;
    }
}


void timer1() interrupt  3     //按

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GJZGRB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值