from machine import Pin
from utime import sleep
class Display: #Clasee Display
#Constructor
def __init__(self, pd, a, b, c, d, e, f, g):
self.a = Pin(a, Pin.OUT) # Configuración de lo pines asignados como salidas
self.b = Pin(b, Pin.OUT)
self.c = Pin(c, Pin.OUT)
self.d = Pin(d, Pin.OUT)
self.e = Pin(e, Pin.OUT)
self.f = Pin(f, Pin.OUT)
self.g = Pin(g, Pin.OUT)
self.digitos = [ # Matriz del displey 7 segmaentos anodo común
[0, 0, 0, 0, 0, 0, 1], # 0
[1, 0, 0, 1, 1, 1, 1], # 1
[0, 0, 1, 0, 0, 1, 0], # 2
[0, 0, 0, 0, 1, 1, 0], # 3
[1, 0, 0, 1, 1, 0, 0], # 4
[0, 1, 0, 0, 1, 0, 0], # 5
[0, 1, 0, 0, 0, 0, 0], # 6
[0, 0, 0, 1, 1, 1, 1], # 7
[0, 0, 0, 0, 0, 0, 0], # 8
[0, 0, 0, 1, 1, 0, 0] # 9
]
#Metodos
def mostrar(self, numero): #Metodo para visualizar los segmetos activados
segmentos = self.digitos[numero] #Se le asigna a cada pin un estado segun el númer presionado
self.a.value(segmentos[0])
self.b.value(segmentos[1])
self.c.value(segmentos[2])
self.d.value(segmentos[3])
self.e.value(segmentos[4])
self.f.value(segmentos[5])
self.g.value(segmentos[6])
def apagar(self): #Metodo para apagar todos los segmntos del display
for pin in [self.a, self.b, self.c, self.d, self.e, self.f, self.g]:
pin.value(1)
#----------------------------------------------------------------------------------
class Teclado: #Clase Teclado
#Constructor
def __init__(self,columnas,filas):
#Recorre la Lista filas que hace referencia a los pines asignados a tal fín como entrada
self.filas=[Pin(pin, Pin.IN,Pin.PULL_DOWN) for pin in filas]
#Recorre la Lista columnas que hace referencia a los pines asignados a tal fín como salida
self.columnas=[Pin(pin, Pin.OUT) for pin in columnas]
self.matriz=[
['1', '2', '3','A'], #matriz del teclado utilizado
['4', '5', '6','B'],
['7', '8', '9','C'],
['*', '0', '#','D']
]
#Metodos
def leer(self): #Lee la matriz (j: fila , i: columna)
for i, columna in enumerate(self.columnas): #Recorre la lista columna y pone en alto las salidas de los pines
columna.value(1)
for j, fila in enumerate(self.filas): #Recorre la lista fila en busca de una tecla precionada.
actual=fila.value()
if actual==1:
sleep(0.2) # Espera 200ms para evitar rebotes
columna.value(0)# Desactiva la coluna
return self.matriz[j][i]#Devuelve las cordenadas de la tecla presionada
columna.value(0)#Apaga la columna si no se presionó ninguna tecla
return None
#------------------------------------------------------------------
class Led: #Clase Led
#Constructo
def __init__(self, pin_led):
self.pin_led=Pin(pin_led, Pin.OUT)
self.pin_led.value(1)
#Metodos
def par(self,num): # Si es par enciende el led
resto = num % 2
if resto == 0:
self.pin_led.value(0)
else:
self.pin_led.value(1)
def impar(self, num): #Si es impar enciende el led
resto = num % 2
if resto > 0:
self.pin_led.value(0)
else:
self.pin_led.value(1)
# Destello si es par o impar segun lo seteado por "A o B"
def destello_par_impar(self, estado,conmutar, num):
if num is not None:
resto = num % 2
if conmutar:
if resto == 0:
self.pin_led.value(estado)
sleep(0.2)
else:
self.pin_led.value(1)
else:
if resto > 0:
self.pin_led.value(estado)
sleep(0.2)
else:
self.pin_led.value(1)
else:
# Si no se proporciona número, simplemente cambiar estado
self.pin_led.value(estado)
sleep(0.2)
#-----------------------------------------------------------------
# Crear una instancia (objeto) del display con pines del [1 ... 7]
mi_display = Display(0,1, 2, 3, 4, 5, 6, 7)
# Crear una instancia (objeto) de los pines de la matriz del teclado
teclado = Teclado(
columnas=[8, 9, 10, 11],
filas=[12, 13, 14, 15]
)
# Crea una instancia (objeto) del pin(28) del Led
mi_led= Led(28)
mi_display.apagar()
on_off = False
conmut = True
estado = True # Modo destello activado
lec=0
while True:
lectura = teclado.leer()
#Modo destello
if on_off :
mi_led.destello_par_impar(estado,conmut,lec)
estado = not estado
if lectura is not None :
if lectura == "A":
#Activar modo destello
mi_led.destello_par_impar(True,conmut,lec)
on_off=True #Modo destello activado
print(f"Tecla presionada: {lectura}")
elif lectura == "B":
#Activar modo fijo Led encendido números par
mi_led.par(lec)
conmut=True
on_off=False #Modo fijo activado números par
print(f"Tecla presionada: {lectura}")
elif lectura == "C":
#Activar modo fijo Led encendido números impar
mi_led.impar(lec)
conmut=False
on_off=False #Modo fijo activado números impar
print(f"Tecla presionada: {lectura}")
elif lectura=="D":
# Activa el modo parpadeo display
while True:
sleep(0.3)
mi_display.mostrar(lec)
sleep(0.3)
mi_display.apagar()
cualquier_tecla=teclado.leer()
print(f"Tecla presionada: {cualquier_tecla}")
#Al presionar cualquier tecla sale del modo parpadeo
if cualquier_tecla is not None:
mi_display.mostrar(lec)
break
else:
# Tecla numérica (0-9)
# La siguiente línea es una expresión condicional
# True: Si la cadena solo contiene dígitos numéricos
# False: Si la cadena contiene caracteres que no son dígitos
# Utilizo el metodo de cadena "isdigit()" para verificar que la en cadena hay numeros del 0-9
lec = int(lectura) if lectura.isdigit() else 0
print(f"Tecla presionada: {lec}")
mi_display.apagar()
sleep(0.2)
mi_display.mostrar(lec)
if on_off:
# Modo destello - mostrar estado inicial
mi_led.destello_par_impar(True, conmut, lec)
else:
# Modo fijo
if conmut:
mi_led.par(lec)
else:
mi_led.impar(lec)