from machine import Pin
from time import sleep
from collections import OrderedDict
digits = [ Pin(i, Pin.OUT) for i in range(4, 8) ]
segments = [ Pin(i, Pin.OUT) for i in range(8, 15) ]
point = Pin(15, Pin.OUT)
matrix = (
('1', '2', '3', 'A'),
('4', '5', '6', 'B'),
('7', '8', '9', 'C'),
('*', '0', '#', 'D')
)
rows = [ Pin(i, Pin.OUT) for i in [21, 22, 26, 27] ]
columns = [ Pin(i, Pin.IN, Pin.PULL_DOWN) for i in [0, 1, 2, 3] ]
tableAnode = OrderedDict({
'0': (0, 0, 0, 0, 0, 0, 1),
'1': (1, 0, 0, 1, 1, 1, 1),
'2': (0, 0, 1, 0, 0, 1, 0),
'3': (0, 0, 0, 0, 1, 1, 0),
'4': (1, 0, 0, 1, 1, 0, 0),
'5': (0, 1, 0, 0, 1, 0, 0),
'6': (0, 1, 0, 0, 0, 0, 0),
'7': (0, 0, 0, 1, 1, 1, 1),
'8': (0, 0, 0, 0, 0, 0, 0),
'9': (0, 0, 0, 0, 1, 0, 0),
'-': (1, 1, 1, 1, 1, 1, 0),
' ': (1, 1, 1, 1, 1, 1, 1)
})
def setDigits(x):
displayCharacter(' ')
for i in range(4):
digits[i].value(x[i])
def turnOnDigit(x):
setDigits([0, 0, 0, 0])
digits[x].value(1)
def displayCharacter(x):
values = tableAnode.get(x)
for i in range(7):
segments[i].value(values[i])
def displayNumber(x):
x = [ chr((x // i) % 10 + ord('0')) for i in (1000, 100, 10, 1) ]
for i in range(4):
turnOnDigit(i)
displayCharacter(x[i])
sleep(0.01)
def scanKeypad():
for i in range(4):
rows[i].value(1)
for j in range(4):
if columns[j].value():
rows[i].value(0)
return matrix[i][j]
rows[i].value(0)
return ' '
def enterPin():
pin = "0000"
released = True
while True:
key = scanKeypad()
if key == ' ':
released = True
elif key == '#':
displayCharacter(' ')
return pin[-4:]
if key >= '0' and key <= '9' and released:
released = False
pin = pin + key
displayNumber(int(pin))
sleep(0.01)
def countdown10():
for i in "9876543210":
displayCharacter(i)
sleep(1)
def checkPin(x):
point.value(1)
attempt = 0
while enterPin() != x:
setDigits([1, 1, 1, 1])
attempt = attempt + 1
if attempt == 3:
countdown10()
attempt = 0
else:
for i in range(5):
displayCharacter('-')
sleep(0.5)
displayCharacter(' ')
sleep(0.5)
setDigits([1, 1, 1, 1])
for i in range(5):
point.value(0)
sleep(0.5)
point.value(1)
sleep(0.5)
checkPin("1234")