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;

}

Se Steg
Relaterade Ämnen

Gå till favoritobjekt: 7 Makeup träffar jag inte kan leva utan

http://www.styleunited.com/TipsAndTrends/article/Favorite-Go-To-Items alla har sina inte kan leva utan produkter. I den här videon dela jag min topp sju makeup plockar.1. fuktkräm: Olay Regenerist Night Recovery Cream. Det är en nattkräm men jag gill...

Hur man gör en tråd bläckfisk skulptur (förenklad). Billigt och lätt men kanske inte så snabb.

jag valde något enkelt och lätt... och sedan jag förenklat detaljerna (läs: bort detaljer och förenklade former). Se den färdiga bläckfisken ovan och Tänk på att det kan vara torr läsning men jag hoppas du sluta med en cool tråd skulptur i slutet. Ko...

Testning och felsökning (grejer de inte lära dig i skolan)

Så, har du någon enhet, oavsett om det är en inköpt produkt eller något du har byggt och du vill ta reda på om det fungerar korrekt. Här är några "semi uppenbara men inte alltid" tankar om processen.Steg 1: Fungerar det?Testa det, måste du först...

Resa med en Mac laptop eller iPod och kamera laddare? Ta inte att nätsladden!

Här är en mycket enkel instructable för dig som ofta reser med en Mac laptop (som en MacBook) eller en iPod och har en digitalkamera som har det är egen laddare. Det behöver inte mer än ett steg, eftersom det är ganska uppenbart när man ser den.Istäl...

IMMO verktyg kan inte köras utan licensnyckel

Min IMMO verktyg V26.12.2007 rapporterade ett fel när jag kör sin programvara i morse. Systemet du uppmanas att "Tyvärr, denna programvara inte kan köras utan en licensnyckel. Vänligen kontakta support jag köpte verktyget från Kina två veckor sedan,...

Värme och snö girigbuk kostym (från The år utan ett Santa Claus)

jag skapat dessa kostymer med rester av stretch sammet och Target märket leggings, kände, kartong, fyllning från kuddar, wire, färgad hårspray, vitt smink, läppstift, silvertejp och PVC-rör....

En ny show, och hur man hoppa ur en exploderande byggnad utan att döda dig själv.

Det första avsnittet av noll Budget är äntligen ut! Inte bara kommer vi också att visa hur man hoppa ur en exploderande byggnad, men denna episod är också fylld av eventuellt dödliga doser av dåligt skådespeleri. Så, jag ber om ursäkt i förväg för de...

WDW - saker att Bring och förslag för att fylla din resa med Disney Magic!

HejLåt mig börja med att säga att jag inte vet allt om Disney på något sätt men jag har varit ner till WDW drygt 20 gånger och har genom åren lärt mig några knep som gör det bara lite roligare. Kommentera gärna nedan några tips eller knep att du har...

Lysande skog Ghost billiga återvinning Mask att göra Tutorial

Hej :)Jag skapade en kostym för ett evenemang som kallas "WaldWeinacht" nära Berlin, Tyskland. Det var min första masken jag någonsin gjort. På grund av miljöskäl och en ganska låg budget på 70€ beslutat jag att gå för återvinning av material so...

Bird cage LED daylight simulation system

Ibland får du en chans att kombinera att hjälpa din familj med en trevlig hobbyprojekt...I detta fall var min svärfar ute efter ett belysningssystem för sin fågel häckar burar. Ett daylight simulation system att vara exakt. Han bad mig att ta en titt...

DIY Crystal Beaded handväska

Jag har crafting mycket mina handgjorda smycken och hantverk klubben i mitt universitet men tyvärr jag inte har varit utstationering några vänners kompatibla ett tag. Jag letade verkligen inspiration att komma igång igen! Så fort jag såg den Remix Co...

Star Wars Han Solo bälteshölster pistol

här är ett enkelt och billigt sätt att göra en awesome Han Solo pistol hölster. Min fästman och jag kommer att vara Leia och Han för Halloween och hans dräkt skulle inte vara komplett utan signatur Han Solo pistol hölster. Jag är ett stort Star Wars...

Gluten fri lever

äta glutenfri är enklare än någonsin! Stor kedja dagligvarubutiker säljer gluten fria objekt och ingrediensförteckningar är tydligare än någonsin. Dock gluten fri levande är fortfarande dyra och ofta obekväm. Detta instructible's ändamål är att dela...

Mini AT-ST Popsicle Stick modell

Hej alla! Ett annat projekt från Star Wars universum - en mini All Terrain Scout Transport (AT-ST) popsicle stick modell..."Kyckling vandrare" var mer av en utmaning att bygga jämfört med andra fiktiva hantverk sedan mini AT-ST har att balansera...

Chow Mein

kinesiska uppfann nudlarna och förändrat hur vi äter, det ingen är överdrift. Som en kinesisk är nudlar och ris något jag inte kan vara utan. Jag använder kinesiska nudlar mycket i daglig matlagning och kan inte ens börja att tänka hur hade min kulin...

Glödande ljus från förpackningsavfall

så du har haft en stor flaska champagne, men nu flaskan är i återvinning bin, din katt leker med korken, och du undrar vad jag ska göra med snygg lådan den kom i?Boy, har jag fått ett stort projekt för dig!Vi kommer att ta en vacker plastlåda, som an...

Göra billigt (nästan gratis) SMD sond/pincett

denna hemgjorda ytmontering enhet (SMD) pincett/sond är tillverkad av skrot PCB material och ansluts till en DVM eller kapacitans/induktans mätare för enkel mätning av små SMD komponenter (naturligtvis du fortfarande behöver lämpliga mätaren). Du hit...

PS2, 3, 4-styrenhet kanten Stand (PC/MAC)

En awesome hemgjorda stå om din gjort videospel för dagen.Det är också en stor dekoration till ditt skrivbord som definitivt kommer att fånga människors uppmärksamhet.Steg 1: Vad du behöverx1 tejp (kan köpas överallt Walmart för $5, Dollerama... etc)...

Ring box med trä gångjärn

Jag gillar verkligen att göra lådor av trä och alltid använder trä gångjärn, jag tycker de ser så mycket bättre än alla gångjärn som du kan köpa. Plus att de kostar så mycket mindre (i pengar termer, inte tid!).Som en massa människor som gör träslöjd...