Advertisement
thorium90

DS1307.cpp

Dec 10th, 2011
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.09 KB | None | 0 0
  1. /*
  2. ##########################################################################
  3. ##                          ARDUINO SOURCES                             ##
  4. ##########################################################################
  5. */
  6. /*
  7.    ___|  _)  | _)       _)                         ___|                    
  8.  \___ \   |  |  |   __|  |  |   |  __ `__ \       |       _ \    __|  __ \  
  9.        |  |  |  |  (     |  |   |  |   |   |      |      (   |  |     |   |
  10.  _____/  _| _| _| \___| _| \__,_| _|  _|  _|     \____| \___/  _|     .__/  
  11.                                                                      _|  
  12. Code source libre de droit. Si vous utilisez mon code, merci à vous d'en préciser la source.
  13.  
  14. @Date : 26/11/2011
  15. @Auteur : Silicium Corp
  16. */
  17. #include "DS1307.h"
  18.  
  19. DS1307 ClockChip = DS1307();
  20.  
  21. DS1307::DS1307()
  22. {
  23.     Wire.begin();
  24.    
  25. }
  26. //===============================================================
  27. void DS1307::readWire(void)
  28. {
  29.     Wire.beginTransmission(ID_REGISTER);      
  30.     Wire.send(_00H_SEC);//Positionnement du pointeur de registre matériel à zéro
  31.     Wire.endTransmission();
  32.    
  33.     Wire.requestFrom(ID_REGISTER, LENGTH_REGISTER);//Demande de 8 octets au registre matériel
  34.    
  35.     for(int i = 0; i < LENGTH_REGISTER; i++)
  36.     {
  37.         bufferRegister[i] = Wire.receive(); //Enregistrement des 8 octects du registre du DS1307 dans le bufferRegister (format BCD)
  38.     }
  39. }
  40. //===============================================================
  41. void DS1307::save(void)
  42. {
  43.     Wire.beginTransmission(ID_REGISTER);
  44.     Wire.send(_00H_SEC); //Positionnement du pointeur de registre matériel à zéro
  45.     for(int i = 0; i < LENGTH_REGISTER; i++)
  46.     {
  47.         Wire.send(bufferRegister[i]); //Enregistrement des 8 octects du bufferRegister (format BCD) dans le registre du DS1307
  48.     }
  49.     Wire.endTransmission();
  50. }
  51. //===============================================================
  52. void DS1307::convertBCDtoINT()
  53. {
  54.     isCHenable = (bufferRegister[_00H_SEC] & CLOCKHALT_MASK) >> 7;
  55.     is12Hmode = (bufferRegister[_02H_HRS] & CLOCK_MOD_MASK) >> 6;
  56.     isOUTenable = (bufferRegister[_07H_PIN] & OUT_MASK) >> 7;
  57.     isSQWEenable = (bufferRegister[_07H_PIN] & SQWE_MASK) >> 4;
  58.     waveFrequency = (bufferRegister[_07H_PIN] & RS_MASK);
  59.    
  60.     timeRegister[_00H_SEC] = (10 * ((bufferRegister[_00H_SEC] & X3BIT_DECADE_MASK) >> 4)) + (bufferRegister[_00H_SEC] & X4BIT_UNITS_MASK);
  61.     timeRegister[_01H_MIN] = (10 * ((bufferRegister[_01H_MIN] & X3BIT_DECADE_MASK) >> 4)) + (bufferRegister[_01H_MIN] & X4BIT_UNITS_MASK);
  62.     if (is12Hmode)
  63.     {
  64.         timeRegister[_02H_HRS] = (10 * ((bufferRegister[_02H_HRS] & X1BIT_DECADE_MASK) >> 4)) + (bufferRegister[_02H_HRS] & X4BIT_UNITS_MASK);
  65.         isPostMeridiem = (bufferRegister[_02H_HRS] & CLK_AM_PM_MASK) >> 5;
  66.     }
  67.     else
  68.     {
  69.         timeRegister[_02H_HRS] = (10 * ((bufferRegister[_02H_HRS] & X2BIT_DECADE_MASK) >> 4)) + (bufferRegister[_02H_HRS] & X4BIT_UNITS_MASK);
  70.     }
  71.     timeRegister[_03H_DOW] = bufferRegister[_03H_DOW] & X3BIT_UNITS_MASK;
  72.     timeRegister[_04H_DAT] = (10 * ((bufferRegister[_04H_DAT] & X2BIT_DECADE_MASK) >> 4)) + (bufferRegister[_04H_DAT] & X4BIT_UNITS_MASK);
  73.     timeRegister[_05H_MTH] = (10 * ((bufferRegister[_05H_MTH] & X1BIT_DECADE_MASK) >> 4)) + (bufferRegister[_05H_MTH] & X4BIT_UNITS_MASK);
  74.     timeRegister[_06H_YRS] = (10 * ((bufferRegister[_06H_YRS] & X4BIT_DECADE_MASK) >> 4)) + (bufferRegister[_06H_YRS] & X4BIT_UNITS_MASK);
  75.     timeRegister[_07H_PIN] = bufferRegister[_07H_PIN];
  76. }
  77. //===============================================================
  78. void DS1307::convertINTtoBCD()
  79. {
  80.     bufferRegister[_00H_SEC] = (isCHenable << 7) | ((timeRegister[_00H_SEC] / 10) << 4) | (timeRegister[_00H_SEC] % 10);
  81.     bufferRegister[_01H_MIN] = ((timeRegister[_01H_MIN] / 10) << 4) | (timeRegister[_01H_MIN] % 10);
  82.     if (is12Hmode)
  83.     {
  84.         bufferRegister[_02H_HRS] = (is12Hmode << 6) | (isPostMeridiem << 5) | ((timeRegister[_02H_HRS] / 10) << 4) | (timeRegister[_02H_HRS] % 10);
  85.     }
  86.     else
  87.     {
  88.         bufferRegister[_02H_HRS] = ((timeRegister[_02H_HRS] / 10) << 4) | (timeRegister[_02H_HRS] % 10);
  89.     }
  90.     bufferRegister[_03H_DOW] = timeRegister[_03H_DOW];
  91.     bufferRegister[_04H_DAT] = ((timeRegister[_04H_DAT] / 10) << 4) | (timeRegister[_04H_DAT] % 10);
  92.     bufferRegister[_05H_MTH] = ((timeRegister[_05H_MTH] / 10) << 4) | (timeRegister[_05H_MTH] % 10);
  93.  
  94.     bufferRegister[_06H_YRS] = ((timeRegister[_06H_YRS] / 10) << 4) | (timeRegister[_06H_YRS] % 10);
  95.     bufferRegister[_07H_PIN] = (isOUTenable << 7) | (isSQWEenable << 4) | waveFrequency;
  96. }
  97. //===============================================================
  98. void DS1307::updateRegister()
  99. {  
  100.     readWire();
  101.     convertBCDtoINT();
  102. }
  103. //===============================================================
  104. void DS1307::updateParameter()
  105. {  
  106.     convertINTtoBCD();
  107.     save();
  108. }
  109. //===============================================================
  110. void DS1307::startClock()
  111. {  
  112.     isCHenable = false;
  113.     updateParameter();
  114. }
  115. //===============================================================
  116. void DS1307::stopClock()
  117. {  
  118.     updateRegister();
  119.     isCHenable = true;
  120.     updateParameter();
  121. }
  122. //===============================================================
  123. void DS1307::startWave()
  124. {  
  125.     updateRegister();
  126.     isSQWEenable = true;
  127.     isOUTenable = true;
  128.     updateParameter();
  129. }
  130. //===============================================================
  131. void DS1307::stopWave()
  132. {  
  133.     updateRegister();
  134.     isSQWEenable = false;
  135.     updateParameter();
  136. }
  137. //===============================================================
  138. void DS1307::startOUT()
  139. {  
  140.     updateRegister();
  141.     isOUTenable = true;
  142.     updateParameter();
  143. }
  144. //===============================================================
  145. void DS1307::stopOUT()
  146. {  
  147.     updateRegister();
  148.     isOUTenable = false;
  149.     isSQWEenable = false;
  150.     updateParameter();
  151. }
  152. //===============================================================
  153. void DS1307::setSecond(int second)
  154. {  
  155.     if ( second > -1 && second < 61)
  156.     {
  157.         timeRegister[_00H_SEC] = second;
  158.     }
  159. }
  160. //===============================================================
  161. void DS1307::setMinute(int minute)
  162. {  
  163.     if ( minute > -1 && minute < 61)
  164.     {
  165.         timeRegister[_01H_MIN] = minute;
  166.     }
  167. }
  168. //===============================================================
  169. void DS1307::setHour(int hour)
  170. {  
  171.     if (is12Hmode)
  172.     {
  173.         if ( hour > 0 && hour < 13)
  174.         {
  175.             timeRegister[_02H_HRS] = hour;
  176.         }
  177.     }
  178.     else
  179.     {
  180.         if ( hour > -1 && hour < 24)
  181.         {
  182.             timeRegister[_02H_HRS] = hour;
  183.         }
  184.        
  185.     }
  186. }
  187. //===============================================================
  188. void DS1307::setDay(int day)
  189. {  
  190.     if(day > 0 && day < 32)
  191.     {
  192.         timeRegister[_04H_DAT] = day;
  193.     }
  194. }
  195. //===============================================================
  196. void DS1307::setDayOfMonth(int dow)
  197. {  
  198.     if(dow > 0 && dow < 8)
  199.     {
  200.         timeRegister[_03H_DOW] = dow;
  201.     }
  202. }
  203. //===============================================================
  204. void DS1307::setMonth(int month)
  205. {  
  206.     if(month > 0 && month < 13)
  207.     {
  208.         timeRegister[_05H_MTH] = month;
  209.     }
  210. }
  211. //===============================================================
  212. void DS1307::setYear(int year)
  213. {
  214.     if (year > -1 && year < 100)
  215.     {
  216.         timeRegister[_06H_YRS] = year;
  217.     }
  218. }
  219. //===============================================================
  220. void DS1307::setTime(int hour, int minute, int second)  
  221. {  
  222.     setSecond(second);
  223.     setMinute(minute);
  224.     setHour(hour);
  225.    
  226. }
  227. //===============================================================
  228. void DS1307::setCalendar(int dow, int day, int month, int year)  
  229. {  
  230.     setDay(day);
  231.     setDayOfMonth(dow);
  232.     setMonth(month);
  233.     setYear(year);
  234. }
  235. //===============================================================
  236. void DS1307::setTimeRegister(int hour, int minute, int second, int dow, int day, int month, int year)
  237. {
  238.     setTime(hour, minute, second);
  239.     setCalendar(dow, day, month, year);
  240. }
  241. //===============================================================
  242. void DS1307::setWaveFrequency(int frequence)  // frequences : 0=1hz, 1=4KHz, 2=8KHz, 3=32KHz
  243. {  
  244.     if (frequence > -1 && frequence < 5)
  245.     {
  246.         waveFrequency = frequence;
  247.     }    
  248. }
  249. //===============================================================
  250. void DS1307::switchMeridiem()
  251. {
  252.     updateRegister();
  253.     if (is12Hmode)
  254.     {
  255.         if (isPostMeridiem)
  256.         {
  257.             isPostMeridiem = false;
  258.         }
  259.         else
  260.         {
  261.             isPostMeridiem = true;
  262.         }
  263.     }
  264.     updateParameter();
  265. }
  266. //===============================================================
  267. void DS1307::switchMode()
  268. {
  269.     updateRegister();
  270.     if(is12Hmode)
  271.     {
  272.         if (isPostMeridiem == true && (timeRegister[_02H_HRS] != 12))
  273.         {
  274.             timeRegister[_02H_HRS] += 12;
  275.         }
  276.         else if (isPostMeridiem == false && (timeRegister[_02H_HRS] == 12))
  277.         {
  278.             timeRegister[_02H_HRS] = 0;
  279.         }
  280.         is12Hmode = false;
  281.         isPostMeridiem = false;
  282.     }
  283.     else
  284.     {
  285.         is12Hmode = true;
  286.         if (timeRegister[_02H_HRS] > 12 && timeRegister[_02H_HRS] < 24)
  287.         {
  288.             isPostMeridiem = true;
  289.             timeRegister[_02H_HRS] -= 12;
  290.         }
  291.         else if (timeRegister[_02H_HRS] == 12)
  292.         {
  293.             isPostMeridiem = true;
  294.         }
  295.         else if (timeRegister[_02H_HRS] == 0)
  296.         {
  297.             isPostMeridiem = false;
  298.             timeRegister[_02H_HRS] = 12;
  299.         }
  300.     }
  301.     updateParameter();
  302. }
  303. //===============================================================
  304. boolean DS1307::getIs12Hmode(boolean isRefresh)
  305. {
  306.     if(isRefresh)
  307.     {
  308.         updateRegister();
  309.     }
  310.     return(is12Hmode);
  311. }
  312. //===============================================================
  313. boolean DS1307::getIsPostMeridiem(boolean isRefresh)
  314. {
  315.     if(isRefresh)
  316.     {
  317.         updateRegister();
  318.     }
  319.     return(isPostMeridiem);
  320. }
  321. //===============================================================
  322. boolean DS1307::getIsCHenable(boolean isRefresh)
  323. {
  324.     if(isRefresh)
  325.     {
  326.         updateRegister();
  327.     }
  328.     return(isCHenable);
  329. }
  330. //===============================================================
  331. boolean DS1307::getIsSQWEenable(boolean isRefresh)
  332. {
  333.     if(isRefresh)
  334.     {
  335.         updateRegister();
  336.     }
  337.     return(isSQWEenable);
  338. }
  339. //===============================================================
  340. boolean DS1307::getIsOUTenable(boolean isRefresh)
  341. {
  342.     if(isRefresh)
  343.     {
  344.         updateRegister();
  345.     }
  346.     return(isOUTenable);
  347. }
  348. //===============================================================
  349. int DS1307::getWaveFrequency(boolean isRefresh)
  350. {
  351.     if(isRefresh)
  352.     {
  353.         updateRegister();
  354.     }
  355.     return(waveFrequency);
  356. }
  357. //===============================================================
  358. int* DS1307::getTimeRegister(boolean isRefresh)  
  359. {
  360.     if(isRefresh)
  361.     {
  362.         updateRegister();
  363.     }
  364.     return(timeRegister);
  365. }
  366.  
  367.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement