maxint-rd / TM16xx

Arduino TM16xx library for LED & KEY and LED Matrix modules based on TM1638, TM1637, TM1640 and similar chips. Simply use print() on 7-segment and use Adafruit GFX on matrix.
164 stars 34 forks source link

Add pinMode() to sendData() and getButtons() #33

Open gary7530 opened 1 year ago

gary7530 commented 1 year ago

TM16XX and DS1302 their pin definitions are very similar, so I connect their pins together to do use. The DS1302 also uses pinMode() to change the GPIO settings, so I recommend adding pinMode() to sendData() to make sure it doesn't cause any problems in use.

void TM16xx::sendData(byte address, byte data)
{
  // Pull-up off
  pinMode(dataPin, OUTPUT);
  digitalWrite(dataPin, LOW);

  sendCommand(TM16XX_CMD_DATA_FIXED);                           // use fixed addressing for data
  start();
  send(TM16XX_CMD_ADDRESS | address);                       // address command + address
  send(data);
  stop();
}
uint32_t TM1620B::getButtons(void)
{
    // Pull-up off
    pinMode(dataPin, OUTPUT);
    digitalWrite(dataPin, LOW);

    word keys_K2 = 0;
    byte received;

    start();
    send(TM16XX_CMD_DATA_READ); // send read buttons command
    for (int i = 0; i < 3; i++)
    {
        received = receive();
        keys_K2 |= ((((received & _BV(1)) >> 1) | ((received & _BV(4)) >> 3)) << (2 * i));
    }
    stop();
    return (uint32_t)keys_K2;
}
maxint-rd commented 1 year ago

Hello @gary7530 , thank you for your suggestion. I know that for I2C it is custom to only drive a pin low when sending data and keep it floating on high impedence when inactive, having pull-up resistors on the databus. For the TM16xx I've seen another implementation doing the same.

I appreciate your suggestion as it allows for wider use of shared pins when combining other libraries. I do have a DS1302 module in my collection, so when I can find some time I will have a look and test your suggestion and assess its impact. I will keep this issue open and post my finding here.