84 lines
2.2 KiB
Python
84 lines
2.2 KiB
Python
# KeyPad Vers #2
|
|
# Tony Goodhew 9th May 2020
|
|
# https://www.instructables.com/Using-a-4x4-KeyPad-With-CircuitPython/
|
|
#
|
|
# Changes by Christopher Scheuring 2022-05-13 for ESP32 support
|
|
#
|
|
# Connections left to right on KeyPad
|
|
# 0 1 2 3 4 5 6 7
|
|
# 13 12 14 27 15 02 04 16
|
|
|
|
from machine import Pin
|
|
import gc
|
|
import time
|
|
|
|
gc.collect() # make some room
|
|
|
|
# Set up LED on pin 17
|
|
led_pin = 17
|
|
|
|
led = Pin(led_pin, Pin.OUT)
|
|
led.on() # switch off led - inverted logic!
|
|
|
|
# Set up Rows
|
|
rows = []
|
|
for p in [13, 12, 14, 27]:
|
|
row = Pin(p, Pin.OUT)
|
|
rows.append(row)
|
|
# anodes OFF
|
|
for i in range(4):
|
|
rows[i].off()
|
|
|
|
# Set up columns
|
|
cols = []
|
|
for p in [15, 02, 04, 16]:
|
|
col = Pin(p, Pin.IN, Pin.PULL_DOWN)
|
|
cols.append(col)
|
|
|
|
def getkey(): # Returns -999 or key value
|
|
values = [1,2,3,10, 4,5,6,11, 7,8,9,12, 14,0,15,13]
|
|
val = -999 # Error value for no key press
|
|
for count in range(10): # Try to get key press 10 times
|
|
for r in range(4): # Rows, one at a time
|
|
rows[r].on() # row HIGH
|
|
for c in range(4): # Test columns, one at a time
|
|
if cols[c].value() == 1: # Is column HIGH?
|
|
p = r * 4 + c # Pointer to values list
|
|
val = values[p]
|
|
count = 11 # This stops looping
|
|
led.off() # Flash LED ON if key pressed
|
|
rows[r].off() # row LOW
|
|
time.sleep(0.2) # Debounce
|
|
led.on() # LED OFF
|
|
return val
|
|
|
|
def getvalue(digits): # Number of digits
|
|
result = 0
|
|
count = 0
|
|
while True:
|
|
x = getkey()
|
|
if x != -999 and x < 10: # Check if numeric key pressed
|
|
result = result * 10 + x
|
|
print(result)
|
|
count = count + 1
|
|
if count == digits:
|
|
return result
|
|
|
|
# +++++ Main +++++
|
|
print("Press 4 numeric (BLUE) keys")
|
|
y = getvalue(4)
|
|
print('\n',y)
|
|
|
|
print("\nPress any of the keys\n # halts the program")
|
|
|
|
characters =["1","2","3","4","5","6","7","8","9","A","B","C","D","*","#","0"]
|
|
running = True
|
|
while running:
|
|
x = getkey()
|
|
if x != -999: # A key has been pressed!
|
|
print(characters[x-1])
|
|
if x == 15:
|
|
running = False
|
|
|
|
led.on()
|