Code:
'* Date : 8/13/2017 *
'* Version : 1.6 *
'* Notes : PIC18F26K22 *
RS var PORTC.6 ;Register Select for LCD, 0 = Comd, 1 = Data
En var PORTC.7 ;Pulsout Enable to write to LCD
b0 var byte ;Main For/Next Loop Variable
b1 var byte ;LCDout Variable
b3 var byte ;For/Next Loop Variable
BatL var byte ;Display Screen Position Number
Batt var byte ;Battery Voltage, ADC Steps
BattA var byte[3] ;Battery Voltage, ASCii Converted
BatV var byte ;Battery Voltage XX(.)X
CFG var byte ;Set-Up Bits, DATA @10
Disp_Sel var byte ;Cursor Points To, 10 Choices in Disp_Prog
DispSet var CFG.3 ;Denotes Display Programming Complete
IOL var byte ;Display Screen Position Number
Line1 var byte[17] ;Disp_Prog Line1 Display Data Variable
Line2 var byte[17] ;Disp_Prog Line2 Display Data Variable
Line3 var byte[17] ;Disp_Prog Line3 Display Data Variable
Line4 var byte[17] ;Disp_Prog Line4 Display Data Variable
LnSel var byte ;Line Selected, 1 >> 4d
LPsi var byte ;Low Operating Pressure
LPsiA var byte[2] ;LPsi ASCii Converted
Order var byte ;Used in Disp: for positioning
OrderCt var byte ;Disp_Prog Order Keeper for Variables Displayed, Line1
Pos var byte ;Display Screen Position Number
Psi1 var byte ;Vaporizer Pressure, ADC Steps (8 bit)
Psi1A var byte[2] ;Vaporizer Pressure, ASCii Converted
Psi1L var byte ;Display Screen Position Number
Psi1P var byte ;Vaporizer Pressure, ADC >> Psi
Psi2 var byte ;Regulated Pressure, ADC Steps (8 bit)
Psi2A var byte[2] ;Regulated Pressure, ASCii Converted
Psi2L var byte ;Display Screen Position Number
Psi2P var byte ;Regulated Pressure, ADC >> Psi
PTarg var byte ;Target Vaporizer Pressure, Psi
PTargA var byte[2] ;Target Vaporizer Pressure, ASCii Converted
PTargL var byte ;Display Screen Position Number
Ppres var byte ;Target Vaporizer Pressure, ADC >> Psi
TPS var byte ;TPS ADC Steps, Read/Display Only
TPSA var byte[3] ;TPS Volts, ASCii Converted
TPSL var byte ;Display Screen Position Number
TPSV var word ;TPS Volts, 0.00 >> 5.00
VDCL var byte ;Display Screen Position Number
VTL var byte ;Display Screen Position Number
Work var byte ;Source of Working Bits
;Program Labels:
Init:
Order = 0 ;Display top of screen
Work = 0 ;Stock, Clears All Operating Bits
LnSel = 1 ;Line Selected for Display
Source = 1 ;Stock on Output to CNG ECU
GP = 0
Inj = 0
Rled = 0
pause 100
gosub Load_Vars ;Loads EEPROM Values into Appropriate Variables
goto Init_LCD ;Starts LCD, Loads Start Screens
Main:
;do stuff
gosub Disp
goto Main
Init_LCD:
low RS
PORTB = $30
high En
pauseus 4
low En
pause 5
PORTB = $30
high En
pauseus 4
low En
pauseus 160
PORTB = $30
high En
pauseus 4
low En
pauseus 160
PORTB = $38
gosub Send
PORTB = $10
gosub Send
PORTB = $0C
gosub Send
PORTB = $06
gosub Send
PORTB = 1
gosub Send
pause 1
PORTB = $80
gosub Send
high RS
pause 1
for b0 = 0 to 15
lookup b0, [" T-Cat Fuel Sys "], b1
PORTB = b1
gosub Send
next b0
low RS
pause 1
PORTB = $C0
gosub Send
high RS
pause 1
for b0 = 0 to 15
lookup b0, [" Controller "], b1
PORTB = b1
gosub Send
next b0
low RS
pause 1
PORTB = $90
gosub Send
high RS
pause 1
for b0 = 0 to 15
lookup b0, [" R & D Club "], b1
PORTB = b1
gosub Send
next b0
low RS
pause 1
PORTB = $D0
gosub Send
high RS
pause 1
for b0 = 0 to 15
lookup b0, [" Version 1.7 "], b1
PORTB = b1
gosub Send
next b0
pause 500
for b0 = 1 to 5
pause 250
Rled = 1
pause 250
Rled = 0
next b0
Start_Screen:
low RS
PORTB = 1
gosub Send
PORTB = $80 ;Line 1
gosub Send
high RS
pause 1
for b0 = 0 to 15
lookup b0, [" To Switch, 1/0 "], b1
PORTB = b1
gosub Send
next b0
pause 1
low RS
PORTB = $C0 ;Line 2
gosub Send
high RS
pause 1
for b0 = 0 to 15
lookup b0, [" Display Val ^ "], b1
PORTB = b1
gosub Send
next b0
pause 1
low RS
PORTB = $90 ;Line 3
gosub Send
high RS
pause 1
for b0 = 0 to 15
lookup b0, [" Program ^ & v "], b1
PORTB = b1
gosub Send
next b0
low RS
PORTB = $D0
gosub Send
high RS
pause 1
for b0 = 0 to 15
lookup b0, ["T-Cat Controller"], b1
PORTB = b1
gosub Send
next b0
Start2:
Source = 1
do
loop while (ButU = 0) and (ButT = 0) and (ButD = 0) and (Sw = 0)
if Sw = 1 then
pause 50
if Sw = 1 then
IO = 1
do
loop while SW = 1
; Source = 0
GP = 0
Inj = 0
Rled = 0
PAUSE 200
goto Main
endif
endif
If (ButU = 1) or (ButD = 1) then
pause 50
if (ButU = 1) and (ButD = 0) then
do
loop while ButU = 1
GP = 0
Inj = 0
Rled = 0
PAUSE 200
goto Park
endif
if (ButU = 1) and (ButD = 1) then
do
loop while (ButU = 1) and (ButD = 1)
goto Prog0
endif
endif
goto Start2
Disp:
LnSel = 1
low RS
PORTB = 1
gosub Send
PORTB = $80
gosub Send
high RS
OrderCt = LnSel + Order
gosub Disp_Seq
LnSel = LnSel + 1
low RS
PORTB = $C0
gosub Send
high RS
OrderCt = LnSel + Order
gosub Disp_Seq
LnSel = LnSel + 1
low RS
PORTB = $90
gosub Send
high RS
OrderCt = LnSel + Order
gosub Disp_Seq
LnSel = LnSel + 1
low RS
PORTB = $D0
gosub Send
high RS
OrderCt = LnSel + Order
gosub Disp_Seq
LnSel = 1
return
Disp_Seq:
Select Case OrderCt
case is = 1 : gosub Set_TC1L ;Vap Temp
case is = 2 : gosub Set_PSI1L ;Vap PSI
case is = 3 : gosub Set_PSI2L ;Regulated PSI
case is = 4 : gosub Set_PTargL ;Vap PSI Targ
case is = 5 : gosub Set_LPsiL ;Low PSI Aux Enable
case is = 6 : gosub Set_TPSL ;TPS
case is = 7 : gosub Set_BatL ;Battery Volts
end Select
return
Set_LPsiL:
ARRAYWRITE LPsiA, [#LPsi]
for b0 = 0 to 13
LOOKUP b0,["Low PSI Set = "],b1
PORTB = b1
gosub Send
next b0
if LPsi < 10 then
LPsiA[1] = LPsiA[0]
LPsiA[0] = " "
endif
PORTB = LPsiA[0]
gosub Send
PORTB = LPsiA[1]
gosub Send
RETURN
Set_BatL:
ARRAYWRITE BATTA, [#BatV]
for b0 = 0 to 9
LOOKUP b0,["Battery = "],b1
PORTB = b1
gosub Send
next b0
if BatV < 100 then
BattA[2] = BattA[1]
BattA[1] = BattA[0]
BattA[0] = " "
endif
PORTB = BattA[0]
gosub Send
PORTB = BattA[1]
gosub Send
PORTB = "."
gosub Send
PORTB = BattA[2]
gosub Send
PORTB = " "
gosub Send
PORTB = "V"
gosub Send
return
Set_Psi1L:
ARRAYWRITE PSI1A, [#Psi1P]
for b0 = 0 to 9
LOOKUP b0,["Vap Psi = "],b1
PORTB = b1
gosub Send
next b0
if PSI1P < 10 then
PSI1A[1] = PSI1A[0]
PSI1A[0] = " "
endif
PORTB = PSI1A[0]
gosub Send
PORTB = PSI1A[1]
gosub Send
for b0 = 0 to 3
PORTB = " "
gosub Send
next b0
return
Set_Psi2L:
ARRAYWRITE Psi2A, [#Psi2P]
for b0 = 0 to 9
LOOKUP b0,["Reg Psi = "],b1
PORTB = b1
gosub Send
next b0
if PSI2P < 10 then
PSI2A[1] = PSI2A[0]
PSI2A[0] = " "
endif
PORTB = Psi2A[0]
gosub Send
PORTB = Psi2A[1]
gosub Send
for b0 = 0 to 3
PORTB = " "
gosub Send
next b0
return
Set_PTargL:
ARRAYWRITE PTargA, [#PTarg]
for b0 = 0 to 13
LOOKUP b0,["Vap PsiTarg = "],b1
PORTB = b1
gosub Send
next b0
PORTB = PTargA[0]
gosub Send
PORTB = PTargA[1]
gosub Send
return
Set_TC1L:
arraywrite TC1A, [#TC1F]
for b0 = 0 to 10
LOOKUP b0,["Vap Temp = "],b1
PORTB = b1
gosub Send
next b0
if TC1F < 100 then
TC1A[2] = TC1A[1]
TC1A[1] = TC1A[0]
TC1A[0] = " "
endif
PORTB = TC1A[0]
gosub Send
PORTB = TC1A[1]
gosub Send
PORTB = TC1A[2]
gosub Send
PORTB = " "
gosub Send
PORTB = " "
gosub Send
return
Set_TPSL:
ARRAYWRITE TPSA, [#TPSV]
for b0 = 0 to 5
LOOKUP b0,["TPS = "],b1
PORTB = b1
gosub Send
next b0
if TPSV < 100 then
TPSA[2] = TPSA[1]
TPSA[1] = TPSA[0]
TPSA[0] = "0"
endif
if TPSV < 10 then
TPSA[2] = TPSA[1]
TPSA[1] = "0"
TPSA[0] = "0"
endif
PORTB = TPSA[0]
gosub Send
PORTB = "."
gosub Send
PORTB = TPSA[1]
gosub Send
PORTB = TPSA[2]
gosub Send
for b0 = 0 to 5
LOOKUP b0,[" Volts"],b1
PORTB = b1
gosub Send
next b0
return
Send:
high En
pauseus 8
low En
pause 1
return
Line_Select:
select Case LnSel
case is = 1 : PORTB = $80
case is = 2 : PORTB = $C0
case is = 3 : PORTB = $90
case is = 4 : PORTB = $D0
end select
return
Prog0:
read 6,PTarg
Prog0d:
do
loop while (ButU = 1) or (ButD = 1) or (ButT = 1)
low RS
pause 1
PORTB = 1
gosub Send
PORTB = $80
gosub Send
pause 1
high RS
pause 1
for b0 = 0 to 15
LOOKUP b0,["Target Vap Pres "],b1
PORTB = b1
gosub Send
next b0
low RS
pause 1
PORTB = $C0
gosub Send
high RS
pause 1
for b0 = 0 to 3
LOOKUP b0,[" "],b1
PORTB = b1
gosub Send
next b0
arraywrite PTargA, [#PTarg]
if PTarg < 10 then
PTargA[1] = PTargA[0]
PTargA[0] = " "
endif
PORTB = PTargA[0]
gosub Send
PORTB = PTargA[1]
gosub Send
if ButU = 1 then
PTarg = PTarg + 1
goto Prog0d
elseif ButD = 1 then
PTarg = PTarg - 1
goto Prog0d
endif
for b0 = 0 to 3
LOOKUP b0,[" PSI"],b1
PORTB = b1
gosub Send
next b0
if ButU = 1 then
PTarg = PTarg + 1
pause 10
goto Prog0d
elseif ButD = 1 then
PTarg = PTarg - 1
pause 10
goto Prog0d
endif
do
loop while (ButU = 0) and (ButD = 0) and (ButT = 0)
if ButU = 1 then
pause 100
if (ButU = 1) and (ButD = 0) and (ButT = 0) then
PTarg = PTarg + 1
for b0 = 0 to 100
if ButU = 0 then
goto Prog0d
endif
pause 10
next b0
endif
endif
if ButD = 1 then
pause 100
if (ButD = 1) and (ButU = 0) and (ButT = 0) then
PTarg = PTarg - 1
for b0 = 0 to 100
if ButD = 0 then
goto Prog0d
endif
pause 10
next b0
endif
endif
if ButT = 1 then
pause 250
if ButT = 1 then
do
loop while ButT = 1
write 6,PTarg
goto Prog1
endif
endif
if (ButU = 1) or (ButD = 1) then
pause 250
if (ButU = 1) and (ButD = 1) then
goto Start_Screen
endif
endif
goto Prog0d
Prog1:
read 7,LPsi
Prog1d:
do
loop while (ButU = 1) or (ButD = 1) or (ButT = 1)
low RS
pause 1
PORTB = 1
gosub Send
PORTB = $80
gosub Send
high RS
pause 1
for b0 = 0 to 15
LOOKUP b0,[" Low Operating "],b1
PORTB = b1
gosub Send
next b0
low RS
pause 1
PORTB = $C0
gosub Send
high RS
pause 1
for b0 = 0 to 15
LOOKUP b0,[" Pressure = "],b1
PORTB = b1
gosub Send
next b0
low RS
pause 1
PORTB = $90
gosub Send
high RS
pause 1
arraywrite LPsiA, [#LPsi]
if LPsi < 10 then
LPsiA[1] = LPsiA[0]
LPsiA[0] = " "
endif
PORTB = LPsiA[0]
gosub Send
PORTB = LPsiA[1]
gosub Send
for b0 = 3 to 14
LOOKUP b0,[" PSI "],b1
PORTB = b1
gosub Send
next b0
if (ButU = 1) and (LPsi < 40) then
LPsi = LPsi + 1
goto Prog1d
elseif (ButD = 1) and (LPsi > 5) then
LPsi = LPsi - 1
goto Prog1d
elseif (LPsi > 40) or (LPsi < 5) then
goto Prog1d
endif
do
loop while (ButU = 0) and (ButD = 0) and (ButT = 0)
if ButU = 1 then
pause 100
if (ButU = 1) and (ButD = 0) and (ButT = 0) then
if LPsi < 40 then
LPsi = LPsi + 1
endif
for b0 = 0 to 100
if ButU = 0 then
goto Prog1d
endif
pause 10
next b0
endif
endif
if ButD = 1 then
pause 200
if (ButD = 1) and (ButU = 0) and (ButT = 0) then
if LPsi > 10 then
LPsi = LPsi - 1
endif
for b0 = 0 to 100
if ButD = 0 then
goto Prog1d
endif
pause 10
next b0
endif
endif
if ButT = 1 then
pause 250
if ButT = 1 then
do
loop while ButT = 1
write 7,LPsi
goto Start_Screen
endif
endif
if (ButU = 1) or (ButD = 1) then
pause 250
if (ButU = 1) and (ButD = 1) then
goto Start_Screen
endif
endif
goto Prog1d
Load_Vars:
read 6,PTarg
arraywrite PTargA, [#PTarg]
read 7,LPsi
ARRAYWRITE LPsiA, [#LPsi]
read 10,CFG
return
Bookmarks