Bit Masking

What I typically do in this case is something like this:

#define KEY1  (1<<0)
#define KEY2  (1<<1)
...
#defiine KEYs (KEY1 | KEY2 | ...)

  switch ((~key_read()) & KEYs) {
    case KEY1: //do something
    case KEY2: //do something else
  }
...

It is easier to read and to maintain, but it is slower - which usually isn't important for human interactions.