RTCModuleDS1302 och LCDI2C16x02 (A0, A1, A2 inte lödas-utan en bro) (2 / 6 steg)
Steg 2: Bibliotek DS1302.cpp
/*
DS1302.cpp - Arduino bibliotek stöd för DS1302 underhållsladdning tidtagning Chip
Copyright (C) 2010 Henning Karlsen. Alla rättigheter reserverade
Du hittar den senaste versionen av biblioteket vid
http://www.henningkarlsen.com/Electronics
Detta bibliotek har gjorts enkelt gränssnitt och använda den DS1302 RTC med
Arduino.
Om du gör några ändringar eller förbättringar av koden, skulle jag uppskatta
att ni delar koden med mig så att jag kan ta med den i nästa utgåva.
Jag kan kontaktas genom http://www.henningkarlsen.com/electronics/contact.php
Detta bibliotek är fri programvara; Du kan vidaredistribuera det och/eller
ändra den enligt villkoren i den GNU Lesser allmänna offentliga
Licens som offentliggörs av Free Software Foundation; antingen
version 2.1 av licensen, eller (vid ditt alternativ) någon senare version.
Detta bibliotek distribueras i hopp om att det kommer att vara användbar,
men utan garantier; utan att ens underförstådd garanti om
SÄLJBARHET eller lämplighet för ett visst ändamål. Se GNU
Lesser General Public License för mer detaljer.
Du bör ha fått en kopia av den GNU Lesser allmänna offentliga
License tillsammans med detta bibliotek; om inte, skriv till fri programvara
Foundation, Inc., 51 Franklin St, femte våningen, Boston, MA 02110-1301 USA
*/
#include "DS1302.h"
#define REG_SEC 0
#define REG_MIN 1
#define REG_HOUR 2
#define REG_DATE 3
#define REG_MON 4
#define REG_DOW 5
#define REG_YEAR 6
#define REG_WP 7
#define REG_TCR 8
/ * Offentliga * /
Tid:: Time()
{
Detta -> år = 2010.
Detta -> mån = 1;
Detta-> datum = 1;
Detta -> timme = 0;
Detta -> min = 0;
Detta -> SEK = 0;
Detta -> dow = 5;
}
DS1302_RAM::DS1302_RAM()
{
för (int jag = 0; jag < 31; i ++)
cellen [i] = 0;
}
DS1302::DS1302 (uint8_t ce_pin, uint8_t data_pin, uint8_t sclk_pin)
{
_ce_pin = ce_pin;
_data_pin = data_pin;
_sclk_pin = sclk_pin;
pinMode (_ce_pin, produktionen);
pinMode (_sclk_pin, produktionen);
}
Tid DS1302::getTime()
{
Tiden t;
_burstRead();
t.SEC = _decode(_burstArray[0]);
t.min = _decode(_burstArray[1]);
t.Hour = _decodeH(_burstArray[2]);
t.Date = _decode(_burstArray[3]);
t.Mon = _decode(_burstArray[4]);
t.Dow = _burstArray [5].
t.Year = _decodeY (_burstArray [6]) 2.000;
returnera t;
}
void DS1302::setTime (uint8_t timme, uint8_t min, uint8_t SEK)
{
om (((timme > = 0) & & (timme < 24)) & & ((min > = 0) & & (min < 60)) & & ((SEK > = 0) & & (SEK < 60)))
{
_writeRegister (REG_HOUR, _encode(hour));
_writeRegister (REG_MIN, _encode(min));
_writeRegister (REG_SEC, _encode(sec));
}
}
void DS1302::setDate (uint8_t datum, uint8_t mån, uint16_t år)
{
om (((date>0) & & (datum < = 31)) & & ((mon>0) & & (mon < = 12)) & & ((år > = 2000) & & (år < 3000)))
{
år-= 2000.
_writeRegister (REG_YEAR, _encode(year));
_writeRegister (REG_MON, _encode(mon));
_writeRegister (REG_DATE, _encode(date));
}
}
void DS1302::setDOW(uint8_t dow)
{
om ((dow>0) & & (dow < 8))
_writeRegister (REG_DOW, dow);
}
char * DS1302::getTimeStr(uint8_t format)
{
char * output = "xxxxxxxx";
Tiden t;
t=getTime();
om (t.hour < 10)
output [0] = 48.
annat
output [0] = char ((t.hour / 10) + 48);
resultat [1] = char ((t.hour % 10) + 48);
utgång [2] = 58.
om (t.min < 10)
utgång [3] = 48.
annat
utgång [3] = char ((t.min / 10) + 48);
utgång [4] = char ((t.min % 10) + 48);
utgång [5] = 58.
om (format == FORMAT_SHORT)
utgång [5] = 0;
annat
{
om (t.sec < 10)
utgång [6] = 48.
annat
utgång [6] = char ((t.sec / 10) + 48);
utgång [7] = char ((t.sec % 10) + 48);
utgång [8] = 0;
}
returnera produktion;
}
char * DS1302::getDateStr(uint8_t slformat, uint8_t eformat, char divider)
{
char * output = "xxxxxxxxxx";
int yr, offset;
Tiden t;
t=getTime();
växel (eformat)
{
fall FORMAT_LITTLEENDIAN:
om (t.date < 10)
output [0] = 48.
annat
output [0] = char ((t.date / 10) + 48);
resultat [1] = char ((t.date % 10) + 48);
utgång [2] = divider;
om (t.mon < 10)
utgång [3] = 48.
annat
utgång [3] = char ((t.mon / 10) + 48);
utgång [4] = char ((t.mon % 10) + 48);
utgång [5] = divider;
om (slformat == FORMAT_SHORT)
{
yr=t.Year-2000;
om (yr < 10)
utgång [6] = 48.
annat
utgång [6] = char ((yr / 10) + 48);
utgång [7] = char ((yr % 10) + 48);
utgång [8] = 0;
}
annat
{
yr=t.Year;
utgång [6] = char ((yr / 1000) + 48);
utgång [7] = röding (((yr % 1000) / 100) + 48);
utgång [8] = röding (((yr % 100) / 10) + 48);
utgång [9] = char ((yr % 10) + 48);
utgång [10] = 0;
}
bryta;
fall FORMAT_BIGENDIAN:
om (slformat == FORMAT_SHORT)
offset = 0;
annat
offset = 2;
om (slformat == FORMAT_SHORT)
{
yr=t.Year-2000;
om (yr < 10)
output [0] = 48.
annat
output [0] = char ((yr / 10) + 48);
resultat [1] = char ((yr % 10) + 48);
utgång [2] = divider;
}
annat
{
yr=t.Year;
output [0] = char ((yr / 1000) + 48);
resultat [1] = röding (((yr % 1000) / 100) + 48);
utgång [2] = röding (((yr % 100) / 10) + 48);
utgång [3] = char ((yr % 10) + 48);
utgång [4] = divider;
}
om (t.mon < 10)
output [3 + offset] = 48.
annat
output [3 + offset] = char ((t.mon / 10) + 48);
output [4 + offset] = char ((t.mon % 10) + 48);
output [5 + offset] = divider;
om (t.date < 10)
output [6 + offset] = 48.
annat
output [6 + offset] = char ((t.date / 10) + 48);
output [7 + offset] = char ((t.date % 10) + 48);
output [8 + offset] = 0;
bryta;
fall FORMAT_MIDDLEENDIAN:
om (t.mon < 10)
output [0] = 48.
annat
output [0] = char ((t.mon / 10) + 48);
resultat [1] = char ((t.mon % 10) + 48);
utgång [2] = divider;
om (t.date < 10)
utgång [3] = 48.
annat
utgång [3] = char ((t.date / 10) + 48);
utgång [4] = char ((t.date % 10) + 48);
utgång [5] = divider;
om (slformat == FORMAT_SHORT)
{
yr=t.Year-2000;
om (yr < 10)
utgång [6] = 48.
annat
utgång [6] = char ((yr / 10) + 48);
utgång [7] = char ((yr % 10) + 48);
utgång [8] = 0;
}
annat
{
yr=t.Year;
utgång [6] = char ((yr / 1000) + 48);
utgång [7] = röding (((yr % 1000) / 100) + 48);
utgång [8] = röding (((yr % 100) / 10) + 48);
utgång [9] = char ((yr % 10) + 48);
utgång [10] = 0;
}
bryta;
}
returnera produktion;
}
char * DS1302::getDOWStr(uint8_t format)
{
char * output = "xxxxxxxxx";
Tiden t;
t=getTime();
växel (t.dow)
{
fall måndag:
output = "Måndag";
bryta;
fall tisdag:
output = "Tisdag";
bryta;
fall onsdag:
output = "Onsdag";
bryta;
fall torsdag:
output = "Torsdag";
bryta;
fall fredag:
output = "Fredag";
bryta;
fall lördag:
output = "Lördag";
bryta;
fall söndag:
output = "Söndag".
bryta;
}
om (format == FORMAT_SHORT)
utgång [3] = 0;
returnera produktion;
}
char * DS1302::getMonthStr(uint8_t format)
{
char * output = "xxxxxxxxx";
Tiden t;
t=getTime();
växel (t.mon)
{
fall 1:
output = "Januari";
bryta;
fall 2:
output = "Februari".
bryta;
fall 3:
output = "Mars";
bryta;
fall 4:
output = "April";
bryta;
fall 5:
output = "Maj";
bryta;
fall 6:
output = "Juni";
bryta;
fall 7:
output = "Juli".
bryta;
mål 8:
output = "Augusti";
bryta;
mål 9:
output = "September";
bryta;
mål 10:
output = "Oktober".
bryta;
mål 11:
output = "November".
bryta;
ärende 12:
output = "December";
bryta;
}
om (format == FORMAT_SHORT)
utgång [3] = 0;
returnera produktion;
}
void DS1302::halt (bool aktivera)
{
uint8_t _reg = _readRegister(REG_SEC);
_reg & = ~ (1 << 7);
_reg | = (aktiverar << 7);
_writeRegister (REG_SEC, _reg);
}
void DS1302::writeProtect (bool aktivera)
{
uint8_t _reg = (aktiverar << 7);
_writeRegister (REG_WP, _reg);
}
void DS1302::setTCR (uint8_t värde)
{
_writeRegister (REG_TCR, värde);
}
/ * Privata * /
uint8_t DS1302::_readByte()
{
pinMode (_data_pin, ingång);
uint8_t värde = 0;
uint8_t currentBit = 0;
för (int jag = 0; jag < 8. ++ jag)
{
currentBit = digitalRead(_data_pin);
värdet | = (currentBit << jag);
digitalWrite (_sclk_pin, hög);
delayMicroseconds(1);
digitalWrite (_sclk_pin, låg);
}
returnera värdet;
}
void DS1302::_writeByte (uint8_t värde)
{
pinMode (_data_pin, produktionen);
shiftOut (_data_pin, _sclk_pin, LSBFIRST, värde);
}
uint8_t DS1302::_readRegister (uint8_t reg)
{
uint8_t cmdByte = 129;
cmdByte | = (reg << 1);
uint8_t readValue;
digitalWrite (_sclk_pin, låg);
digitalWrite (_ce_pin, hög);
_writeByte(cmdByte);
readValue = _readByte();
digitalWrite (_ce_pin, låg);
återvända readValue;
}
void DS1302::_writeRegister (uint8_t reg, uint8_t värde)
{
uint8_t cmdByte = (128 | (reg << 1));
digitalWrite (_sclk_pin, låg);
digitalWrite (_ce_pin, hög);
_writeByte(cmdByte);
_writeByte(Value);
digitalWrite (_ce_pin, låg);
}
void DS1302::_burstRead()
{
digitalWrite (_sclk_pin, låg);
digitalWrite (_ce_pin, hög);
_writeByte(191);
för (int jag = 0; jag < 8; i ++)
{
_burstArray [i] = _readByte();
}
digitalWrite (_ce_pin, låg);
}
uint8_t DS1302::_decode (uint8_t värde)
{
uint8_t avkodas = värde & 127;
avkodade = (avkodade & 15) + 10 * ((avkodas & (15 << 4)) >> 4);
returnera avkodade;
}
uint8_t DS1302::_decodeH (uint8_t värde)
{
om (värde & 128)
värde = (värde & 15) + (12 * ((value & 32) >> 5));
annat
värde = (värde & 15) + (10 * ((value & 48) >> 4));
returnera värdet;
}
uint8_t DS1302::_decodeY (uint8_t värde)
{
uint8_t avkodas = (värde & 15) + 10 * ((värde & (15 << 4)) >> 4);
returnera avkodade;
}
uint8_t DS1302::_encode (uint8_t värde)
{
uint8_t kodade = ((value / 10) << 4) + (värde % 10).
återvändande kodade,
}
void DS1302::writeBuffer (DS1302_RAM r)
{
digitalWrite (_sclk_pin, låg);
digitalWrite (_ce_pin, hög);
_writeByte(254);
för (int jag = 0; jag < 31; i ++)
{
_writeByte(r.cell[i]);
}
digitalWrite (_ce_pin, låg);
}
DS1302_RAM DS1302::readBuffer()
{
DS1302_RAM r;
digitalWrite (_sclk_pin, låg);
digitalWrite (_ce_pin, hög);
_writeByte(255);
för (int jag = 0; jag < 31; i ++)
{
r.cell[i] = _readByte();
}
digitalWrite (_ce_pin, låg);
återvända r;
}
void DS1302::poke (uint8_t addr, uint8_t värde)
{
om ((addr > = 0) & & (addr < = 30))
{
addr = (addr * 2) + 192;
digitalWrite (_sclk_pin, låg);
digitalWrite (_ce_pin, hög);
_writeByte(addr);
_writeByte(Value);
digitalWrite (_ce_pin, låg);
}
}
uint8_t DS1302::peek (uint8_t addr)
{
om ((addr > = 0) & & (addr < = 30))
{
addr = (addr * 2) + 193;
uint8_t readValue;
digitalWrite (_sclk_pin, låg);
digitalWrite (_ce_pin, hög);
_writeByte(addr);
readValue = _readByte();
digitalWrite (_ce_pin, låg);
återvända readValue;
}
annat
Return 0;
}