Close

Working with the charlieplexed buttons

A project log for Skeleton Attiny85 Handheld

I2C OLED connected to an Attiny85 and a Charlie-plexed button matrix

davedarkodavedarko 01/08/2019 at 21:080 Comments

I admit it was a bit trial and error development, but it worked out in the end.

#define pin_1 1
#define pin_2 4
#define pin_3 3

#define B_UP 0
#define B_DN 1
#define B_LF 2
#define B_RT 3
#define B_A 4
#define B_B 5

boolean pinChanged = false;
uint8_t pinstate = 0;
uint8_t pins[3] = { pin_1, pin_2, pin_3 };
uint8_t switches[6][2] =
{
  { pin_2, pin_1 },
  { pin_1, pin_3 },
  { pin_3, pin_1 },
  { pin_1, pin_2 },
  { pin_3, pin_2 },
  { pin_2, pin_3 }
};



void setup()
{
}

void loop()
{
  if (pinChanged)
  {
    pinChanged = false;
    if (pinstate & (1 << B_UP))
    { 
    }

    if (pinstate & (1 << B_DN))
    {
    }
    
    if (pinstate & (1 << B_LF))
    {
    }
    
    if (pinstate & (1 << B_RT))
    {
    }
    
    if (pinstate & (1 << B_A))
    {
    }
    
    if (pinstate & (1 << B_B))
    {
    }
  }

  for (uint8_t i = 0; i < 6; i++)
  {
    deactivate_all();

    // set pin states for button
    pinMode(switches[i][0], INPUT_PULLUP);
    pinMode(switches[i][1], OUTPUT);
    digitalWrite(switches[i][1], LOW);


    if (pinstate & (1 << i))
    {
      if (digitalRead(switches[i][0]) == HIGH)
      {
        pinstate &= ~(1 << i);
        pinChanged = true;
      }
    }
    else
    {
      if (digitalRead(switches[i][0]) == LOW)
      {
        pinstate |= (1 << i);
        pinChanged = true;
      }
    }
  }
}

void deactivate_all()
{
  for (uint8_t i = 0; i < 3; i++)
  {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], HIGH);
  }
}

Discussions