# Authored by Jonathan Scott James the great On WOKWI
# LCD 1602 8 bit bitbang For general purpose interface as car tachometer voltage meter chronometer frequency counter waveform monitor for generator
machine.Pin(26, machine.Pin.IN) #ADC
machine.Pin(27, machine.Pin.IN, machine.Pin.PULL_DOWN) #key 2 bottom key
machine.Pin(28, machine.Pin.IN, machine.Pin.PULL_DOWN) #key 1 top key
ttt=1;t=3600*24*366+28;t=3600*24*22-9 # python sets the precisio level when you first assign the number according to what will fit in the value you assign it to.
k=0;k1=0;b=0;b1=0;ti=t
def tickjsj():
global ti
ti=ti+.2
machine.Timer().init(freq=5, callback=lambda t:tickjsj())
for initpins in range (11): # Initialize gpio 0 threw gpio 10 as output mode
machine.Pin(initpins, machine.Pin.OUT) #(e)enable
machine.lightsleep(200)#initialization oause after power up .5 seconds
#init lcd Module
machine.Pin(10).value(0) # Enable 1=Enable
machine.Pin(9).value(0)#RS instruction=0 data=1
machine.Pin(7).value(0) #d7
machine.Pin(6).value(0) #d6
machine.Pin(5).value(0) #d5
machine.Pin(4).value(0) #d4
machine.Pin(3).value(1) #d3
machine.Pin(2).value(1) #d2
machine.Pin(1).value(0) #d1
machine.Pin(0).value(0) #d0
machine.Pin(10).value(1) # Enable 1=Enable
machine.lightsleep(1)
machine.Pin(10).value(0) # Enable 1=Enable
machine.lightsleep(1)
machine.Pin(9).value(1) #RS instruction=0 data=1
#************end init***********************
tt=" "
eightbitsevensegreversed="00111111000001100101101101001111011001100110110101111101000001110111111101101111"
ssebr=eightbitsevensegreversed
k=0;b=0;k2=0;b2=0
puter=bytearray(1)
while 1:#start displat
k=machine.Pin(28).value()#read pin 28 which is connected to key1
if (k>b):
k1=k1+1-4*(k1>3)
b=k
k2=machine.Pin(27).value()#read pin 27 which is Connected to key2
if (k2>b2):
k1=k1+1-4*(k1>3)
b2=k2
rvdc=machine.ADC(26).read_u16() #read adc into variable
if ti!=ttt:
ttt=ti
t=int(ti)
s=str(int((t/60-t//60)*60));m=str(int((t/3600-t//3600)*60));h=str(int((t/86400-t//86400)*24));d=str(t//86400);w=str((t//86400*7)) # Extrapolate seconds hours minutes and days from raw uptime seconds
tt=("00"+d)[-2:]+":"+("00"+h)[-2:]+":"+("00"+m)[-2:]+":"+("00"+s)[-2:] # compile the output buffer
#target string
af=tt+" ("+str(b)+str(b2)+")"+str(rvdc)+"VDC "
#****************
machine.Pin(9).value(0) #RS instruction=0 data=1
machine.Pin(7).value(0) #d7
machine.Pin(6).value(0) #d6
machine.Pin(5).value(0) #d5
machine.Pin(4).value(0) #d4
machine.Pin(3).value(0) #d3
machine.Pin(2).value(0) #d2
machine.Pin(1).value(1) #d1 #home instrtction
machine.Pin(0).value(0) #d0
machine.Pin(10).value(1) # Enable 1=Enable
# machine.lightsleep(1)
machine.Pin(10).value(0) # Enable 1=Enable
# machine.lightsleep(1)
machine.Pin(9).value(1)#RS instruction=0 data=1
for cx in range (len(af)):# print the string one character at a time
ds= str("00000000"+bin(ord(af[cx]))[2:12])[-8:17]
# Write character(Bang all 8seven data pins in one line
machine.Pin(7).value(int(str(ds)[0])); machine.Pin(6).value(int(str(ds)[1])); machine.Pin(5).value(int(str(ds)[2])); machine.Pin(4).value(int(str(ds)[3])); machine.Pin(3).value(int(str(ds)[4])); machine.Pin(2).value(int(str(ds)[5])); machine.Pin(1).value(int(str(ds)[6])); machine.Pin(0).value(int(str(ds)[7])) # d0-d7
# machine.Pin(7,int(str(ds)[0]));machine.Pin(6,int(str(ds)[1]));machine.Pin(5,int(str(ds)[2]));machine.Pin(4,int(str(ds)[3]));machine.Pin(3,int(str(ds)[4]));machine.Pin(2,int(str(ds)[5]));machine.Pin(1,int(str(ds)[6]));machine.Pin(0,int(str(ds)[7]));
machine.Pin(10).value(1) # Enable 1=Enable
# machine.lightsleep(1)
machine.Pin(10).value(0) # Enable 1=Enable
# machine.lightsleep(1) # slow effect
if (cx==15):#set cursor to line 2
machine.Pin(9).value(0)#RS instruction=0 data=1
machine.Pin(7).value(1) #d7
machine.Pin(6).value(0) #d6
machine.Pin(5).value(0) #d5
machine.Pin(4).value(1) #d4
machine.Pin(3).value(1) #d3
machine.Pin(2).value(0) #d2
machine.Pin(1).value(1) #d1
machine.Pin(0).value(0) #d0
machine.Pin(10).value(1) # Enable 1=Enable
# machine.lightsleep(1)
machine.Pin(10).value(0) # Enable 1=Enable
# machine.lightsleep(1)
machine.Pin(9).value(1)#RS instruction=0 data=1
for clcks in range(14):# 15 analogous clock cycles required at some point.
machine.Pin(10).value(1) # Enable 1=Enable
# machine.lightsleep(1)
machine.Pin(10).value(0) # Enable 1=Enable
# machine.lightsleep(1)