A Procedure is a subroutine with local memory and optional parameters. You may pass parameters to the subroutine when calling it. You may also use global Variables of the main program/superior Class.

See also: What is a subroutine?

Local Variables

Lokal variables can be declared in the Method, that are valid only until you exit the Method. Passing parameters requires additional memory until the subroutine is exited. Without Parameters and/or local variables its just the return address (2 or 3 Byte). See also: Dim, Chapter visibility of variables and keyword „static“

If the parameter passed is of a different type than in the subroutine, the numeric data type will be typecast automatically. Example, if you pass a „Word“ variable and the Subroutine expects a Byte, then the Word will be converted to a Byte.

Parameters can be passed byVal Copy or byRef Reference1) to the Subroutine. The parameters are exchanged via the program stack (see avr.Stack). Paramater passing per Copy (byVal):

Paramater passing per Reference (byRef):

The keyword „byVal“ is the default method and can be omitted.

InitialValue is a feature with which you can optionally assign an initial value parameters:

procedure test(a as byte, b as word = 456)
procedure test1(a as byte = 123, b as word)

The call can then be different by then the optional parameters, then the omitted parameter when called by the initial value will be replaced automatically:

test(100) 'the optional second parameter is given the initial value
test1(,444) 'the first parameter is replaced by the initial value

Methoden-Overload is a feature in which multiple methods with the same name can be defined with different parameter types or return values. The call is then determined by the number and type of parameters.

test(123)     'methode #1 is called
test(123,456) 'methode #2 is called
a = test(123) 'methode #3 is called
'methode #1
procedure test(a as word)
'methode #2
procedure test(a as byte, b as word)
'methode #3
function test(a as byte)
Implemented as of Version 2015.r1

With the keyword assigns at the last parameter of a method specifies a method (Procedure), a value can be assigned in the source code.

test(100) = 200
procedure test(a as byte, assigns b as word)
  print "parameter  = ";str(a)
  print "assignment = ";str(b)

The optional keyword inline makes a inline-method.

See also:


Methods can access the global variables of the superior Class. A variable „a“, declared in the main program, is also accessible by a Procedure/Function. However, if you declare a variable of the same name in a Procedure/Function or define it as a parameter, then this variable will be the only one accessible.

Recursive/Nested Calls

Luna Methods Reentrancy are reentrant and can be nested or called recursively, or called by one or more Interrupts of the main program.



' Main Program
dim value as integer
dim s as string
output("My Number: ",33) ' Call the Subroutine
'also possible
value = 12345
s = "Other Number: "
call output(s,value)
' Subroutine
procedure output(text as string, a as byte)
  dim x as integer  ' locally valid Variable
  print text+str(x)
struct point
  byte x
  byte y
dim p as point
print "p.x = ";str(p.x)   ' output: p.x = 42
procedure test(byRef c as point)
  print "c.x = ";str(c.x)  ' output: c.x = 23
  c.x = 42

Example 3:

test(text)      ' output: c.PString(0) = "hello"
test("ballo")   ' output: c.PString(0) = "ballo"
procedure test(byRef c as data)
  print "c.PString(0) = ";34;c.PString(0);34
data text
  .db 5,"hello"
1) as of 2012.r4