Like most versions of the BASIC programming language, PBASIC is very forgiving and the compiler enforces no particular formatting style. As long as the source code is syntactically correct, it will compile and download to the BASIC Stamp without trouble.
Why, then, would one suggest a specific style for PBASIC? Consider this: Over three million BASIC Stamp modules have been sold and there are several thousand members that participate in the Parallax online forums. This makes it highly likely that you'll be sharing your PBASIC code with someone, if not co-developing a BASIC Stamp project. Writing code in an organized, predictable manner will save you -- and your potential colleagues -- a lot of time; in analysis, in troubleshooting and especially when you return to a project after a long break.
The style guidelines presented here are just that: guidelines. They have been developed from style guidelines used by professional programmers using other high-level languages such as Visual Basic®, C/C++, and Java™. Use these guidelines as-is, or modify them to suit your individual needs. The key is selecting a style the works well for you or your organization, and then sticking to it.
Many programmers, especially new ones, fall into the "I'll knock it out now and fix it later." trap. Invariably, the "fix it later" part never happens and sloppy code makes its way into production projects. If you don't have time to do it right, when will you find time to do it again?
Start clean and you'll be less likely to introduce errors in your code. And if errors do pop up, clean and organized formatting will make them easier to find and fix.
Using a blank program template will help you organize your programs and establish a consistent presentation.
Be verbose when naming constants, variables and program labels. The compiler will allow names up to 32 characters long. Using meaningful names will reduce the number of comments and make your programs easier to read, debug and maintain.
BASIC Stamp I/O pins are a special case as various elements of the PBASIC language require a pin to be constant value, an input variable or an output variable. To prevent redundant definitions, use the PIN type.
HeaterCtrl PIN 15
Since connections don't change during the program run, I/O pins are named like constants using mixed-case, beginning with an uppercase letter.
Begin constant names with an uppercase letter and use mixed case, using uppercase letters at the beginning of new words within the name.
SYMBOL AlarmCode = 25
AlarmCode CON 25
Begin variable names with a lowercase letter and use mixed case, using uppercase letters at the beginning of new words within the name.
BS1: Avoid using W0 (B0 and B1) so that bit variables (Bit0..Bit15) are available for use in your programs. Bit variables 0..15 overlay W0, so the use of W0 may cause undesired effects.
SYMBOL waterLevel = W1
BS2: Avoid the use of internal variable names (such as B0 or W1) in your programs. Allow the compiler to automatically assign RAM space by declaring a variable of specific type.
waterLevel VAR Word
When using the BS1, variable type is declared by aliasing the SYMBOL name to an internal variable of a specific size.
SYMBOL status = Bit0 SYMBOL ovenTmp = B2 SYMBOL rndVal = W2
For the BS2, variable types should be in mixed-case and start with an uppercase letter.
status VAR Bit counter VAR Nib ovenTmp VAR Byte rndVal VAR Word
Conserve BASIC Stamp user RAM by declaring the variable type required to hold the expected values of the variable.
SYMBOL bitVal = BIT0 ' 0 - 1 SYMBOL byteVal = B2 ' 0 - 255 SYMBOL wordVal = W2 ' 0 - 65535
bitValue VAR Bit ' 0 - 1 nibValue VAR Nib ' 0 - 15 byteValue VAR Byte ' 0 - 255 wordValue VAR Word ' 0 - 65535
Begin program labels with an uppercase letter, used mixed case, separate words within the label with an underscore character and begin new words with a number or uppercase letter. Labels should be preceded by at least one blank line, begin in column 1 and must be terminated with a colon (except after GOTO and THEN [in classic PBASIC] where they appear at the end of the line and without a colon).
Print_String: READ eeAddr, char IF char = 0 THEN Print_Done DEBUG char eeAddr = eeAddr + 1 GOTO Print_String Print_Done: RETURN
All PBASIC language keywords, including SYMBOL, CON, VAR, PIN and serial/debugging format modifiers (DEC, HEX, BIN) and constants (CR, LF) should be uppercase. (Although PBASIC is not case-sensitive, the BASIC Stamp Editor's Syntax Highlighting feature will automatically make these keywords all caps
Main: DEBUG "BASIC Stamp", CR END
Nesting blocks of code improves readability and helps reduce the introduction of errors. Indenting each level with two spaces is recommended to make the code readable without taking up too much space.
Note: The dots are used to illustrate the level of nesting and are not a part of the code.
Main: ..FOR testLoop = 1 TO 10 ....IF checkLevel >= Threshold THEN LED_Okay ....lowLevel = lowLevel + 1 ....GOTO Loop_Delay LED_Okay: ....LEDokay = IsOn Loop_Delay: ....PAUSE 100 ..NEXT ..IF testMode = Yes THEN Main
Main: ..DO ....FOR testLoop = 1 TO 10 ......IF (checkLevel < Threshold) THEN ........lowLevel = lowLevel + 1 ......ELSE ........LEDokay = IsOn ......ENDIF ......PAUSE 100 ....NEXT ..LOOP WHILE (testMode = Yes)
Enclose condition statements in parentheses for clarity (BS2 only - parenthesis are not allowed when using the BS1).
Check_Temp: IF (indoorTemp >= setPoint) THEN AcCtrl = IsOn ELSE lowLevel = lowLevel + 1 ENDIF
Fill_Water_Tank: DO WHILE (waterLevel = IsLow) TankFill = IsOn PAUSE 250 LOOP
Get_Delay: DO DEBUG HOME, "Enter time (5 - 30)... ", CLREOL DEBUGIN DEC2 tmDelay LOOP UNTIL ((tmDelay >= 5) AND (tmDelay =< 30))
White space (spaces and blank lines) does not affect compiler performance or BASIC Stamp execution speed, so be generous with it to make listings easier to read. Allow at least one blank line before program labels (two blanks lines before a subroutine label is recommended). Separate items in a parameter list with a space.
Main: DO ON task GOSUB Update_Motors, Scan_IR, Close_Gripper LOOP Update_Motors: PULSOUT MtrLeft, leftSpeed PULSOUT MtrRight, rightSpeed PAUSE 20 task = (task + 1) // NumTasks RETURN
An exception to this guideline is with the bits parameter used with SHIFTIN and SHIFTOUT, the REP modifier for DEBUG and SEROUT, and the byte count and terminating byte value for SERIN. In these cases, format without spaces.
SHIFTIN A2Ddata, A2Dclock, MSBPost, [result\9]
DEBUG REP "*"\25, CR
SERIN IRbSIO, IRbBaud, [buffer\8\255]
BASIC Stamp Help Version 2.5.4
Copyright © Parallax Inc.
8/8/2012