Here's some code from my
optical mouse project. mDataPin and mClockPin are just integers that refer to the specific pins being manipulated.
Code:
/**
* Writes an 8-bit value to one of the optical mouse's registers.
*
* \param address The register address to write to. Valid registers for the ADNS-2610 are 0x00
* through 0x11.
* \param value The value to write.
*/
void Mouse::writeRegister(uint8 address, uint8 value)
{
address = address | 0x80; // Most significant bit is always 1, since we're doing a write (This only applies to the mouse chip)
pinMode(mDataPin, OUTPUT); // Only necessary if mDataPin is sometimes used as an input
// We start by writing the most significant bit first
for(int i = 0; i < 8; i++)
{
digitalWrite(mClockPin, 0); // Set the clock pin low
digitalWrite(mDataPin, address & 0x80); // Set the data to the next bit
digitalWrite(mClockPin, 1); // Set the clock pin high
// Now the chip reads the data pin while we go around the loop
address = address << 1; // Shift to the next bit
}
// Now write the data in exactly the same way
for(int i = 0; i < 8; i++)
{
digitalWrite(mClockPin, 0);
digitalWrite(mDataPin, value & 0x80);
digitalWrite(mClockPin, 1);
value = value << 1;
}
}