| READ Examples | Syntax |
' -------------------------------------------------------------------------
' Program Description
' -------------------------------------------------------------------------
'
' Uses READ to move values from a DATA table to a variable. In this
' program, the table data holds segment patterns for a 7-segment LED.
' -------------------------------------------------------------------------
' Device Settings
' -------------------------------------------------------------------------
DEVICE SX28, OSC4MHZ, TURBO, STACKX, OPTIONX
FREQ 4_000_000
ID "READ"
' -------------------------------------------------------------------------
' IO Pins
' -------------------------------------------------------------------------
LEDs VAR RB ' 7-segment display
TRIS_LEDs VAR TRIS_B
' -------------------------------------------------------------------------
' Constants
' -------------------------------------------------------------------------
Dash CON %01000000
' -------------------------------------------------------------------------
' Variables
' -------------------------------------------------------------------------
value VAR Byte ' value to display
tmpB1 VAR Byte ' subroutine work var
' =========================================================================
PROGRAM Start
' =========================================================================
' -------------------------------------------------------------------------
' Subroutine Declarations
' -------------------------------------------------------------------------
PUT_DIGIT SUB 1
' -------------------------------------------------------------------------
' Program Code
' -------------------------------------------------------------------------
Start:
TRIS_LEDs = %00000000 ' make LEDs outputs
Main:
DO
FOR value = 0 TO 16 ' demo values (last invalid)
LEDs = PUT_DIGIT value ' update the display
PAUSE 500 ' pause 1/2 second
NEXT
LOOP
' -------------------------------------------------------------------------
' Subroutine Code
' -------------------------------------------------------------------------
' Use: destination = PUT_DIGIT value
' -- converts number in 'value' to 7-segment digit pattern
' and places it in 'destination'
PUT_DIGIT:
tmpB1 = __PARAM1 ' copy value
IF tmpB1 <= $F THEN ' check range
READ SegMap + tmpB1, tmpB1 ' read table value
ELSE
tmpB1 = Dash ' display dash
ENDIF
RETURN tmpB1
' =========================================================================
' User Data
' =========================================================================
SegMap: ' segments maps
' .gfedcba
DATA %00111111 ' 0
DATA %00000110 ' 1
DATA %01011011 ' 2
DATA %01001111 ' 3
DATA %01100110 ' 4
DATA %01101101 ' 5
DATA %01111101 ' 6
DATA %00000111 ' 7
DATA %01111111 ' 8
DATA %01100111 ' 9
DATA %01110111 ' A
DATA %01111100 ' b
DATA %00111001 ' C
DATA %01011110 ' d
DATA %01111001 ' E
DATA %01110001 ' F
' -------------------------------------------------------------------------
' Program Description
' -------------------------------------------------------------------------
'
' This program demonstrates the use of strings in an SX/B program. As of
' version 1.4, the SX/B READ instruction can accept a variable base and
' offset. These values may be created by the compiler by specifying the
' label of a stored z-string, or by using an inline string constant.
'
' The subroutine TX_STR accepts the base and offset values of a stored or
' inline string and will transmit them to a connected terminal -- the
' construction of the subroutine allows the string to cross SX page
' boundaries.
' -------------------------------------------------------------------------
' Device Settings
' -------------------------------------------------------------------------
DEVICE SX28, OSCXT2, TURBO, STACKX, OPTIONX
FREQ 4_000_000
ID "READ_STR"
' -------------------------------------------------------------------------
' IO Pins
' -------------------------------------------------------------------------
SOut VAR RA.0 ' serial output
' -------------------------------------------------------------------------
' Constants
' -------------------------------------------------------------------------
Baud CON "T9600" ' use with MAX232/USB2SER
CR CON 13 ' carriage return
LF CON 10 ' line feed
' -------------------------------------------------------------------------
' Variables
' -------------------------------------------------------------------------
tmpB1 VAR Byte ' subroutine work vars
tmpB2 VAR Byte
tmpB3 VAR Byte
tmpB4 VAR Byte
tmpW1 VAR Word
' =========================================================================
PROGRAM Start
' =========================================================================
' -------------------------------------------------------------------------
' Subroutine Declarations
' -------------------------------------------------------------------------
TX_BYTE SUB 1, 2 ' transmit byte
TX_STR SUB 2, 4 ' transmit string
' -------------------------------------------------------------------------
' Program Code
' -------------------------------------------------------------------------
Start:
PLP_A = %0001 ' pull-up unused pins
PLP_B = %00000000
PLP_C = %00000000
Main:
TX_STR "SX/B makes string output easy!" ' send inline string
TX_STR CrLf ' send stored z-string
TX_STR TestStr, 14 ' sub-string
TX_STR CrLf
TX_STR TestStr, 13, 16 ' sub-string at offset
TX_STR CrLf
TX_STR TestStr, 8, 31
TX_STR Version
TX_STR CrLf
TX_BYTE LF, 2
PAUSE 1000
GOTO Main
' -------------------------------------------------------------------------
' Subroutine Code
' -------------------------------------------------------------------------
' Use: TX_BYTE theByte {, count}
' -- transmit "theByte" at "Baud" on "SOut"
' -- optional "count" may be specified (must be > 0)
TX_BYTE:
tmpB1 = __PARAM1 ' save byte
IF __PARAMCNT = 1 THEN ' if no count
tmpB2 = 1 ' set to 1
ELSE ' otherwise
tmpB2 = __PARAM2 ' get count
IF tmpB2 = 0 THEN ' do not allow 0
tmpB2 = 1
ENDIF
ENDIF
DO WHILE tmpB2 > 0 ' loop through count
SEROUT SOut, Baud, tmpB1 ' send the byte
DEC tmpB2 ' decrement count
LOOP
RETURN
' -------------------------------------------------------------------------
' Use: TX_STR [string | label] {, count {, offset }}
' -- "string" is an embedded string constant
' -- "label" is DATA statement label for stored z-String
' -- "count" is number of characters to send (0 is entire string)
' -- "offset" is offset from head of string (0 is head)
TX_STR:
tmpW1 = __WPARAM12 ' get offset+base
tmpB3 = 0 ' do whole string
IF __PARAMCNT >= 3 THEN ' count specified?
tmpB3 = __PARAM3 ' -- yes, get count
ENDIF
IF __PARAMCNT = 4 THEN ' offset specified?
tmpW1 = tmpW1 + __PARAM4 ' -- yes, update it
ENDIF
DO
READ tmpW1, tmpB4 ' read a character
IF tmpB4 = 0 THEN EXIT ' if 0, string complete
TX_BYTE tmpB4 ' send character
DEC tmpB3 ' update count
IF tmpB3 = 0 THEN EXIT ' terminate if done
INC tmpW1 ' point to next character
LOOP
RETURN
' =========================================================================
' User Data
' =========================================================================
TestStr:
DATA "Parallax, Inc. SX/B Compiler Version 1.50", 0
Version:
DATA "1.50", 0
CrLf:
DATA CR, LF, 0