# Engineering By NobodyHolmes
import machine
import utime
import time
# ANODE 0 1 2 3 4 5 6 7 8 9
# SEGCODE = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f]
# CLEARSEGCODE = 0x00
# FLOODSEGCODE = 0xff
# CATHODE 0 1 2 3 4 5 6 7 8 9
SEGCODE = [0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90]
CLEARSEGCODE = 0xff
FLOODSEGCODE = 0x00
CHARACTERS = [["1","2","3","A"],["4","5","6","B"],["7","8","9","C"],["*","0","#","D"]]
# Variables
# A_____
# Seven Segment Display A - DS PIN from 74HC595 A
disA_DS = machine.Pin(0, machine.Pin.OUT)
# Seven Segment Display A - STCP PIN from 74HC595 A
disA_STcp = machine.Pin(1, machine.Pin.OUT)
# Seven Segment Display A - SHCP PIN from 74HC595 A
disA_SHcp = machine.Pin(2, machine.Pin.OUT)
# _B____
# Seven Segment Display B - DS PIN from 74HC595 B
disB_DS = machine.Pin(3, machine.Pin.OUT)
# Seven Segment Display B - STCP PIN from 74HC595 B
disB_STcp = machine.Pin(4, machine.Pin.OUT)
# Seven Segment Display B - SHCP PIN from 74HC595 B
disB_SHcp = machine.Pin(5, machine.Pin.OUT)
# __C___
# Seven Segment Display C - DS PIN from 74HC595 C
disC_DS = machine.Pin(6, machine.Pin.OUT)
# Seven Segment Display C - STCP PIN from 74HC595 C
disC_STcp = machine.Pin(7, machine.Pin.OUT)
# Seven Segment Display C - SHCP PIN from 74HC595 C
disC_SHcp = machine.Pin(8, machine.Pin.OUT)
# ___D__
# Seven Segment Display D - DS PIN from 74HC595 D
disD_DS = machine.Pin(9, machine.Pin.OUT)
# Seven Segment Display D - STCP PIN from 74HC595 D
disD_STcp = machine.Pin(10, machine.Pin.OUT)
# Seven Segment Display D - SHCP PIN from 74HC595 D
disD_SHcp = machine.Pin(11, machine.Pin.OUT)
# ____E_
# Seven Segment Display E - DS PIN from 74HC595 E
disE_DS = machine.Pin(16, machine.Pin.OUT)
# Seven Segment Display E - STCP PIN from 74HC595 E
disE_STcp = machine.Pin(17, machine.Pin.OUT)
# Seven Segment Display E - SHCP PIN from 74HC595 E
disE_SHcp = machine.Pin(18, machine.Pin.OUT)
# _____F
# Seven Segment Display E - DS PIN from 74HC595 F
disF_DS = machine.Pin(19, machine.Pin.OUT)
# Seven Segment Display E - STCP PIN from 74HC595 F
disF_STcp = machine.Pin(20, machine.Pin.OUT)
# Seven Segment Display E - SHCP PIN from 74HC595 F
disF_SHcp = machine.Pin(21, machine.Pin.OUT)
# Variable for checking key pressed
last_key = None
# Variable used for currently displayed number
currentDisplay = None
# Setup Pins Used For KeyPad
# Rows
pin = [12,13,14,15]
row = []
for i in range(4):
row.append(None)
row[i] = machine.Pin(pin[i], machine.Pin.OUT)
# Columns
pin = [22,26,27,28]
col = []
for i in range(4):
col.append(None)
col[i] = machine.Pin(pin[i], machine.Pin.IN)
# Count Variable
count = 0
# Welcome Message
print("Raspberry Pico. Keypad and 6 Digit 7 Segment Display")
print("Type on Keypad")
# Definitions
# Displays dat(SEGCODE) To 74HC595 3
def h595_shift(ds,STcp,SHcp,segcode):
STcp.low()
time.sleep_ms(1)
for bit in range(7, -1, -1):
SHcp.low()
time.sleep_ms(1)
value = 1 & (segcode >> bit)
ds.value(value)
time.sleep_ms(1)
SHcp.high()
time.sleep_ms(1)
STcp.high()
time.sleep_ms(1)
def clearDisplay():
# Update Each 74HC595 with seleted SEGCODES in order F then E then D then C then B then A
h595_shift(disF_DS, disF_STcp, disF_SHcp, CLEARSEGCODE)
h595_shift(disE_DS, disE_STcp, disE_SHcp, CLEARSEGCODE)
h595_shift(disD_DS, disD_STcp, disD_SHcp, CLEARSEGCODE)
h595_shift(disC_DS, disC_STcp, disC_SHcp, CLEARSEGCODE)
h595_shift(disB_DS, disB_STcp, disB_SHcp, CLEARSEGCODE)
h595_shift(disA_DS, disA_STcp, disA_SHcp, CLEARSEGCODE)
# Displays dat(int(Number)) To Displays(in segments)
def showNumber(dat):
# Take dat and turn it into string to break into an array
strNumerals = str(dat);
arrNumerals = [char for char in strNumerals]
numeralLen = len(arrNumerals)
A_digit_seg = CLEARSEGCODE
B_digit_seg = CLEARSEGCODE
C_digit_seg = CLEARSEGCODE
D_digit_seg = CLEARSEGCODE
E_digit_seg = CLEARSEGCODE
F_digit_seg = CLEARSEGCODE
# Check How Many Digits
if numeralLen == 1:
# 1 Digit
F_digit_seg = SEGCODE[int(arrNumerals[0])]
elif numeralLen == 2:
# 2 Digit
E_digit_seg = SEGCODE[int(arrNumerals[0])]
F_digit_seg = SEGCODE[int(arrNumerals[1])]
elif numeralLen == 3:
# 3 Digit
D_digit_seg = SEGCODE[int(arrNumerals[0])]
E_digit_seg = SEGCODE[int(arrNumerals[1])]
F_digit_seg = SEGCODE[int(arrNumerals[2])]
elif numeralLen == 4:
# 4 Digit
C_digit_seg = SEGCODE[int(arrNumerals[0])]
D_digit_seg = SEGCODE[int(arrNumerals[1])]
E_digit_seg = SEGCODE[int(arrNumerals[2])]
F_digit_seg = SEGCODE[int(arrNumerals[3])]
elif numeralLen == 5:
# 5 Digit
B_digit_seg = SEGCODE[int(arrNumerals[0])]
C_digit_seg = SEGCODE[int(arrNumerals[1])]
D_digit_seg = SEGCODE[int(arrNumerals[2])]
E_digit_seg = SEGCODE[int(arrNumerals[3])]
F_digit_seg = SEGCODE[int(arrNumerals[4])]
elif numeralLen == 6:
# 6 Digit
A_digit_seg = SEGCODE[int(arrNumerals[0])]
B_digit_seg = SEGCODE[int(arrNumerals[1])]
C_digit_seg = SEGCODE[int(arrNumerals[2])]
D_digit_seg = SEGCODE[int(arrNumerals[3])]
E_digit_seg = SEGCODE[int(arrNumerals[4])]
F_digit_seg = SEGCODE[int(arrNumerals[5])]
else:
# Empty all should be low(cleared)
A_digit_seg = FLOODSEGCODE
B_digit_seg = FLOODSEGCODE
C_digit_seg = FLOODSEGCODE
D_digit_seg = FLOODSEGCODE
E_digit_seg = FLOODSEGCODE
F_digit_seg = FLOODSEGCODE
# Update Each 74HC595 with seleted SEGCODES in order F then E then D then C then B then A
h595_shift(disF_DS, disF_STcp, disF_SHcp, F_digit_seg)
h595_shift(disE_DS, disE_STcp, disE_SHcp, E_digit_seg)
h595_shift(disD_DS, disD_STcp, disD_SHcp, D_digit_seg)
h595_shift(disC_DS, disC_STcp, disC_SHcp, C_digit_seg)
h595_shift(disB_DS, disB_STcp, disB_SHcp, B_digit_seg)
h595_shift(disA_DS, disA_STcp, disA_SHcp, A_digit_seg)
def readKey():
key = []
for i in range(4):
row[i].high()
for j in range(4):
if(col[j].value() == 1):
key.append(CHARACTERS[i][j])
row[i].low()
if key == [] :
return None
else:
return key
# Default Clear Display
clearDisplay()
while True:
current_key = readKey()
if current_key == last_key:
continue
last_key = current_key
if current_key != None:
print(current_key)
if current_key[0] == "A":
# A Pressed
currentDisplay = None
elif current_key[0] == "B":
# B Pressed
currentDisplay = None
elif current_key[0] == "C":
# C Pressed
currentDisplay = None
elif current_key[0] == "D":
# D Pressed
currentDisplay = None
elif current_key[0] == "#":
# # Pressed
currentDisplay = None
elif current_key[0] == "*":
# * Pressed
currentDisplay = None
else:
# Number Pressed
if currentDisplay == None:
currentDisplay = current_key[0];
else:
currentDisplay += current_key[0]
if currentDisplay == None:
clearDisplay()
else:
showNumber(int(currentDisplay))
time.sleep(0.1)