久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2458|回復: 0
打印 上一主題 下一主題
收起左側

ds1302在lcd1602上面顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:186410 發表于 2017-4-9 16:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/**************************************************************************

                                   THE REAL TIMER DS1302 DRIVER LIB

                             COPYRIGHT (c)   2005 BY JJJ.
                                       --  ALL RIGHTS RESERVED  --

   File Name:       DS1302.h
   Author:          Jiang Jian Jun
   Created:         2003/7/21
   Modified:                NO
   Revision:                 1.0

***************************************************************************/
#ifndef _REAL_TIMER_DS1302_2003_7_21_
#define _REAL_TIMER_DS1302_2003_7_21_

sbit  DS1302_CLK = P1^6;              //實時時鐘時鐘線引腳
sbit  DS1302_IO  = P1^7;              //實時時鐘數據線引腳
sbit  DS1302_RST = P1^5;              //實時時鐘復位線引腳
sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;

typedef struct __SYSTEMTIME__
{
        unsigned char Second;
        unsigned char Minute;
        unsigned char Hour;
        unsigned char Week;
        unsigned char Day;
        unsigned char Month;
        unsigned char  Year;
        unsigned char DateString[9];
        unsigned char TimeString[9];
}SYSTEMTIME;        //定義的時間類型

#define AM(X)        X
#define PM(X)        (X+12)                      // 轉成24小時制
#define DS1302_SECOND        0x80
#define DS1302_MINUTE        0x82
#define DS1302_HOUR                0x84
#define DS1302_WEEK                0x8A
#define DS1302_DAY                0x86
#define DS1302_MONTH        0x88
#define DS1302_YEAR                0x8C
#define DS1302_RAM(X)        (0xC0+(X)*2)           //用于計算 DS1302_RAM 地址的宏

void DS1302InputByte(unsigned char d)         //實時時鐘寫入一字節(內部函數)
{
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DS1302_IO = ACC0;                   //相當于匯編中的 RRC
        DS1302_CLK = 1;
        DS1302_CLK = 0;
        ACC = ACC >> 1;
    }
}

unsigned char DS1302OutputByte(void)         //實時時鐘讀取一字節(內部函數)
{
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;                                 //相當于匯編中的 RRC
        ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    }
    return(ACC);
}

void Write1302(unsigned char ucAddr, unsigned char ucDa)        //ucAddr: DS1302地址, ucData: 要寫的數據
{
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr);               // 地址,命令
    DS1302InputByte(ucDa);               // 寫1Byte數據
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

unsigned char Read1302(unsigned char ucAddr)        //讀取DS1302某地址的數據
{
    unsigned char ucData;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr|0x01);        // 地址,命令
    ucData = DS1302OutputByte();         // 讀1Byte數據
    DS1302_CLK = 1;
    DS1302_RST = 0;
    return(ucData);
}

void DS1302_SetProtect(bit flag)        //是否寫保護
{
        if(flag)
                Write1302(0x8E,0x10);
        else
                Write1302(0x8E,0x00);
}

void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 設置時間函數
{
        DS1302_SetProtect(0);
        Write1302(Address, ((Value/10)<<4 | (Value%10)));
}

void DS1302_GetTime(SYSTEMTIME *Time)
{
        unsigned char ReadValue;
        ReadValue = Read1302(DS1302_SECOND);
        Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
        ReadValue = Read1302(DS1302_MINUTE);
        Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
        ReadValue = Read1302(DS1302_HOUR);
        Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
        ReadValue = Read1302(DS1302_DAY);
        Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);       
        ReadValue = Read1302(DS1302_WEEK);
        Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
        ReadValue = Read1302(DS1302_MONTH);
        Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
        ReadValue = Read1302(DS1302_YEAR);
        Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);       
}

void DateToStr(SYSTEMTIME *Time)
{
        Time->DateString[0] = Time->Year/10 + '0';
        Time->DateString[1] = Time->Year%10 + '0';
        Time->DateString[2] = '-';
        Time->DateString[3] = Time->Month/10 + '0';
        Time->DateString[4] = Time->Month%10 + '0';
        Time->DateString[5] = '-';
        Time->DateString[6] = Time->Day/10 + '0';
        Time->DateString[7] = Time->Day%10 + '0';
        Time->DateString[8] = '\0';
}

void TimeToStr(SYSTEMTIME *Time)
{
        Time->TimeString[0] = Time->Hour/10 + '0';
        Time->TimeString[1] = Time->Hour%10 + '0';
        Time->TimeString[2] = ':';
        Time->TimeString[3] = Time->Minute/10 + '0';
        Time->TimeString[4] = Time->Minute%10 + '0';
        Time->TimeString[5] = ':';
        Time->TimeString[6] = Time->Second/10 + '0';
        Time->TimeString[7] = Time->Second%10 + '0';
        Time->DateString[8] = '\0';
}

void Initial_DS1302(void)
{
        unsigned char Second=Read1302(DS1302_SECOND);
        if(Second&0x80)                  
                DS1302_SetTime(DS1302_SECOND,0);
}

/********************************************************************************
void BurstWrite1302(unsigned char *pWClock)        //往DS1302寫入時鐘數據(多字節方式)
{
    unsigned char i;
    Write1302(0x8e,0x00);                 // 控制命令,WP=0,寫操作?
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(0xbe);                // 0xbe:時鐘多字節寫命令
    for (i = 8; i>0; i--)                     //8Byte = 7Byte 時鐘數據 + 1Byte 控制
    {
        DS1302InputByte(*pWClock);         // 寫1Byte數據
        pWClock++;
    }
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

void BurstRead1302(unsigned char *pRClock)        //讀取DS1302時鐘數據(時鐘多字節方式)
{
    unsigned char i;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(0xbf);                     // 0xbf:時鐘多字節讀命令
    for (i=8; i>0; i--)
    {
       *pRClock = DS1302OutputByte();   // 讀1Byte數據
       pRClock++;
    }
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

void DS1302_TimeStop(bit flag)           // 是否將時鐘停止
{
        unsigned char Data;
        Data=Read1302(DS1302_SECOND);
        DS1302_SetProtect(0);
        if(flag)
                Write1302(DS1302_SECOND, Data|0x80);
        else
                Write1302(DS1302_SECOND, Data&0x7F);
}
********************************************************************************/
#endif

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品一区二区三区蜜桃视频 | 亚洲欧美一区二区在线观看 | 久久久久久综合 | av在线亚洲天堂 | 日韩成人在线播放 | 亚洲午夜视频 | 一区二区在线免费播放 | 在线中文字幕第一页 | 成人午夜激情 | 国产aⅴ精品 | www.操com | 精品欧美一区二区中文字幕视频 | 日韩亚洲视频在线 | www.国产精品 | 男女那个视频 | 国产精品 欧美精品 | 99热精品国产 | 人人干人人干人人干 | 国产伦一区二区三区久久 | 欧美一级在线观看 | 福利精品 | 国产在线激情视频 | 久草免费在线视频 | 在线播放国产一区二区三区 | 激情a| 国内精品一区二区 | 国产亚洲精品久久久久久豆腐 | 午夜视频免费在线观看 | a级片网站 | 精品成人av | 欧美一级久久精品 | 亚洲福利在线视频 | 狠狠影院 | 99久久久久国产精品免费 | 欧美a在线看 | 国产成人小视频 | 成人在线| 日本久久久一区二区三区 | 爱爱无遮挡 | 久久久久久久久久久久一区二区 | 国产精品欧美一区二区三区不卡 |