title: logic operators & bit separation calculation in C (PIC programming)
body: <p>I am programming a PIC18F94K20 to work in conjunction with a MCP7941X I2C RTCC ship and a 24AA128 I2C CMOS Serial EEPROM device. Currently I have code which successfully intialises the seconds/days/etc values of the RTCC and starts the timer, toggling a LED upon the turnover of every second.</p>
  
  <p>I am attempting to augment the code to read back the correct data for these values, however I am running into trouble when I try to account for the various 'extra' bits in the values. The memory map may help elucidate my problem somewhat:</p>
  
  <p><img src="https://i.stack.imgur.com/IoYQe.png" alt="RTCC Memory Map"></p>
  
  <p>Taking, for example, the hours column, or the 02h address. Bit 6 is set as 1 to toggle 12 hour time, adding 01000000 to the hours bit. I can read back the entire contents of the byte at this address, but I want to employ an if statement to detect whether 12 or 24 hour time is in place, and adjust accordingly. I'm not worried about the 10-hour bits, as I can calculate that easily enough with a BCD conversion loop (I think). </p>
  
  <p>I earlier used the bitwise OR operator in C to augment the original hours data to 24. I initialised the hours in this particular case to 0x11, and set the 12 hour control bit which is 0x64. When setting the time:</p>
  
  <pre><code>WriteI2C(0x11|0x64);
  </code></pre>
  
  <p>which as you can see uses the bitwise OR.</p>
  
  <p>When reading back the hours, how can I incorporate operators into my code to separate the superfluous bits from the actual time bits? I tried doing something like this:</p>
  
  <pre><code>current_seconds = ReadI2C();
  current_seconds = ST &amp; current_seconds;
  </code></pre>
  
  <p>but that completely ruins everything. It compiles, but the device gets 'stuck' on this sequence.</p>
  
  <p><strong>How do I separate the ST / AMPM / VBATEN bits from the actual data I need, and what would a good method be of implementing for loops for the various circumstances they present (e.g. reading back 12 hour time if bit 6 = 0 and 24 hour time if bit6 = 1, and so on).</strong></p>
  
  <p>I'm a bit of a C novice and this is my first foray into electronics so I really appreciate any help. Thanks.</p>