Els vuit botons de la placa estan connectats a un registre de desplaçament que ens permet llegir els vuit polsadors amb una única entrada. El registre de desplaçament converteix les lectures dels vuit polsadors en una seqüència de vuit bits (un per polsador) i la biblioteca converteix aquesta seqüència en un valor enter.
Disposem de dues biblioteques per a llegir els polsadors: ugame i keypad. La primera és adequada si fem servir gràfics fets amb stage, mentre que la segona és la que convé si fem els gràfics amb displayio.
La taula següent ens mostra el que obtindrem amb cada polsador, segons la biblioteca emprada.
| Polsador | Nom del polsador (✶) | ugame | keypad | |
| Bit | Valor llegit (★) | Valor llegit | ||
| B | K_X | 0 | 1 | 0 |
| A | K_O | 1 | 2 | 1 |
| Start | K_START | 2 | 4 | 2 |
| Select | K_SELECT | 3 | 8 | 3 |
| Dreta | K_RIGHT | 4 | 16 | 4 |
| Avall | K_DOWN | 5 | 32 | 5 |
| Amunt | K_UP | 6 | 64 | 6 |
| Esquerra | K_LEFT | 7 | 128 | 7 |
✶ Aquests són els noms que fa servir la biblioteca ugame. Per a la keypad farem servir els mateixos, per evitar confusions.
★ Lectura que obtindríem amb la funció de lectura en el cas de prémer només un polsador.
Si, per exemple, volem veure si s'ha premut el polsador select podem fer:
boto = ugame.buttons.get_pressed() # Llegeix els botons if boto & ugame.K_SELECT: # Accio per quan es prem el boto
En aquest if hi tenim una funció & que fa una i lògica, bit a bit, entre els dos elements. El filtre és, de fet, una etiqueta que amaga el valor corresponent (en aquest cas 8) al polsador premut. A l'esquerra tenim el resultat en el cas que el polsador no estigui premut i a la dreta en cas que sí ho estigui (les X volen dir que el valor que hi hagi no afecta al resultat):
No premut Premut
boto X X X X 0 X X X X X X X 1 X X X
ugame.K_SELECT & 0 0 0 0 1 0 0 0 & 0 0 0 0 1 0 0 0
----------------- -----------------
resultat (binari) 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
resultat (decimal) 0 8
Observem que quan el polsador està premut el resultat, en aquest cas, és 8 però això no és cap problema perquè la sentència if avaluarà com a cert qualsevol valor diferent de zero. Aquesta forma de treballar admet, doncs, la possibilitat que dos o més polsadors estiguin premuts simultàniament.
El següent programa mira l'estat dels polsadors i escriu quin és el que s'ha premut. El programa guarda l'estat anterior del polsador i només escriu en el moment en que aquest s'activa.
import ugame
abans = 0
print("Prem un polsador")
while True:
boto = ugame.buttons.get_pressed() # Llegeix els botons
if not abans & ugame.K_RIGHT and boto & ugame.K_RIGHT:
print("Has premut dreta")
if not abans & ugame.K_LEFT and boto & ugame.K_LEFT:
print("Has premut esquerra")
if not abans & ugame.K_DOWN and boto & ugame.K_DOWN:
print("Has premut avall")
if not abans & ugame.K_UP and boto & ugame.K_UP:
print("Has premut amunt")
if not abans & ugame.K_SELECT and boto & ugame.K_SELECT:
print("Has premut select")
if not abans & ugame.K_START and boto & ugame.K_START:
print("Has premut start")
if not abans & ugame.K_O and boto & ugame.K_O:
print("Has premut A")
if not abans & ugame.K_X and boto & ugame.K_X:
print("Has premut B")
abans = boto
Aquesta biblioteca està menys desenvolupada i, per tant, requereix que nosaltres definim més coses. A més, cal tenir en compte que si es premen dos polsadors a la vegada ho tracta com si s'haguessin premut l'un darrere l'altre.
Per fer-la servir, primerament haurem d'importar algunes biblioteques.
import keypad import board
En aquest cas, haurem de definir nosaltres els noms dels botons.
# Noms dels botons
Noms_botons = (
"K_X",
"K_O",
"K_START",
"K_SELECT",
"K_RIGHT",
"K_DOWN",
"K_UP",
"K_LEFT"
)
També hem de definir un objecte keypad
# Objecte per llegir els botons
pad = keypad.ShiftRegisterKeys(
clock=board.BUTTON_CLOCK,
data=board.BUTTON_OUT,
latch=board.BUTTON_LATCH,
key_count=8,
value_when_pressed=True,
)
El següent programa mira l'estat dels polsadors i escriu quin és el que s'ha premut.
import keypad import board
# Noms dels botons
Noms_botons = [
"K_X",
"K_O",
"K_START",
"K_SELECT",
"K_RIGHT",
"K_DOWN",
"K_UP",
"K_LEFT"
]
# Objecte per llegir els botons
pad = keypad.ShiftRegisterKeys(
clock=board.BUTTON_CLOCK,
data=board.BUTTON_OUT,
latch=board.BUTTON_LATCH,
key_count=8,
value_when_pressed=True,
)
print("Prem un polsador")
while True:
boto = pad.events.get()
if boto and boto.pressed:
print("Has premut ", Noms_botons[boto.key_number])
Fixem-nos que disposem de boto.pressed per saber si hi ha algun botó que s'hagi mremut i encara no s'ha tingut en compte. Això ens evita haver d'estar pendent de l'estat anterior dels polsadors, com fem a l'emprar la biblioteca ugame.
Normalment, però, volem que passi alguna cosa quan premem el botó. Llavors és preferible enfocar el programa de manera diferent:
import keypad import board
# Noms dels botons K_X = 0 K_O = 1 K_START = 2 K_SELECT = 3 K_RIGHT = 4 K_DOWN = 5 K_UP = 6 K_LEFT = 7
# Objecte per llegir els botons
pad = keypad.ShiftRegisterKeys(
clock=board.BUTTON_CLOCK,
data=board.BUTTON_OUT,
latch=board.BUTTON_LATCH,
key_count=8,
value_when_pressed=True,
)
print("Prem un polsador")
while True:
boto = pad.events.get()
if boto and boto.pressed:
if boto.key_number == K_SELECT:
print("Has premut el botó Select")

Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.