找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13537|回復(fù): 29
打印 上一主題 下一主題
收起左側(cè)

我也來做個時鐘

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:58628 發(fā)表于 2015-7-7 23:35 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
今年忘買日歷了,業(yè)余時間做個日歷時鐘吧,也練下手,過程不詳解了,總之以后再也不想再焊這樣的洞洞板了,程序是網(wǎng)上移植的,加以修改后就是我的了,呵呵

2.jpg (234.78 KB, 下載次數(shù): 372)

2.jpg

3.jpg (220.53 KB, 下載次數(shù): 386)

3.jpg

4.jpg (310.19 KB, 下載次數(shù): 415)

4.jpg

5.jpg (320.39 KB, 下載次數(shù): 341)

5.jpg

6.jpg (222.83 KB, 下載次數(shù): 367)

6.jpg

7.jpg (312.75 KB, 下載次數(shù): 352)

7.jpg

8.jpg (289.43 KB, 下載次數(shù): 409)

8.jpg

評分

參與人數(shù) 1威望 +50 黑幣 +50 收起 理由
admin + 50 + 50 共享資料的積分獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2015-7-7 23:36 來自手機 | 只看該作者
樓主飛線好厲害。√A,能分享一下源程序嗎?
回復(fù)

使用道具 舉報

板凳
ID:58628 發(fā)表于 2015-7-8 22:54 | 只看該作者
本帖最后由 abc123194 于 2015-7-8 23:05 編輯
還是初學(xué)者,有不足處請指點!

main.c
/********************************************************************************
以實時時鐘的分鐘定時功能來實現(xiàn)中斷,
當(dāng)分鐘數(shù)據(jù)變化時,進行數(shù)據(jù)的更新;
         MCU 使用外部11.0592MHz時鐘。
         實時時鐘中斷接入MCU的INT0,
         
*********************************************************************************/


#include <STC89C5xRC.H>
#include"config.h"
#include"ds3231.h"
#include"display.h"
#include"time.h"
#include"keymark.h"
#include "nongli.h"
#include"Port.h"

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

/**********************函數(shù)聲明*********************************/

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


void MCUINIT()
{

        /*********************************************************************/
        int0=1;
        InitDS3231();                            //初始化DS3231
        DisplayInit();                        //74HC595  串口線初始化
        delayms(5);
        ge_shidisplay_code ();
        Display();                                                                                                 //年、月、日、時間、星期、溫度動態(tài)掃描顯示函數(shù)
        yeardis=BCD2Hex(read_random(DS3231_YEAR));                           
        monthdis=BCD2Hex(read_random(DS3231_MONTH)&(0x1f));                 //上電第一次調(diào)整時間時會歸零,初始化時賦初值解決
        datedis=BCD2Hex(read_random(DS3231_DAY)&(0x3f));
    hourdis=BCD2Hex(read_random(DS3231_HOUR)&(0x3f));
        mindis=BCD2Hex(read_random(DS3231_MINUTE)&(0x7f));
        weekdis=BCD2Hex(read_random(DS3231_WEEK)&(0x0f));
        nongli_Display();             //農(nóng)歷月、日靜態(tài)顯示函數(shù)

        /*********************************************************************/
        _nop_();_nop_();
        _nop_();_nop_();
}


/****************************主函數(shù)*****************************************/
void main()
{
        MCUINIT();
        Display ();
        while(1)
        {
        Display ();
         if (int0==0)                                        //如果是DS3231每分鐘時間到                                 
                {        
                        minutedisplay_code ();                                                //分鐘顯示碼
                        Display ();
                        minutedisplay_code ();                                                //分鐘顯示碼
                        Display ();
                          write_byte(0x0f,0x00);        //32KHZ輸出禁止,鬧鐘標(biāo)志位清零
                        Display ();
                        
                if ((Mintemp==0)||(Mintemp==1)||(Mintemp==2))                        //如果是DS3231每小時時間到,前三分鐘每分鐘都讀數(shù)據(jù),防漏讀
                                {
                                hourdisplay_code ();                                                //小時顯示碼
                                Display ();
                                if (Htemp==0)                //如果是DS3231每天時間到
                                        {
                                        datedisplay_code ();                                                //日顯示碼
                                        weekdisplay_code ();                                                //星期顯示碼
                                        Display ();
                                        nonglidisplay_code ();                                                //農(nóng)歷月日顯示碼
                                        Display ();
                                        nongli_Display();
                                        Display ();
                                        Display ();
                                        if (Dtemp==0x01)                //如果是DS3231每月時間到
                                                {        
                                                monthdisplay_code ();                                                //月顯示碼
                                                Display ();
                                                Display ();
                                                if (Montemp==0x01)                //如果是DS3231每年時間到
                                                        {
                                                        yeardisplay_code ();                                                //年顯示碼
                                                        Display ();
                                                    Display ();
                                                        }
                                                }
                                        }
                            }
                        temperdisplay_code ();                                                //溫度顯示碼
                        Display ();
                        write_byte(0x0f,0x00);                                                        //32KHZ輸出禁止,鬧鐘標(biāo)志位清零
                        int0=1;
                        Display ();
                }
        Display ();
        Display ();
    keyscan();                             //按鍵掃描
        Display ();
        }        
}



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


config.h
/***************************************************
**文件名  :config.h
**功能    :MCU有關(guān)的配置
**建立日期:15/05/01
**修改記錄:
**MCU初始化設(shè)置:MCU型號STC89C51RC 使用內(nèi)置RC震蕩器,頻率初步定為11.0592M.其它端口詳見PORT.H

*****************************************************/
/********************************************/
#ifndef _CONFIG_H_
#define _CONFIG_H_


/*type define*/
typedef unsigned char uchar;

typedef unsigned int uint;




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

#endif


Port.h
/***************************************************
**文件名  :Port.h
**功能    :引腳有關(guān)的定義
**顯示電路使用串行IC74HC595D,時鐘使用時鐘芯片DS3231SN
*****************************************************/
#include <STC89C5xRC.H>
#ifndef PORT_H_
#define PORT_H_

/**********************************************************
**
**DS3231 管腳定義
**
*********************************************************/
sbit SDA=P3^6;     //模擬I2C數(shù)據(jù)傳送位SDA        
sbit SCL=P3^7;     //模擬I2C時鐘控制位SCL
sbit int0=P3^2;      




/**********************************************************
**
**74HC595D 管腳定義
**
*********************************************************/
sbit SI_nian_HC595    = P0^0;
sbit SCK_nian_HC595   = P0^1;
sbit RCK_nian_HC595   = P0^2;
sbit SI_time_HC595    = P0^3;
sbit SCK_time_HC595   = P0^4;
sbit RCK_time_HC595   = P0^5;
sbit SI_temper_HC595  = P0^6;
sbit SCK_temper_HC595 = P0^7;
sbit RCK_temper_HC595 = P1^0;
sbit SI_nongli_HC595  = P1^1;
sbit SCK_nongli_HC595 = P1^2;
sbit RCK_nongli_HC595 = P1^3;


/***按鍵 管腳定義
**
*********************************************************/

sbit sw1=P3^3;
sbit sw2=P3^4;

#endif



time.h#ifndef __TIME_H__
#define __TIME_H__


extern void delayus(unsigned char itemp);
extern void delayms(unsigned int xms);     


#endif






time.c

#include"time.h"


void delayms(unsigned int xms)     
{
  unsigned int i,j;   
   for(i=xms;i>0;i--)        //i=xms即延時約xms毫秒   
   for(j=60;j>0;j--);
}   


void delayus(unsigned char itemp)
{
        while(--itemp) ;
}






ds3231.c
#include <STC89C5xRC.H>
#include "display.h"
#include "ds3231.h"
#include "keymark.h"
#include "nongli.h"
#include "time.h"
#include "Port.h"
#include "config.h"        
#include <intrins.h>                          



bit  ack;          //應(yīng)答標(biāo)志位




uchar Decimal2BCD(uchar val);    //二進制(Decimal)數(shù)轉(zhuǎn)換為BCD碼
void Start_I2C();                        //I2C起始信號
void Stop_I2C();                        //I2C結(jié)束信號
void SendByte(uchar c);                                           //發(fā)送字節(jié)數(shù)據(jù)
uchar RcvByte();                                   //接收字節(jié)數(shù)據(jù)
void Ack_I2C(bit a);                        //應(yīng)答信號
uchar write_byte(uchar addr, uchar write_data);                         //寫入DS3231地址的數(shù)據(jù)
uchar read_random(uchar random_addr);                                   //讀回DS3231地址的數(shù)據(jù)
void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar wee);
void InitDS3231 (); //初始化DS3231





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

uchar Decimal2BCD(uchar val)    //二進制(Decimal)數(shù)轉(zhuǎn)換為BCD碼
{
    uchar i,j,k;
        i=val/10;
        i=i<<4;
        j=val%10;
        k=i|j;
    return k;
}

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


/************************START***************************/
void Start_I2C()
{
    SDA=1;                  //發(fā)送起始條件的數(shù)據(jù)信號
    _nop_();
    SCL=1;
    _nop_();
        _nop_();
        _nop_();
        _nop_();             //起始條件建立時間大于4.7us,延時
           _nop_();
    SDA=0;                  //發(fā)送起始信號
    _nop_();
        _nop_();
        _nop_();
        _nop_();            
           _nop_();             // 起始條件鎖定時間大于4μs
      
    SCL=0;                  //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
    _nop_();
        _nop_();

}
/********************************************************/
/************************STOP****************************/
void Stop_I2C()
{
    SDA=0;                  //發(fā)送結(jié)束條件的數(shù)據(jù)信號
        _nop_();             //發(fā)送結(jié)束條件的時鐘信號
    SCL=1;                  //結(jié)束條件建立時間大于4us
        _nop_();
        _nop_();
        _nop_();
    _nop_();
        _nop_();
   
    SDA=1;                  //發(fā)送I2C總線結(jié)束信號
    _nop_();
        _nop_();
        _nop_();
        _nop_();
    _nop_();
}
/********************************************************/
/*******************************************************************
                  字節(jié)數(shù)據(jù)發(fā)送函數(shù)               
函數(shù)原型:     void   SendByte(uint8 Dat);
功能:      將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
           此狀態(tài)位進行操作.(不應(yīng)答或非應(yīng)答都使ack=0)
           ack=1        發(fā)送數(shù)據(jù)正常,
           ack=0        被控器無應(yīng)答或損壞。
********************************************************************/
void SendByte(uchar c)
{
uchar BitCnt;
   
    for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數(shù)據(jù)長度為8位
    {
        if((c<<BitCnt)&0x80)
            SDA=1;                          //判斷發(fā)送位
        else
            SDA=0;               
           _nop_();
          SCL=1;                            //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
                    _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();                       //保證時鐘高電平周期大于4μs   
          SCL=0;
             _nop_();
    }
   
        _nop_();
    SDA=1;                                  //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
    _nop_();
        _nop_();  
    SCL=1;
    _nop_();
        _nop_();
        _nop_();
    _nop_();
    _nop_();
    if(SDA==1)
        ack=0;   
    else
        ack=1;                              //判斷是否接收到應(yīng)答信號
    SCL=0;
    _nop_();
        _nop_();
        
}
/********************************************************/
/*******************************************************************
                  字節(jié)數(shù)據(jù)接收函數(shù)               
函數(shù)原型:     uint8   RcvByte();
功能:      用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
           發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機。  
********************************************************************/
uchar RcvByte()                                           //接收字節(jié)數(shù)據(jù)
{
   uchar retc;
   uchar BitCnt;

   retc=0;
   SDA=1;                           //置數(shù)據(jù)線為輸入方式
   for(BitCnt=0;BitCnt<8;BitCnt++)
   {
        _nop_();
        SCL=0;                      //置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位
                _nop_();
                _nop_();
            _nop_();
                _nop_();
                _nop_();                //時鐘低電平周期大于4.7μs
      
        SCL=1;                      //置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
    _nop_();
        _nop_();
        _nop_();
        retc=retc<<1;
        if(SDA==1)
            retc=retc+1;            //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
    _nop_();
        _nop_();
   }
   SCL=0;
    _nop_();
        _nop_();
   return(retc);
}
/********************************************************************
                      應(yīng)答子函數(shù)
函數(shù)原型:   void I2CACK(bit a);
功能:       主控器進行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
********************************************************************/
void Ack_I2C(bit a)                        //應(yīng)答信號
{

    if(a==0)
        SDA=0;              //在此發(fā)出應(yīng)答或非應(yīng)答信號
    else
        SDA=1;
    _nop_();
        _nop_();
        _nop_();     
    SCL=1;
   
    _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();             //時鐘低電平周期大于4μs
   
    SCL=0;                  //清時鐘線,鉗住I2C總線以便繼續(xù)接收
    _nop_();
        _nop_();
}
/****************************************************/
/***********將一個字節(jié)寫入DS3231指定的地址***********/
uchar write_byte(uchar addr, uchar write_data)                         //寫入DS3231地址的數(shù)據(jù)
{
        Start_I2C();
    SendByte(0xd0);
    if (ack == 0)
        return 0;
   
    SendByte(addr);   
    if (ack == 0)
        return 0;
   
    SendByte(write_data);
    if (ack == 0)
        return 0;
    Stop_I2C();
    _nop_();
        _nop_();
        _nop_();
    _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();      
    return 1;
}


/****************************************************/
/************從DS3231當(dāng)前地址讀一個字節(jié)************
uchar I2CRead()
{
uchar read_data;

    Start_I2C();
    SendByte(0xd1);
    if(ack==0)
                return 0;
                  
    read_data = RcvByte();
    Ack_I2C(1);
    Stop_I2C();
    return read_data;
}

****************************************************/
/************從DS3231指定地址讀一個字節(jié)************/
uchar read_random(uchar random_addr)                                           //讀回DS3231地址的數(shù)據(jù)
{
uchar read_data;                                                  //DS3231讀數(shù)據(jù)必須先寫入要讀的數(shù)據(jù)地址,再重新發(fā)送開始信號再讀取當(dāng)前地址數(shù)據(jù),
    Start_I2C();                                                  //這個問題沒注意,搞了好一陣子,連芯片都更換了都沒用,后來仔細研究了網(wǎng)
    SendByte(0xd0);                                                  //上的程序思路才搞明白這么回事!
    if(ack==0)
                return 0;
                  
    SendByte(random_addr);
    if(ack==0)
                return 0;

    Start_I2C();
    SendByte(0xd1);
    if(ack==0)
                return 0;
                  
    read_data = RcvByte();
    Ack_I2C(1);
    Stop_I2C();
    return read_data;
}



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




void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar wee)
{
    uchar temp=0;
   
    temp=Decimal2BCD(yea);
    write_byte(DS3231_YEAR,temp);   //修改年
   
    temp=Decimal2BCD(mon);
    write_byte(DS3231_MONTH,temp);  //修改月
   
    temp=Decimal2BCD(da);
    write_byte(DS3231_DAY,temp);    //修改日
   
    temp=Decimal2BCD(hou);
    write_byte(DS3231_HOUR,temp);   //修改時
   
    temp=Decimal2BCD(min);
    write_byte(DS3231_MINUTE,temp); //修改分
   
    temp=Decimal2BCD(sec);
    write_byte(DS3231_SECOND,temp); //修改秒

        temp=Decimal2BCD(wee);
    write_byte(DS3231_WEEK,temp);   //修改星期
}


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



void InitDS3231 () //初始化DS3231
{
        SCL=1;
        delayus(5);
        SDA=1;
        delayus(5);
         
         write_byte(0x0b, 0x80);    //A2M2置位
         write_byte(0x0c,0x80);             //A2M3置位,
         write_byte(0x0d,0x80);             //A2M4置位,
         write_byte(0x0f,0x00);        //32KHZ輸出禁止,鬧鐘標(biāo)志位清零
         write_byte(0x0e,0x06);        //中斷允許,鬧鐘2打開鬧鐘1關(guān)閉 ,每分鐘#INT口輸出中斷


}

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


ds3231.h
/**************************************
**時鐘使用時鐘芯片DS3231SN  
**************************************/

#ifndef _DS3231_H_
#define _DS3231_H_
#include <STC89C5xRC.H>
#include <intrins.h>
#include "config.h"

#define DS3231_WriteAddress 0xd0    //器件寫地址
#define DS3231_ReadAddress  0xd1    //器件讀地址
#define DS3231_SECOND       0x00    //秒        
#define DS3231_MINUTE       0x01    //分
#define DS3231_HOUR         0x02    //時
#define DS3231_WEEK         0x03    //星期
#define DS3231_DAY          0x04    //日
#define DS3231_MONTH        0x05    //月
#define DS3231_YEAR         0x06    //年
            
#define DS3231_SALARM1ECOND 0x07    //秒
#define DS3231_ALARM1MINUTE 0x08    //分
#define DS3231_ALARM1HOUR   0x09    //時
#define DS3231_ALARM1WEEK   0x0a    //星期/日

#define DS3231_ALARM2MINUTE 0x0b    //分
#define DS3231_ALARM2HOUR   0x0c    //時
#define DS3231_ALARM2WEEK   0x0d    //星期/日
#define DS3231_CONTROL      0x0e    //控制寄存器
#define DS3231_STATUS       0x0f    //狀態(tài)寄存器
#define DS3231_XTAL         0x10    //晶體老化寄存器
#define DS3231_TEMPERATUREH 0x11    //溫度寄存器高字節(jié)(8位)
#define DS3231_TEMPERATUREL 0x12    //溫度寄存器低字節(jié)(高2位)

extern uchar Decimal2BCD(uchar val);    //二進制(Decimal)數(shù)轉(zhuǎn)換為BCD碼
extern void Start_I2C();
extern void Stop_I2C();
extern void SendByte(uchar c) ;
extern uchar RcvByte();
extern void Ack_I2C(bit a);
extern uchar write_byte(uchar addr, uchar write_data) ;
extern uchar read_random(uchar random_addr);
extern void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar wee);
extern void InitDS3231(); //初始化DS3231
#endif





nongli.c
#include "nongli.h"
#include <intrins.h>
#include "config.h"
#include "time.h"

//輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
idata bit c_moon,c_sun=0;//        c_sun=0為20xx,        c_sun=1為19xx
//uchar year_sun,month_sun,day_sun;
idata uchar year_moon,month_moon,day_moon;        // 轉(zhuǎn)換出的農(nóng)歷年 、月 、 日


         

///////////


//以下為程序的實現(xiàn)~~~~~,不用看了
//忘了是哪個網(wǎng)友的程序了,,,感謝ing
/*
公歷年對應(yīng)的農(nóng)歷數(shù)據(jù),每年三字節(jié),
格式第一字節(jié)BIT7-4 位表示閏月月份,值為0 為無閏月,BIT3-0 對應(yīng)農(nóng)歷第1-4 月的大小
第二字節(jié)BIT7-0 對應(yīng)農(nóng)歷第5-12 月大小,第三字節(jié)BIT7 表示農(nóng)歷第13 個月大小
月份對應(yīng)的位為1 表示本農(nóng)歷月大(30 天),為0 表示小(29 天)
第三字節(jié)BIT6-5 表示春節(jié)的公歷月份,BIT4-0 表示春節(jié)的公歷日期
*/
code uchar year_code[597]={
                    0x04,0xAe,0x53,    //1901 0
                    0x0A,0x57,0x48,    //1902 3
                    0x55,0x26,0xBd,    //1903 6
                    0x0d,0x26,0x50,    //1904 9
                    0x0d,0x95,0x44,    //1905 12
                    0x46,0xAA,0xB9,    //1906 15
                    0x05,0x6A,0x4d,    //1907 18
                    0x09,0xAd,0x42,    //1908 21
                    0x24,0xAe,0xB6,    //1909
                    0x04,0xAe,0x4A,    //1910
                    0x6A,0x4d,0xBe,    //1911
                    0x0A,0x4d,0x52,    //1912
                    0x0d,0x25,0x46,    //1913
                    0x5d,0x52,0xBA,    //1914
                    0x0B,0x54,0x4e,    //1915
                    0x0d,0x6A,0x43,    //1916
                    0x29,0x6d,0x37,    //1917
                    0x09,0x5B,0x4B,    //1918
                    0x74,0x9B,0xC1,    //1919
                    0x04,0x97,0x54,    //1920
                    0x0A,0x4B,0x48,    //1921
                    0x5B,0x25,0xBC,    //1922
                    0x06,0xA5,0x50,    //1923
                    0x06,0xd4,0x45,    //1924
                    0x4A,0xdA,0xB8,    //1925
                    0x02,0xB6,0x4d,    //1926
                    0x09,0x57,0x42,    //1927
                    0x24,0x97,0xB7,    //1928
                    0x04,0x97,0x4A,    //1929
                    0x66,0x4B,0x3e,    //1930
                    0x0d,0x4A,0x51,    //1931
                    0x0e,0xA5,0x46,    //1932
                    0x56,0xd4,0xBA,    //1933
                    0x05,0xAd,0x4e,    //1934
                    0x02,0xB6,0x44,    //1935
                    0x39,0x37,0x38,    //1936
                    0x09,0x2e,0x4B,    //1937
                    0x7C,0x96,0xBf,    //1938
                    0x0C,0x95,0x53,    //1939
                    0x0d,0x4A,0x48,    //1940
                    0x6d,0xA5,0x3B,    //1941
                    0x0B,0x55,0x4f,    //1942
                    0x05,0x6A,0x45,    //1943
                    0x4A,0xAd,0xB9,    //1944
                    0x02,0x5d,0x4d,    //1945
                    0x09,0x2d,0x42,    //1946
                    0x2C,0x95,0xB6,    //1947
                    0x0A,0x95,0x4A,    //1948
                    0x7B,0x4A,0xBd,    //1949
                    0x06,0xCA,0x51,    //1950
                    0x0B,0x55,0x46,    //1951
                    0x55,0x5A,0xBB,    //1952
                    0x04,0xdA,0x4e,    //1953
                    0x0A,0x5B,0x43,    //1954
                    0x35,0x2B,0xB8,    //1955
                    0x05,0x2B,0x4C,    //1956
                    0x8A,0x95,0x3f,    //1957
                    0x0e,0x95,0x52,    //1958
                    0x06,0xAA,0x48,    //1959
                    0x7A,0xd5,0x3C,    //1960
                    0x0A,0xB5,0x4f,    //1961
                    0x04,0xB6,0x45,    //1962
                    0x4A,0x57,0x39,    //1963
                    0x0A,0x57,0x4d,    //1964
                    0x05,0x26,0x42,    //1965
                    0x3e,0x93,0x35,    //1966
                    0x0d,0x95,0x49,    //1967
                    0x75,0xAA,0xBe,    //1968
                    0x05,0x6A,0x51,    //1969
                    0x09,0x6d,0x46,    //1970
                    0x54,0xAe,0xBB,    //1971
                    0x04,0xAd,0x4f,    //1972
                    0x0A,0x4d,0x43,    //1973
                    0x4d,0x26,0xB7,    //1974
                    0x0d,0x25,0x4B,    //1975
                    0x8d,0x52,0xBf,    //1976
                    0x0B,0x54,0x52,    //1977
                    0x0B,0x6A,0x47,    //1978
                    0x69,0x6d,0x3C,    //1979
                    0x09,0x5B,0x50,    //1980
                    0x04,0x9B,0x45,    //1981
                    0x4A,0x4B,0xB9,    //1982
                    0x0A,0x4B,0x4d,    //1983
                    0xAB,0x25,0xC2,    //1984
                    0x06,0xA5,0x54,    //1985
                    0x06,0xd4,0x49,    //1986
                    0x6A,0xdA,0x3d,    //1987
                    0x0A,0xB6,0x51,    //1988
                    0x09,0x37,0x46,    //1989
                    0x54,0x97,0xBB,    //1990
                    0x04,0x97,0x4f,    //1991
                    0x06,0x4B,0x44,    //1992
                    0x36,0xA5,0x37,    //1993
                    0x0e,0xA5,0x4A,    //1994
                    0x86,0xB2,0xBf,    //1995
                    0x05,0xAC,0x53,    //1996
                    0x0A,0xB6,0x47,    //1997
                    0x59,0x36,0xBC,    //1998
                    0x09,0x2e,0x50,    //1999 294
                    0x0C,0x96,0x45,    //2000 297
                    0x4d,0x4A,0xB8,    //2001
                    0x0d,0x4A,0x4C,    //2002
                    0x0d,0xA5,0x41,    //2003
                    0x25,0xAA,0xB6,    //2004
                    0x05,0x6A,0x49,    //2005
                    0x7A,0xAd,0xBd,    //2006
                    0x02,0x5d,0x52,    //2007
                    0x09,0x2d,0x47,    //2008
                    0x5C,0x95,0xBA,    //2009
                    0x0A,0x95,0x4e,    //2010
                    0x0B,0x4A,0x43,    //2011
                    0x4B,0x55,0x37,    //2012
                    0x0A,0xd5,0x4A,    //2013
                    0x95,0x5A,0xBf,    //2014
                    0x04,0xBA,0x53,    //2015
                    0x0A,0x5B,0x48,    //2016
                    0x65,0x2B,0xBC,    //2017
                    0x05,0x2B,0x50,    //2018
                    0x0A,0x93,0x45,    //2019
                    0x47,0x4A,0xB9,    //2020
                    0x06,0xAA,0x4C,    //2021
                    0x0A,0xd5,0x41,    //2022
                    0x24,0xdA,0xB6,    //2023
                    0x04,0xB6,0x4A,    //2024
                    0x69,0x57,0x3d,    //2025
                    0x0A,0x4e,0x51,    //2026
                    0x0d,0x26,0x46,    //2027
                    0x5e,0x93,0x3A,    //2028
                    0x0d,0x53,0x4d,    //2029
                    0x05,0xAA,0x43,    //2030
                    0x36,0xB5,0x37,    //2031
                    0x09,0x6d,0x4B,    //2032
                    0xB4,0xAe,0xBf,    //2033
                    0x04,0xAd,0x53,    //2034
                    0x0A,0x4d,0x48,    //2035
                    0x6d,0x25,0xBC,    //2036
                    0x0d,0x25,0x4f,    //2037
                    0x0d,0x52,0x44,    //2038
                    0x5d,0xAA,0x38,    //2039
                    0x0B,0x5A,0x4C,    //2040
                    0x05,0x6d,0x41,    //2041
                    0x24,0xAd,0xB6,    //2042
                    0x04,0x9B,0x4A,    //2043
                    0x7A,0x4B,0xBe,    //2044
                    0x0A,0x4B,0x51,    //2045
                    0x0A,0xA5,0x46,    //2046
                    0x5B,0x52,0xBA,    //2047
                    0x06,0xd2,0x4e,    //2048
                    0x0A,0xdA,0x42,    //2049
                    0x35,0x5B,0x37,    //2050
                    0x09,0x37,0x4B,    //2051
                    0x84,0x97,0xC1,    //2052
                    0x04,0x97,0x53,    //2053
                    0x06,0x4B,0x48,    //2054
                    0x66,0xA5,0x3C,    //2055
                    0x0e,0xA5,0x4f,    //2056
                    0x06,0xB2,0x44,    //2057
                    0x4A,0xB6,0x38,    //2058
                    0x0A,0xAe,0x4C,    //2059
                    0x09,0x2e,0x42,    //2060
                    0x3C,0x97,0x35,    //2061
                    0x0C,0x96,0x49,    //2062
                    0x7d,0x4A,0xBd,    //2063
                    0x0d,0x4A,0x51,    //2064
                    0x0d,0xA5,0x45,    //2065
                    0x55,0xAA,0xBA,    //2066
                    0x05,0x6A,0x4e,    //2067
                    0x0A,0x6d,0x43,    //2068
                    0x45,0x2e,0xB7,    //2069
                    0x05,0x2d,0x4B,    //2070
                    0x8A,0x95,0xBf,    //2071
                    0x0A,0x95,0x53,    //2072
                    0x0B,0x4A,0x47,    //2073
                    0x6B,0x55,0x3B,    //2074
                    0x0A,0xd5,0x4f,    //2075
                    0x05,0x5A,0x45,    //2076
                    0x4A,0x5d,0x38,    //2077
                    0x0A,0x5B,0x4C,    //2078
                    0x05,0x2B,0x42,    //2079
                    0x3A,0x93,0xB6,    //2080
                    0x06,0x93,0x49,    //2081
                    0x77,0x29,0xBd,    //2082
                    0x06,0xAA,0x51,    //2083
                    0x0A,0xd5,0x46,    //2084
                    0x54,0xdA,0xBA,    //2085
                    0x04,0xB6,0x4e,    //2086
                    0x0A,0x57,0x43,    //2087
                    0x45,0x27,0x38,    //2088
                    0x0d,0x26,0x4A,    //2089
                    0x8e,0x93,0x3e,    //2090
                    0x0d,0x52,0x52,    //2091
                    0x0d,0xAA,0x47,    //2092
                    0x66,0xB5,0x3B,    //2093
                    0x05,0x6d,0x4f,    //2094
                    0x04,0xAe,0x45,    //2095
                    0x4A,0x4e,0xB9,    //2096
                    0x0A,0x4d,0x4C,    //2097
                    0x0d,0x15,0x41,    //2098
                    0x2d,0x92,0xB5,    //2099
};
///月份數(shù)據(jù)表
code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
code uint  day_code2[3]={0x111,0x130,0x14e};

/*子函數(shù),用于讀取數(shù)據(jù)表中農(nóng)歷月的大月或小月,如果該月為大返回1,為小返回0*/
bit get_moon_day(uchar month_p,uint table_addr)
{
        uchar temp;
    switch(month_p)
        {
        case 1 :temp=year_code[table_addr  ]&0x08;break;
        case 2 :temp=year_code[table_addr  ]&0x04;break;
        case 3 :temp=year_code[table_addr  ]&0x02;break;
        case 4 :temp=year_code[table_addr  ]&0x01;break;
        case 5 :temp=year_code[table_addr+1]&0x80;break;
        case 6 :temp=year_code[table_addr+1]&0x40;break;
        case 7 :temp=year_code[table_addr+1]&0x20;break;
        case 8 :temp=year_code[table_addr+1]&0x10;break;
        case 9 :temp=year_code[table_addr+1]&0x08;break;
        case 10:temp=year_code[table_addr+1]&0x04;break;
        case 11:temp=year_code[table_addr+1]&0x02;break;
        case 12:temp=year_code[table_addr+1]&0x01;break;
        case 13:temp=year_code[table_addr+2]&0x80;break;
            
    }
        if(temp==0)
                return 0;
        else
                return 1;
}


//公歷與農(nóng)歷轉(zhuǎn)換子函數(shù)
//函數(shù)功能:輸入BCD陽歷數(shù)據(jù),輸出BCD陰歷數(shù)據(jù)(只允許1901-2099年)        
//調(diào)用函數(shù)后,原有數(shù)據(jù)不變,讀c_moon,year_moon,month_moon,day_moon得出陰歷BCD數(shù)據(jù)


void Conversion(bit sj,uchar year,uchar month,uchar day)
{                         //sj=0 為21世紀(jì),sj=1 為20世紀(jì) 輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
    uchar temp1,temp2,temp3,month_p;
    uint temp4,table_addr;
    bit flag2,flag_y;
    temp1=year/16;   //BCD->hex 先把數(shù)據(jù)轉(zhuǎn)換為十六進制
    temp2=year%16;
    year=temp1*10+temp2;
    temp1=month/16;
    temp2=month%16;
    month=temp1*10+temp2;
    temp1=day/16;
    temp2=day%16;
    day=temp1*10+temp2;
    //定位數(shù)據(jù)表地址
    if(sj==0)
        {                  
        table_addr=(year+0x64-1)*0x3;
    }
    else
    {
        table_addr=(year-1)*0x3;
    }
    //定位數(shù)據(jù)表地址完成
    //取當(dāng)年春節(jié)所在的公歷月份
    temp1=year_code[table_addr+2]&0x60;
    temp1=_cror_(temp1,5);
    //取當(dāng)年春節(jié)所在的公歷月份完成
    //取當(dāng)年春節(jié)所在的公歷日
    temp2=year_code[table_addr+2]&0x1f;
    //取當(dāng)年春節(jié)所在的公歷日完成
    // 計算當(dāng)年春年離當(dāng)年元旦的天數(shù),春節(jié)只會在公歷1月或2月
    if(temp1==0x1){  
        temp3=temp2-1;  
    }  
    else{
        temp3=temp2+0x1f-1;        
    }
    //計算當(dāng)年春年離當(dāng)年元旦的天數(shù)完成
    //計算公歷日離當(dāng)年元旦的天數(shù),為了減少運算,用了兩個表
    //day_code1[9],day_code2[3]
    //如果公歷月在九月或前,天數(shù)會少于0xff,用表day_code1[9],
    //在九月后,天數(shù)大于0xff,用表day_code2[3]
    //如輸入公歷日為8月10日,則公歷日離元旦天數(shù)為day_code1[8-1]+10-1
    //如輸入公歷日為11月10日,則公歷日離元旦天數(shù)為day_code2[11-10]+10-1
    if (month<10){
        temp4=day_code1[month-1]+day-1;
    }
    else{
        temp4=day_code2[month-10]+day-1;
    }
    if ((month>0x2)&&(year%0x4==0)){  //如果公歷月大于2月并且該年的2月為閏月,天數(shù)加1
        temp4+=1;
    }
    //計算公歷日離當(dāng)年元旦的天數(shù)完成
    //判斷公歷日在春節(jié)前還是春節(jié)后
    if (temp4>=temp3){ //公歷日在春節(jié)后或就是春節(jié)當(dāng)日使用下面代碼進行運算
        temp4-=temp3;
        month=0x1;
        month_p=0x1;  //month_p為月份指向,公歷日在春節(jié)前或就是春節(jié)當(dāng)日month_p指向首月
        flag2=get_moon_day(month_p,table_addr); //檢查該農(nóng)歷月為大小還是小月,大月返回1,小月返回0
        flag_y=0;
        if(flag2==0)temp1=0x1d; //小月29天
        else temp1=0x1e; //大小30天
        temp2=year_code[table_addr]&0xf0;
        temp2=_cror_(temp2,4);  //從數(shù)據(jù)表中取該年的閏月月份,如為0則該年無閏月
        while(temp4>=temp1){
            temp4-=temp1;
            month_p+=1;
            if(month==temp2){
            flag_y=~flag_y;
            if(flag_y==0)month+=1;
            }
            else month+=1;
            flag2=get_moon_day(month_p,table_addr);
            if(flag2==0)temp1=0x1d;
            else temp1=0x1e;
        }
        day=temp4+1;
    }
    else{  //公歷日在春節(jié)前使用下面代碼進行運算
        temp3-=temp4;
        if (year==0x0){year=0x63;sj=1;}
        else year-=1;
        table_addr-=0x3;
        month=0xc;
        temp2=year_code[table_addr]&0xf0;
        temp2=_cror_(temp2,4);
        if (temp2==0)month_p=0xc;
        else month_p=0xd; //
        
   //month_p為月份指向,如果當(dāng)年有閏月,一年有十三個月,月指向13,無閏月指向12
        
        flag_y=0;
        flag2=get_moon_day(month_p,table_addr);
        if(flag2==0)temp1=0x1d;
        else temp1=0x1e;
        while(temp3>temp1){
            temp3-=temp1;
            month_p-=1;
            if(flag_y==0)month-=1;
            if(month==temp2)flag_y=~flag_y;
            flag2=get_moon_day(month_p,table_addr);
            if(flag2==0)temp1=0x1d;
            else temp1=0x1e;
         }
        day=temp1-temp3+1;
    }
    c_moon=sj;                 //HEX->BCD ,運算結(jié)束后,把數(shù)據(jù)轉(zhuǎn)換為BCD數(shù)據(jù)
    temp1=year/10;
    temp1=_crol_(temp1,4);
    temp2=year%10;
    year_moon=temp1|temp2;                        //得到y(tǒng)ear_moon 的農(nóng)歷年
    temp1=month/10;
    temp1=_crol_(temp1,4);
    temp2=month%10;
    month_moon=temp1|temp2;                         //得到month_moon 的農(nóng)歷月
    temp1=day/10;
    temp1=_crol_(temp1,4);
    temp2=day%10;
    day_moon=temp1|temp2;                        //得到day_moon 的農(nóng)歷日
}



nongli.h
#ifndef _NONGLI_H_
#define _NONGLI_H_

#include "config.h"

//extern uchar year_sun,month_sun,day_sun;//輸入公歷年,月,日數(shù)據(jù)
extern idata  uchar year_moon,month_moon,day_moon;//輸出 陰歷 年,月,日數(shù)據(jù)

extern void   Conversion(bit sj,uchar year,uchar month,uchar day);
//uchar Conver_week(bit sj,uchar year,uchar month,uchar day);

#endif



display.h
/**************************************
**顯示電路使用串行IC74HC595D  
**************************************/



#ifndef __DISPLAY_H__
#define __DISPLAY_H__
#include "config.h"

extern uchar    Ytemp;              //接收的年
extern uchar    Montemp;     //接收的月
extern uchar    Dtemp;       //接收的日
extern uchar    Htemp;       //接收的時 24小時制                  
extern uchar    Mintemp;     //接收的分
extern uchar    weektemp;    //接收的星期
extern uchar    tempertemp;  //接收的溫度

extern uchar Ftemper;
extern uchar yearshi;
extern uchar monthshi;
extern uchar dateshi;
extern uchar hourshi;
extern uchar minshi;
extern uchar nonglimonthshi;
extern uchar nonglidateshi;
extern uchar tempershi;
extern uchar yearge;
extern uchar monthge;
extern uchar datege;
extern uchar hourge;
extern uchar minge;
extern uchar nonglimonthge;
extern uchar nonglidatege;
extern uchar temperge;
extern uchar week_code;
extern uchar con_nonglidate;
extern uchar con_nonglimonth;

extern uchar code dis_code[10];     // 0,1,2,3,4,5,6,7,8,9
extern uchar code dis_week[8];             //星期:   日 一 二 三 四 五 六 日
extern uchar code disp_code[10];    // 0,1,2,3,4,5,6,7,8,9

extern void yeardisplay_code (void);                                                //年顯示碼
extern void monthdisplay_code (void);                                                //月顯示碼
extern void datedisplay_code (void);                                                //日顯示碼
extern void hourdisplay_code (void);                                                //小時顯示碼
extern void minutedisplay_code (void);                                                //分鐘顯示碼
extern void weekdisplay_code (void);                                                //星期顯示碼
extern void temperdisplay_code (void);                                                //溫度顯示碼
extern void nonglidisplay_code (void);                                                //農(nóng)歷月日顯示碼

extern void DisplayInit(void);
extern void Display (void);
extern void nongli_Display(void);
extern void ge_shidisplay_code(void);
extern void nianshi_set_dis (uchar cut);                //年十位顯示閃爍
extern void niange_set_dis (uchar cut);                        //年個位顯示閃爍
extern void month_set_dis (uchar cut);                        //月顯示閃爍
extern void dateshi_set_dis (uchar cut);                //日十位顯示閃爍
extern void datege_set_dis (uchar cut);                        //日個位顯示閃爍
extern void hour_set_dis (uchar cut);                        //時顯示閃爍
extern void minshi_set_dis (uchar cut);                        //分十位顯示閃爍
extern void minge_set_dis (uchar cut);                        //分個位顯示閃爍
extern void week_set_dis (uchar cut);                        //星期顯示閃爍


#endif





display.c
/**************************************
**顯示電路使用串行IC74HC595D  
**************************************/

#include <STC89C5xRC.H>
#include "display.h"
#include "ds3231.h"
#include "keymark.h"
#include "nongli.h"
#include "time.h"
#include "Port.h"
#include "config.h"


uchar    Ytemp;           //接收的年
uchar    Montemp;     //接收的月
uchar    Dtemp;       //接收的日
uchar    Htemp;       //接收的時 24小時制                  
uchar    Mintemp;     //接收的分
uchar    weektemp;     //接收的星期
uchar    tempertemp;   //接收的溫度

uchar Ftemper;
uchar yearshi;
uchar monthshi;
uchar dateshi;
uchar hourshi;
uchar minshi;
uchar nonglimonthshi;
uchar nonglidateshi;
uchar tempershi;
uchar yearge;
uchar monthge;
uchar datege;
uchar hourge;
uchar minge;
uchar nonglimonthge;
uchar nonglidatege;
uchar temperge;
uchar week_code;
uchar con_nonglidate;
uchar con_nonglimonth;



uchar code dis_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};   // 0,1,2,3,4,5,6,7,8,9
uchar code dis_week[8]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x80};         //星期:   0 一 二 三 四 五 六 日
uchar code disp_code[10]={0xff,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};   // 0,1,2,3,4,5,6,7,8,9


void DisplayInit(void);                        //74HC595  串口線初始化
void HC595nianSend (uchar Sendval);           //年月日數(shù)據(jù)發(fā)送
void HC595timeSend (uchar Sendval);                //時間數(shù)據(jù)發(fā)送
void HC595temperSend (uchar Sendval);          // 星期溫度數(shù)據(jù)發(fā)送
void HC595nongliSend (uchar Sendval);        // 農(nóng)歷月日數(shù)據(jù)發(fā)送
void HC595nianshow (void);                                // 年數(shù)據(jù)顯示
void HC595timeshow (void);                          // 時間顯示
void HC595tempershow (void);                         //        星期溫度顯示
void HC595nonglishow (void)        ;                 //        農(nóng)歷月日顯示
void Display (void)        ;                //年、月、日、時間、星期、溫度動態(tài)掃描顯示函數(shù)
void nongli_Display(void);                          //農(nóng)歷月、日靜態(tài)顯示函數(shù)
void ge_shidisplay_code(void);                 //個位十位顯示碼
void offnianshi_dis (void);                        //年十位顯示關(guān)
void offniange_dis (void);                  //年個位顯示關(guān)
void offmonth_dis (void);                        //月顯示關(guān)
void offdateshi_dis (void);                   //日十位顯示關(guān)
void offdatege_dis (void);                         //日個位顯示關(guān)
void offhour_dis (void)        ;                 //時顯示關(guān)
void offminshi_dis (void);                        //分鐘十位顯示關(guān)
void offminge_dis (void);          //分鐘個位顯示關(guān)
void offweek_dis (void);                   //星期顯示關(guān)
void nianshi_set_dis (uchar cut);                        //年十位顯示閃爍
void niange_set_dis (uchar cut);                        //年個位顯示閃爍
void month_set_dis (uchar cut);                        //月顯示閃爍
void dateshi_set_dis (uchar cut);                        //日十位顯示閃爍
void datege_set_dis (uchar cut)        ;                //日個位顯示閃爍
void hour_set_dis (uchar cut)        ;                //時顯示閃爍
void minshi_set_dis (uchar cut)        ;                //分十位顯示閃爍
void minge_set_dis (uchar cut)        ;                //分個位顯示閃爍
void week_set_dis (uchar cut)        ;                //星期顯示閃爍

void yeardisplay_code (void);                                                //年顯示碼
void monthdisplay_code (void);                                                //月顯示碼
void datedisplay_code (void);                                                //日顯示碼
void hourdisplay_code (void);                                                //小時顯示碼
void minutedisplay_code (void);                                                //分鐘顯示碼
void weekdisplay_code (void);                                                //星期顯示碼
void temperdisplay_code (void);                                                //溫度顯示碼
void nonglidisplay_code (void);                                                //農(nóng)歷月日顯示碼


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


void DisplayInit(void)                        //74HC595  串口線初始化
{
         SCK_nian_HC595   = 0;
         RCK_nian_HC595   = 0;
         SCK_time_HC595   = 0;
         RCK_time_HC595    =0;
         SCK_temper_HC595 = 0;
         RCK_temper_HC595 = 0;
         SCK_nongli_HC595 = 0;
         RCK_nongli_HC595 = 0;
}



void HC595nianSend (uchar Sendval)           //年月日數(shù)據(jù)發(fā)送
{
        uchar i,j=Sendval;
        for(i=0;i<8;i++)
        {
                SCK_nian_HC595=0;
                SI_nian_HC595=(j&0x80)?1:0;
                SCK_nian_HC595=1;
                j<<=1;
        }
        SCK_nian_HC595=0;
}


void HC595timeSend (uchar Sendval)                //時間數(shù)據(jù)發(fā)送
{
        uchar i,j=Sendval;
        for(i=0;i<8;i++)
        {
                SCK_time_HC595=0;
                SI_time_HC595=(j&0x80)?1:0;
                SCK_time_HC595=1;
                j<<=1;
        }
        SCK_time_HC595=0;
}

  void HC595temperSend (uchar Sendval)          // 星期溫度數(shù)據(jù)發(fā)送
{
        uchar i,j=Sendval;
        for(i=0;i<8;i++)
        {
                SCK_temper_HC595=0;
                SI_temper_HC595=(j&0x80)?1:0;
                SCK_temper_HC595=1;
                j<<=1;
        }
        SCK_temper_HC595=0;
}


void HC595nongliSend (uchar Sendval)        // 農(nóng)歷月日數(shù)據(jù)發(fā)送
{
        uchar i,j=Sendval;
        for(i=0;i<8;i++)
        {
                SCK_nongli_HC595=0;
                SI_nongli_HC595=(j&0x80)?1:0;
                SCK_nongli_HC595=1;
                j<<=1;
        }
        SCK_nongli_HC595=0;
}




void HC595nianshow (void)                                // 年數(shù)據(jù)顯示
{
        RCK_nian_HC595=0;
        delayus(1);
        RCK_nian_HC595=1;
    delayus(1);
        RCK_nian_HC595=0;
}


void HC595timeshow (void)                          // 時間顯示
{
        RCK_time_HC595=0;
        delayus(1);
        RCK_time_HC595=1;
    delayus(1);
        RCK_time_HC595=0;
}



void HC595tempershow (void)                         //        星期溫度顯示
{
        RCK_temper_HC595=0;
        delayus(1);
        RCK_temper_HC595=1;
    delayus(1);
        RCK_temper_HC595=0;
}


void HC595nonglishow (void)                         //        農(nóng)歷月日顯示
{
        RCK_nongli_HC595=0;
        delayus(1);
        RCK_nongli_HC595=1;
    delayus(1);
        RCK_nongli_HC595=0;
}


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


   void Display (void)                        //年、月、日、時間、星期、溫度動態(tài)掃描顯示函數(shù)
{
     HC595nianSend (0x88);
         HC595nianSend (monthshi);
         HC595nianSend (0xa4);
         HC595timeSend (0x80);
         HC595timeSend (hourshi);
         HC595temperSend (0x80);
         HC595temperSend (week_code);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x44);
         HC595nianSend (monthge);
         HC595nianSend (0xc0);
         HC595timeSend (0x40);
         HC595timeSend (hourge);
         HC595temperSend (0x40);
         HC595temperSend (Ftemper);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x22);
         HC595nianSend (dateshi);
         HC595nianSend (yearshi);
         HC595timeSend (0x20);
         HC595timeSend (minshi);
         HC595temperSend (0x20);
         HC595temperSend (tempershi);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);



         
         HC595nianSend (0x11);
         HC595nianSend (datege);
         HC595nianSend (yearge);
         HC595timeSend (0x10);
         HC595timeSend (minge);
         HC595temperSend (0x10);
         HC595temperSend (temperge);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(5);

}



void nongli_Display(void)                          //農(nóng)歷月、日靜態(tài)顯示函數(shù)
{        
//        ge_shidisplay_code ();
        HC595nongliSend  (nonglidatege);        
    HC595nongliSend  (nonglidateshi);        
    HC595nongliSend  (nonglimonthge);        
    HC595nongliSend  (nonglimonthshi);
        HC595nonglishow();
         _nop_();
         _nop_();      
}


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


void ge_shidisplay_code (void)                                                //個位十位顯示碼
{
        yeardisplay_code ();                                                //年顯示碼
        monthdisplay_code ();                                                //月顯示碼
        datedisplay_code ();                                                //日顯示碼
        hourdisplay_code ();                                                //小時顯示碼
        minutedisplay_code ();                                                //分鐘顯示碼
        weekdisplay_code ();                                                //星期顯示碼
        temperdisplay_code ();                                                //溫度顯示碼
        nonglidisplay_code ();                                                //農(nóng)歷月日顯示碼
}



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

void yeardisplay_code (void)                                                //年顯示碼
{
        Ytemp=read_random(DS3231_YEAR);                 //接收的年
    yearge=dis_code[Ytemp&(0x0f)];                                      //年個
    yearshi=dis_code[Ytemp>>4];                                                   //年十
}

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

void monthdisplay_code (void)                                                //月顯示碼
{
        Montemp=(read_random(DS3231_MONTH))&(0x1f);         //接收的月
        monthge=dis_code[Montemp&(0x0f)];                                    //月個
        monthshi=disp_code[Montemp>>4];                                            //月十                                       
}


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

void datedisplay_code (void)                                                //日顯示碼
{
        Dtemp=(read_random(DS3231_DAY))&(0x3f);             //接收的日
        datege=dis_code[Dtemp&(0x0f)];                                            //日個
        dateshi=disp_code[Dtemp>>4];                                            //日十
}

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

void hourdisplay_code (void)                                                //小時顯示碼
{
        Htemp=(read_random(DS3231_HOUR))&(0x3f);            //接收的時 24小時制                  
        hourge=dis_code[Htemp&(0x0f)];                                            //小時個
    hourshi=disp_code[Htemp>>4];                                                //小時十
}



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


void minutedisplay_code (void)                                                //分鐘顯示碼
{
            Mintemp=(read_random(DS3231_MINUTE))&(0x7f);        //接收的分
        minge=dis_code[Mintemp&(0x0f)];                                            //分鐘個
                minshi=dis_code[Mintemp>>4];                                                //分鐘十
}



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


void weekdisplay_code (void)                                                //星期顯示碼
{
        weektemp=(read_random(DS3231_WEEK))&(0x0f);             //接收的星期
        week_code=dis_week[weektemp];                                            //星期
}



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


void temperdisplay_code (void)                                                //溫度顯示碼
{
        tempertemp = read_random(DS3231_TEMPERATUREH);           //接收的溫度    高字節(jié),不顯示小數(shù)部分               
    if (((tempertemp>>4)&(0x8))==0) temperge=dis_code[(tempertemp&(0x7f))%10];                 //溫度個
        else temperge=dis_code[((~(tempertemp-1))&(0x7f))%10];
    if (((tempertemp>>4)&(0x8))==0) tempershi=disp_code[((tempertemp&(0x7f))/10)];         //溫度十
        else tempershi=disp_code[((~(tempertemp-1))&(0x7f))/10];               
        if (((tempertemp>>4)&(0x8))==1)  Ftemper=0xbf;                                                 //溫度符號
        else    Ftemper=0xff;
}



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



void nonglidisplay_code (void)                                                //農(nóng)歷月日顯示碼
{
        Conversion(0,Ytemp,Montemp,Dtemp);               //公歷與農(nóng)歷轉(zhuǎn)換子函數(shù)
        nonglimonthge=dis_code[month_moon&(0x0f)];                 //農(nóng)歷月份個
        nonglidatege=dis_code[day_moon&(0x0f)];                     //農(nóng)歷日個
    nonglimonthshi=disp_code[month_moon>>4];         //農(nóng)歷月十                              
    nonglidateshi=disp_code[day_moon>>4];                         //農(nóng)歷日十
}



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


void offnianshi_dis (void)                        //年十位顯示關(guān)
{
//          ge_shidisplay_code ();
     HC595nianSend (0x88);
         HC595nianSend (monthshi);
         HC595nianSend (0xa4);
         HC595timeSend (0x80);
         HC595timeSend (hourshi);
         HC595temperSend (0x80);
         HC595temperSend (week_code);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x44);
         HC595nianSend (monthge);
         HC595nianSend (0xc0);
         HC595timeSend (0x40);
         HC595timeSend (hourge);
         HC595temperSend (0x40);
         HC595temperSend (Ftemper);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x02);
         HC595nianSend (dateshi);
         HC595nianSend (yearshi);
         HC595timeSend (0x20);
         HC595timeSend (minshi);
         HC595temperSend (0x20);
         HC595temperSend (tempershi);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);



         
         HC595nianSend (0x11);
         HC595nianSend (datege);
         HC595nianSend (yearge);
         HC595timeSend (0x10);
         HC595timeSend (minge);
         HC595temperSend (0x10);
         HC595temperSend (temperge);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(5);

}



/*****************************************************/
void offniange_dis (void)                  //年個位顯示關(guān)
{
//           ge_shidisplay_code ();
     HC595nianSend (0x88);
         HC595nianSend (monthshi);
         HC595nianSend (0xa4);
         HC595timeSend (0x80);
         HC595timeSend (hourshi);
         HC595temperSend (0x80);
         HC595temperSend (week_code);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x44);
         HC595nianSend (monthge);
         HC595nianSend (0xc0);
         HC595timeSend (0x40);
         HC595timeSend (hourge);
         HC595temperSend (0x40);
         HC595temperSend (Ftemper);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x22);
         HC595nianSend (dateshi);
         HC595nianSend (yearshi);
         HC595timeSend (0x20);
         HC595timeSend (minshi);
         HC595temperSend (0x20);
         HC595temperSend (tempershi);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);



         
         HC595nianSend (0x01);
         HC595nianSend (datege);
         HC595nianSend (yearge);
         HC595timeSend (0x10);
         HC595timeSend (minge);
         HC595temperSend (0x10);
         HC595temperSend (temperge);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(5);

}

/*****************************************************/
void offmonth_dis (void)                        //月顯示關(guān)
{
//          ge_shidisplay_code ();
     HC595nianSend (0x80);
         HC595nianSend (monthshi);
         HC595nianSend (0xa4);
         HC595timeSend (0x80);
         HC595timeSend (hourshi);
         HC595temperSend (0x80);
         HC595temperSend (week_code);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x40);
         HC595nianSend (monthge);
         HC595nianSend (0xc0);
         HC595timeSend (0x40);
         HC595timeSend (hourge);
         HC595temperSend (0x40);
         HC595temperSend (Ftemper);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x22);
         HC595nianSend (dateshi);
         HC595nianSend (yearshi);
         HC595timeSend (0x20);
         HC595timeSend (minshi);
         HC595temperSend (0x20);
         HC595temperSend (tempershi);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);



         
         HC595nianSend (0x11);
         HC595nianSend (datege);
         HC595nianSend (yearge);
         HC595timeSend (0x10);
         HC595timeSend (minge);
         HC595temperSend (0x10);
         HC595temperSend (temperge);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(5);

}


/*****************************************************/
void offdateshi_dis (void)                   //日十位顯示關(guān)
{
//          ge_shidisplay_code ();
     HC595nianSend (0x88);
         HC595nianSend (monthshi);
         HC595nianSend (0xa4);
         HC595timeSend (0x80);
         HC595timeSend (hourshi);
         HC595temperSend (0x80);
         HC595temperSend (week_code);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x44);
         HC595nianSend (monthge);
         HC595nianSend (0xc0);
         HC595timeSend (0x40);
         HC595timeSend (hourge);
         HC595temperSend (0x40);
         HC595temperSend (Ftemper);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x20);
         HC595nianSend (dateshi);
         HC595nianSend (yearshi);
         HC595timeSend (0x20);
         HC595timeSend (minshi);
         HC595temperSend (0x20);
         HC595temperSend (tempershi);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);



         
         HC595nianSend (0x11);
         HC595nianSend (datege);
         HC595nianSend (yearge);
         HC595timeSend (0x10);
         HC595timeSend (minge);
         HC595temperSend (0x10);
         HC595temperSend (temperge);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(5);

}


/*****************************************************/
void offdatege_dis (void)                         //日個位顯示關(guān)
{
//          ge_shidisplay_code ();
     HC595nianSend (0x88);
         HC595nianSend (monthshi);
         HC595nianSend (0xa4);
         HC595timeSend (0x80);
         HC595timeSend (hourshi);
         HC595temperSend (0x80);
         HC595temperSend (week_code);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x44);
         HC595nianSend (monthge);
         HC595nianSend (0xc0);
         HC595timeSend (0x40);
         HC595timeSend (hourge);
         HC595temperSend (0x40);
         HC595temperSend (Ftemper);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x22);
         HC595nianSend (dateshi);
         HC595nianSend (yearshi);
         HC595timeSend (0x20);
         HC595timeSend (minshi);
         HC595temperSend (0x20);
         HC595temperSend (tempershi);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);



         
         HC595nianSend (0x10);
         HC595nianSend (datege);
         HC595nianSend (yearge);
         HC595timeSend (0x10);
         HC595timeSend (minge);
         HC595temperSend (0x10);
         HC595temperSend (temperge);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(5);

}


/*****************************************************/
void offhour_dis (void)                         //時顯示關(guān)
{
//          ge_shidisplay_code ();
     HC595nianSend (0x88);
         HC595nianSend (monthshi);
         HC595nianSend (0xa4);
         HC595timeSend (0x00);
         HC595timeSend (hourshi);
         HC595temperSend (0x80);
         HC595temperSend (week_code);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x44);
         HC595nianSend (monthge);
         HC595nianSend (0xc0);
         HC595timeSend (0x00);
         HC595timeSend (hourge);
         HC595temperSend (0x40);
         HC595temperSend (Ftemper);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x22);
         HC595nianSend (dateshi);
         HC595nianSend (yearshi);
         HC595timeSend (0x20);
         HC595timeSend (minshi);
         HC595temperSend (0x20);
         HC595temperSend (tempershi);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);



         
         HC595nianSend (0x11);
         HC595nianSend (datege);
         HC595nianSend (yearge);
         HC595timeSend (0x10);
         HC595timeSend (minge);
         HC595temperSend (0x10);
         HC595temperSend (temperge);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(5);

}


/*****************************************************/
void offminshi_dis (void)                        //分鐘十位顯示關(guān)
{
//           ge_shidisplay_code ();
     HC595nianSend (0x88);
         HC595nianSend (monthshi);
         HC595nianSend (0xa4);
         HC595timeSend (0x80);
         HC595timeSend (hourshi);
         HC595temperSend (0x80);
         HC595temperSend (week_code);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x44);
         HC595nianSend (monthge);
         HC595nianSend (0xc0);
         HC595timeSend (0x40);
         HC595timeSend (hourge);
         HC595temperSend (0x40);
         HC595temperSend (Ftemper);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x22);
         HC595nianSend (dateshi);
         HC595nianSend (yearshi);
         HC595timeSend (0x00);
         HC595timeSend (minshi);
         HC595temperSend (0x20);
         HC595temperSend (tempershi);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);



         
         HC595nianSend (0x11);
         HC595nianSend (datege);
         HC595nianSend (yearge);
         HC595timeSend (0x10);
         HC595timeSend (minge);
         HC595temperSend (0x10);
         HC595temperSend (temperge);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(5);

}


/*****************************************************/
void offminge_dis (void)          //分鐘個位顯示關(guān)
{
//     ge_shidisplay_code ();
         HC595nianSend (0x88);
         HC595nianSend (monthshi);
         HC595nianSend (0xa4);
         HC595timeSend (0x80);
         HC595timeSend (hourshi);
         HC595temperSend (0x80);
         HC595temperSend (week_code);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x44);
         HC595nianSend (monthge);
         HC595nianSend (0xc0);
         HC595timeSend (0x40);
         HC595timeSend (hourge);
         HC595temperSend (0x40);
         HC595temperSend (Ftemper);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x22);
         HC595nianSend (dateshi);
         HC595nianSend (yearshi);
         HC595timeSend (0x20);
         HC595timeSend (minshi);
         HC595temperSend (0x20);
         HC595temperSend (tempershi);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);



         
         HC595nianSend (0x11);
         HC595nianSend (datege);
         HC595nianSend (yearge);
         HC595timeSend (0x00);
         HC595timeSend (minge);
         HC595temperSend (0x10);
         HC595temperSend (temperge);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(5);

}


/*****************************************************/
void offweek_dis (void)                   //星期顯示關(guān)
{
//            ge_shidisplay_code ();
     HC595nianSend (0x88);
         HC595nianSend (monthshi);
         HC595nianSend (0xa4);
         HC595timeSend (0x80);
         HC595timeSend (hourshi);
         HC595temperSend (0x00);
         HC595temperSend (week_code);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x44);
         HC595nianSend (monthge);
         HC595nianSend (0xc0);
         HC595timeSend (0x40);
         HC595timeSend (hourge);
         HC595temperSend (0x40);
         HC595temperSend (Ftemper);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);

         HC595nianSend (0x22);
         HC595nianSend (dateshi);
         HC595nianSend (yearshi);
         HC595timeSend (0x20);
         HC595timeSend (minshi);
         HC595temperSend (0x20);
         HC595temperSend (tempershi);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(6);



         
         HC595nianSend (0x11);
         HC595nianSend (datege);
         HC595nianSend (yearge);
         HC595timeSend (0x10);
         HC595timeSend (minge);
         HC595temperSend (0x10);
         HC595temperSend (temperge);
         HC595nianshow();
         HC595timeshow();
         HC595tempershow();
         delayms(5);

}


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

void nianshi_set_dis (uchar cut)                        //年十位顯示閃爍
{
        uchar i;
        for (i=0;i<cut;i++)          offnianshi_dis ( ) ;
        for (i=0;i<(cut-30);i++)          Display ( ) ;        
}

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

void niange_set_dis (uchar cut)                        //年個位顯示閃爍
{
        uchar i;
        for (i=0;i<cut;i++)          offniange_dis ( ) ;
        for (i=0;i<(cut-30);i++)          Display ( ) ;        
}

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

void month_set_dis (uchar cut)                        //月顯示閃爍
{
        uchar i;
        for (i=0;i<cut;i++)          offmonth_dis ( ) ;
        for (i=0;i<(cut-30);i++)          Display ( ) ;        
}

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

void dateshi_set_dis (uchar cut)                        //日十位顯示閃爍
{
        uchar i;
        for (i=0;i<cut;i++)          offdateshi_dis ( ) ;
        for (i=0;i<(cut-30);i++)          Display ( ) ;        
}

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

void datege_set_dis (uchar cut)                        //日個位顯示閃爍
{
        uchar i;
        for (i=0;i<cut;i++)          offdatege_dis ( ) ;
        for (i=0;i<(cut-30);i++)          Display ( ) ;        
}

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

void hour_set_dis (uchar cut)                        //時顯示閃爍
{
        uchar i;
        for (i=0;i<cut;i++)          offhour_dis ( ) ;
        for (i=0;i<(cut-30);i++)          Display ( ) ;        
}

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

void minshi_set_dis (uchar cut)                        //分十位顯示閃爍
{
        uchar i;
        for (i=0;i<cut;i++)          offminshi_dis ( ) ;
        for (i=0;i<(cut-30);i++)          Display ( ) ;        
}

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

void minge_set_dis (uchar cut)                        //分個位顯示閃爍
{
        uchar i;
        for (i=0;i<cut;i++)          offminge_dis ( ) ;
        for (i=0;i<(cut-30);i++)          Display ( ) ;        
}

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

void week_set_dis (uchar cut)                        //星期顯示閃爍
{
        uchar i;
        for (i=0;i<cut;i++)          offweek_dis ( ) ;
        for (i=0;i<(cut-30);i++)          Display ( ) ;        
}

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


keymark.h
/***按鍵 管腳定義
**
*********************************************************/


#ifndef  __KEYMARK_H__
#define __KEYMARK_H__
#include "config.h"



extern uchar yeardis;
extern uchar monthdis;
extern uchar datedis;
extern uchar weekdis;
extern uchar hourdis;
extern uchar mindis;
extern uchar BCD2Hex(uchar val);
extern void  keyscan();

#endif




keymark.c
#include <STC89C5xRC.H>
#include "keymark.h"
#include "config.h"
#include "time.h"
#include "display.h"
#include "ds3231.h"
#include "Port.h"

uchar flag_set=0;
uchar yeardis;
uchar monthdis;
uchar datedis;
uchar weekdis;
uchar hourdis;
uchar mindis;


uchar BCD2Hex(uchar val)    //BCD碼轉(zhuǎn)換為十六進制(Hex)數(shù)
{
    uchar i,j,k;
        i=val/16;
        j=val%16;
        k=i*10+j;
    return k;
}

void  keyscan()
{                 
  sw1=1;sw2=1;
  Display ();
  Display ();
  Display ();
  Display ();
  Display ();
  Display ();
  Display ();
  Display ();

  if(sw1==0)
        {
         Display ();          //用顯示函數(shù)替代延時函數(shù)                                               
         if(sw1==0)
                {
                flag_set++;
                yeardis=BCD2Hex(read_random(DS3231_YEAR));                             //有鍵按下時重賦值,以更新數(shù)據(jù)
                monthdis=BCD2Hex(read_random(DS3231_MONTH)&(0x1f));
                datedis=BCD2Hex(read_random(DS3231_DAY)&(0x3f));
                hourdis=BCD2Hex(read_random(DS3231_HOUR)&(0x3f));
                mindis=BCD2Hex(read_random(DS3231_MINUTE)&(0x7f));
                weekdis=BCD2Hex(read_random(DS3231_WEEK)&(0x0f));
                }
        }
  while (flag_set)
    {
        switch (flag_set)
          {
          case 1: //nianshi_set_dis (50);
          if(sw2==0)
            {
                Display ();
            if(sw2==0)  yeardis+=10;
            }
          if (yeardis>99)  yeardis=0;
          write_byte(DS3231_YEAR,Decimal2BCD(yeardis));
          Ytemp=read_random(DS3231_YEAR);                  //接收的年
          yearshi=dis_code[Ytemp>>4];                                              //年十
          nianshi_set_dis (50);
          break;

          case 2:// niange_set_dis (50);
          if(sw2==0)
            {
                Display ();
            if(sw2==0)  yeardis+=1;
                }
          if (yeardis>99) yeardis=0;
          write_byte(DS3231_YEAR,Decimal2BCD(yeardis));
          yeardisplay_code ();                                                //年顯示碼
          niange_set_dis (50);
          break;

          case 3: //month_set_dis (50);
          if(sw2==0)
            {
                 Display ();
                 if(sw2==0)  monthdis+=1;
                }
          if (monthdis>12) monthdis=1;
          write_byte(DS3231_MONTH,Decimal2BCD(monthdis));
          monthdisplay_code ();                                                //月顯示碼
          month_set_dis (50);
          break;

          case 4: //dateshi_set_dis (50);
          if(sw2==0)
            {
                 Display ();
                 if(sw2==0)  datedis+=10;
                  }
          if (datedis>31) datedis=1;
          write_byte(DS3231_DAY,Decimal2BCD(datedis));
          Dtemp=(read_random(DS3231_DAY))&(0x3f);             //接收的日
          dateshi=disp_code[Dtemp>>4];                                            //日十
          dateshi_set_dis (50);                  
          break;

          case 5:// datege_set_dis (50);
          if(sw2==0)
            {
                Display ();
                if(sw2==0)  datedis+=1;
                }        
          if (datedis>31) datedis=1;
          write_byte(DS3231_DAY,Decimal2BCD(datedis));
          datedisplay_code ();                                                //日顯示碼
          datege_set_dis (50);                  
          break;

          case 6: //hour_set_dis (50);
          if(sw2==0)
            {
             Display ();
                 if(sw2==0)  hourdis+=1;
                }
          if (hourdis>23) hourdis=0;
          write_byte(DS3231_HOUR,Decimal2BCD(hourdis));
          hourdisplay_code ();                                                //小時顯示碼
          hour_set_dis (50);
          break;

          case 7:// minshi_set_dis (50);
          if(sw2==0)
            {
                Display ();
                if(sw2==0)  mindis+=10;
                }
          if (mindis>59) mindis=0;
          write_byte(DS3231_MINUTE,Decimal2BCD(mindis));
          Mintemp=(read_random(DS3231_MINUTE))&(0x7f);        //接收的分
          minshi=dis_code[Mintemp>>4];                                                  //分鐘十
          minshi_set_dis (50);
          break;

          case 8: //minge_set_dis (50);
          if(sw2==0)
            {
                Display ();
                if(sw2==0)  mindis+=1;
                }
          if (mindis>59) mindis=0;
          write_byte(DS3231_MINUTE,Decimal2BCD(mindis));
          write_byte(DS3231_SECOND,0x0);
          minutedisplay_code ();                          //分鐘顯示碼
          minge_set_dis (50);
          break;

          case 9:// week_set_dis (50);
          if(sw2==0)
                  {
             Display ();
                 if(sw2==0)  weekdis+=1;
                }
      if (weekdis>7) weekdis=1;
          write_byte(DS3231_WEEK,Decimal2BCD(weekdis));                           
          weekdisplay_code ();                                                //星期顯示碼
          week_set_dis (50);
          break;

          default :  break;
          }
         
        if(sw1==0)
          {
          Display ();          //用顯示函數(shù)替代延時函數(shù)                                               
          if(sw1==0)  flag_set++;
      }
        if(flag_set>9)
          {
          flag_set=0;
          ModifyTime(yeardis,monthdis,datedis,hourdis,mindis,0,weekdis);
          ge_shidisplay_code ();
          }
        Display ();
    }
  Display ();
  Display ();
  
  }






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

回復(fù)

使用道具 舉報

地板
ID:58628 發(fā)表于 2015-7-8 23:14 | 只看該作者
程序還是用附件上傳更清楚點,本人單片機自學(xué),還沒入門,還望各位指點!謝謝

ds3231_rili.zip

17.47 KB, 下載次數(shù): 62, 下載積分: 黑幣 -5

附上原程序

評分

參與人數(shù) 1威望 +50 黑幣 +50 收起 理由
admin + 50 + 50 共享資料的積分獎勵!

查看全部評分

回復(fù)

使用道具 舉報

5#
ID:58628 發(fā)表于 2015-7-9 20:01 | 只看該作者
admin 發(fā)表于 2015-7-7 23:36
樓主飛線好厲害!太牛了,能分享一下源程序嗎?

拆的舊板、元件,只能飛線了,我也不想的
回復(fù)

使用道具 舉報

6#
ID:99130 發(fā)表于 2016-4-15 19:36 | 只看該作者
樓主有原理圖嗎

回復(fù)

使用道具 舉報

7#
ID:112242 發(fā)表于 2016-4-20 20:02 | 只看該作者
你這個飛線真夠亂的
回復(fù)

使用道具 舉報

8#
ID:69536 發(fā)表于 2016-10-25 11:17 | 只看該作者
有耐心,夠細心
回復(fù)

使用道具 舉報

9#
ID:88023 發(fā)表于 2016-10-30 14:25 | 只看該作者
好有耐心
回復(fù)

使用道具 舉報

10#
ID:72088 發(fā)表于 2016-11-21 07:39 | 只看該作者
好厲害的飛仙,暈倒了我
回復(fù)

使用道具 舉報

11#
ID:344278 發(fā)表于 2018-6-4 07:22 來自手機 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報

12#
ID:112631 發(fā)表于 2018-6-6 23:15 | 只看該作者
這線能再亂一點嗎?
回復(fù)

使用道具 舉報

13#
ID:70490 發(fā)表于 2018-6-7 21:35 | 只看該作者
樓主飛線好厲害啊!
回復(fù)

使用道具 舉報

14#
ID:282850 發(fā)表于 2019-5-14 17:47 | 只看該作者
這飛線超強,換成我,我是不愿、不想這樣做,會心情不好。這飛線是否可以申請吉尼斯記錄。
回復(fù)

使用道具 舉報

15#
ID:522698 發(fā)表于 2019-5-14 18:41 | 只看該作者
飛線超強精神可佳!
回復(fù)

使用道具 舉報

16#
ID:532564 發(fā)表于 2019-5-17 16:49 | 只看該作者
樓主的線接的讓人眼花2333
回復(fù)

使用道具 舉報

17#
ID:484435 發(fā)表于 2019-5-20 12:30 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

18#
ID:887954 發(fā)表于 2022-3-10 21:11 來自手機 | 只看該作者
很好很好值得學(xué)習(xí)
回復(fù)

使用道具 舉報

19#
ID:619071 發(fā)表于 2022-3-10 22:48 | 只看該作者
收藏一波 慢慢看
回復(fù)

使用道具 舉報

20#
ID:577622 發(fā)表于 2022-3-11 15:20 | 只看該作者
這是天外飛仙的感覺啊,太強了,有強迫癥的不能看。
回復(fù)

使用道具 舉報

21#
ID:97023 發(fā)表于 2022-3-11 15:58 | 只看該作者
我見過最亂的飛線
回復(fù)

使用道具 舉報

22#
ID:489843 發(fā)表于 2022-3-16 09:06 | 只看該作者
焊第一次還可忍受的話,再檢查一次就該暴跳如雷了
回復(fù)

使用道具 舉報

23#
ID:397054 發(fā)表于 2022-3-20 18:23 | 只看該作者
藕地嗝天,都是裸銅絲,這么飛那看得懂啊,你就不怕短路,前兩年我也焊了個52的電子鐘,用的是洞洞板,橫平豎直,一目了然。
回復(fù)

使用道具 舉報

24#
ID:468878 發(fā)表于 2022-4-21 17:13 | 只看該作者
鵜鶘 發(fā)表于 2022-3-20 18:23
藕地嗝天,都是裸銅絲,這么飛那看得懂啊,你就不怕短路,前兩年我也焊了個52的電子鐘,用的是洞洞板,橫平 ...

肯定是漆包線,他敢這么用裸銅絲,我佩服他50年!這也夠亂的……
回復(fù)

使用道具 舉報

25#
ID:1017814 發(fā)表于 2022-4-22 10:05 | 只看該作者
我說樓主的頭發(fā)到哪里去了,我去____
回復(fù)

使用道具 舉報

26#
ID:996773 發(fā)表于 2022-4-24 16:08 | 只看該作者
這是個狠人,為啥一個時鐘用c語言也這么長代碼,我用匯編做個帶鬧鐘的接近兩千行代碼,太長了太煩,主要是bcd碼讀取轉(zhuǎn)成十進制,調(diào)時間又得轉(zhuǎn)成bcd碼,轉(zhuǎn)換過程太煩了。比做數(shù)控收音機都煩
回復(fù)

使用道具 舉報

27#
ID:1021338 發(fā)表于 2022-4-24 19:37 | 只看該作者
樓主很厲害,必須點贊
回復(fù)

使用道具 舉報

28#
ID:1011444 發(fā)表于 2022-7-7 20:20 | 只看該作者
程序通過了編譯,條理比較清晰。但無電路圖,不好做詳細分析。
回復(fù)

使用道具 舉報

29#
ID:74784 發(fā)表于 2022-7-8 16:18 | 只看該作者
太復(fù)雜了。



回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表