# --------------------------------------------------------------------------- #
# Este programa conecta un teclado matricial a la Raspberry Pi Pico y, por cada tecla
# que se presione, generará un número binario del 0 al 15 y lo imprimirá por
# consola. Además, lo mostrará en una pantalla LCD I2C.
#
# -> Los pines (GPIO) usados para el teclado de izquierda a derecha fueron: filas (13, 12, 11, 10)
# y columnas (9, 8, 7, 6)
#
# -> Se usará un LCD 16x2 con I2C para mostrar los números binarios
# --------------------------------------------------------------------------- #
from machine import Pin, I2C
from time import sleep
import utime
from lcd_api import LcdApi
from pico_i2c_lcd import I2cLcd
# Banderas para saber si se presionó una tecla
TECLA_ARRIBA = const(0)
TECLA_ABAJO = const(1)
# Matriz de todas las teclas que contiene el teclado matricial
teclas = [['1', '2', '3', 'A'], ['4', '5', '6', 'B'], ['7', '8', '9', 'C'], ['*', '0', '#', 'D']]
# Pines del GPIO
filas = [13, 12, 11, 10]
columnas = [9, 8, 7, 6]
# Define los pines de filas como salidas
fila_pines = [Pin(nombre_pin, mode=Pin.OUT) for nombre_pin in filas]
# Define los pines de columnas como entradas
columna_pines = [Pin(nombre_pin, mode=Pin.IN, pull=Pin.PULL_DOWN) for nombre_pin in columnas]
# Configuración del LCD
I2C_ADDR = 0x27
I2C_NUM_ROWS = 2
I2C_NUM_COLS = 16
# Objeto I2C en Raspberry Pi Pico
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
# Configuración LCD
lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)
def lcd_str(message, col, row):
lcd.move_to(col, row)
lcd.putstr(message)
# Esta función manda un cero a todas las filas o teclas del teclado matricial
# para luego seguir explorando una fila a la vez con la función SCAN
def init():
for fila in range(4):
for columna in range(4):
fila_pines[fila].low()
# Esta función pone en alto la fila indicada y con los condicionales explora
# la columna indicada en los parámetros y devuelve el estado de la tecla
def scan(fila, columna):
""" Escanea todo el teclado """
# Define la columna actual en alto -high-
fila_pines[fila].high()
tecla = None
# Verifica por teclas si hay teclas presionadas
if columna_pines[columna].value() == TECLA_ABAJO:
tecla = TECLA_ABAJO
if columna_pines[columna].value() == TECLA_ARRIBA:
tecla = TECLA_ARRIBA
fila_pines[fila].low()
# Devuelve el estado de la tecla
return tecla
# Esta función es la que genera el número binario y lo muestra en el LCD
def binaryNums(tecla):
bin_value = {
'0': "0000", '1': "0001", '2': "0010", '3': "0011",
'4': "0100", '5': "0101", '6': "0110", '7': "0111",
'8': "1000", '9': "1001", 'A': "1010", 'B': "1011",
'C': "1100", 'D': "1101", '*': "1110", '#': "1111"
}
binary_representation = bin_value.get(tecla, "----")
lcd.clear()
#lcd_str("Tecla: {}".format(tecla), 0, 0)
lcd_str("Bin: {}".format(binary_representation), 0, 1)
print("Esperando que presione una tecla")
# Define todas las filas y columnas bajo -low-
init()
while True:
for fila in range(4):
for columna in range(4):
tecla = scan(fila, columna)
if tecla == TECLA_ABAJO:
# Copio la tecla presionada en string
pressed = teclas[fila][columna]
# Imprimo la tecla presionada
print("Tecla Presionada", pressed)
sleep(0.5)
ultima_tecla_presionada = teclas[fila][columna]
# Llamo a la función que muestra el binario correspondiente a la tecla en el LCD
binaryNums(pressed)