Need some help with case statement code
I am trying to build a case statement. During my main loop when I press a key it is supposed to assign the key value to a global variable. I was thinking the way I have this that it would then do something when a key is pressed but it doesn't work.
Any suggestions?
Any suggestions?
con
_clkmode = xtal1 + pll16x
_clkfreq = 80_000_000
MS_001 = _clkfreq / 1_000
RS = 9 ' VFD pin assignments
RW = 10
E = 11
DBLow = 12
DBHigh = 15
PWR = 20 ' power sense voltage divider input
EE_DEVICE_ADDR = $A0 ' EEPROM assigments
EE_BASE_ADDR = $9000
RLY_UP = 22 ' table relay outputs. up counts down
RLY_DN = 23
con
#1, HOME, #8, BKSP, TAB, LF, CLREOL, CLRDN, CR, #16, CLS ' PST formmatting control
' 0.003515185598214 ' multiplier for inches / pulse
obj
term : "fullduplexserialdp" ' for terminal output
level : "jm_grayenc2" ' 2-bit, graycode encoder
kp : "Keypad_encoder" ' keypad driver object P0 - P7
vfd : "LCD_Nx2" ' VFD driver
simp : "Simple_Numbers_plus" ' used for formating decimal places
i2c : "Basic_I2C_Driver_1" ' EEPROM driver
var
byte key_pressed
long key_stack_space[50]
pub main | newlevel, oldlevel, Pressed_Key
term.start(31, 30, %0000, 115_200) ' start terminal for test
pause(2000) ' wait 2 seconds
term.tx(CLS) ' clear terminal screen
cognew(Keys, @key_stack_space) ' launch new cog for keypad interface
dira[PWR] := 0 ' set PWR as input
dira[RLY_UP..RLY_DN] := 1 ' set relay ports as outputs
outa[RLY_UP..RLY_DN] := 0 ' initialize relay outputs to off
i2c.initialize(28) ' initialize I2C object
level.init(16, true, 0, 1707, i2c.ReadLong(i2c#BOOTPIN, EE_DEVICE_ADDR, constant(EE_BASE_ADDR + $0))) ' detented encoder on p16/p17
' initialize counter input object and get starting value from EEPROM
vfd.Init( E, RS, RW, DBHigh, DBLow ) ' initialize VFD driver
kp.start(4, 4, 0, 4, @table) ' start keypad driver
pause(1)
vfd.clear ' clear vfd screen
term.str(string("Table Controller", 13)) ' print to PST for debug
term.str(string("Version 0.08")) ' print to PST for debug
vfd.PrintStr(string("Table Controller")) ' print to VFD
vfd.SetRowCol(2, 0) ' set position to next row on VFD
vfd.PrintStr(string("Version 0.08")) ' print to VFD
pause(4000) ' wait 4 seconds
vfd.clear ' clear VFD display
term.tx(CLS) ' clear PST screen for debug
term.tx(LF) ' set position to next line in PST
term.str(string("Press PROG for Menu")) ' print to PST screen for debug
vfd.SetRowCol(2, 0) ' set position to second row on VFD
vfd.PrintStr(string("Press PROG for Menu")) ' print to VFD
pause(500) ' wait 1/2 second
repeat ' Main program loop
oldlevel := newlevel ' assign newlevel to oldlevel
term.tx(HOME) ' set PST screen to home position
vfd.SetRowCol(0, 0) ' set position on VFD to first line and home
vfd.PrintStr(string("Position: ")) ' print string to VFD
term.str(string("Position: ")) ' print string to PST screen for debug
vfd.SetPos(16) ' set postion on VFD for inches character
vfd.PrintChr($22) ' print inches character on VFD
newlevel *= 3515 ' multiply count input by scale factor to convert to inches
newlevel /= 100 ' divide new count value to scale for display
term.decdp(newlevel, 4) ' print inches value to PST screen with 4 decimal places
vfd.SetPos(10) ' set position on VFD to display inches value
vfd.PrintStr(simp.decf(newlevel, 4)) ' print inches value to VFD with 4 decimal places
repeat
if ina[PWR] == 0 ' Looks at P20 for low to indicate loss of power '
i2c.WriteLong(i2c#BOOTPIN, EE_DEVICE_ADDR, constant(EE_BASE_ADDR + $0), newlevel)
abort ' if PWR low detected then write current value to EEPROM then stop
Pressed_Key := kp.getkey ' read key press assign that value to local pressed_key variable
if Pressed_Key > 0 ' if that variable is greater than 0
key_pressed := Pressed_Key ' then assign that value to key_pressed global variable
newlevel := level.read ' read count input and assign to newlevel
until (newlevel <> oldlevel) ' go to main loop and display values whenever they differ
pub Keys | buff[6], i
repeat
case key_pressed
"X" : ' STOP key pressed
outa[RLY_UP..RLY_DN] := 0 ' turn off table motor relays
"N" : ' MINUS key pressed
outa[RLY_UP] := 1 ' turn on table up relay
vfd.SetRowCol(2, 0) ' position cursor on VFD to second line
vfd.PrintStr(string("Table UP")) ' display message on VFD
"P" : ' PLUS key pressed
outa[RLY_DN] := 1 ' turn on table down relay
vfd.SetRowCol(2, 0) ' position cursor on VFD to second line
vfd.PrintStr(string("Table DOWN")) ' display message on VFD
"R" : ' PROG button pressed
i := 0 ' set buffer pointer to 0
repeat 6 ' repeat 6 times to fill buffer with key stokes
buff[i] := kp.getKey ' waiting for next key press
i := i + 1 ' increment buffer pointer after each key press
"S" : ' START key pressed
pub pause(ms) | t
t := cnt
repeat ms
waitcnt(t += MS_001)
dat ' keypad translation table
table byte "1", "2", "3", "S"
byte "4", "5", "6", "R"
byte "7", "8", "9", "E"
byte "N", "0", "P", "X"
' Keypad layout
'
' 1 2 3 Start
' 4 5 6 Prog
' 7 8 9 Set
' - 0 + Stop

Comments
The repeat loop in Keys will process the same key press over and over because it can't distinquish an old value of key_pressed from a new value. Also, you are calling kp.getKey from two different cogs, which will cause problems. I'm not sure why you need to start Keys in a separate cog, but it might be better to just call it from the main routine. Add some debug prints to see how far it gets.
Oh, there is also a problem with calling the vfd methods from multiple cogs. That will cause problems.
Dave
to
The first version is only setting the RLY_DN pin as an output.
If thats true then does
make both outputs low?
The double tilde sets all bits in the group, the single tilde clears all bits in the group.