Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Silo - Tips - Guia de Referencia Rapida A Mikrobasic
Silo - Tips - Guia de Referencia Rapida A Mikrobasic
mikroBasic
ESTIMADOS CLIENTES,
Querría darles las gracias por estar interesados en nuestros productos y por tener
confianza en MikroElektronika.
Nuestro objetivo es proporcionarles con los productos de la mejor calidad. Además,
seguimos mejorando nuestros rendimientos para responder a sus necesidades.
Nebojsa Matic
Director general
3
Espacio en blanco
El espacio en blanco (whitespace) es el nombre genérico dado a los espacios (en blanco),
tabuladores horizontales y verticales y nueva línea. Los espacios en blanco se utilizan
como separadores para indicar donde empiezan y terminan los tokens. Por ejemplo, las
dos secuencias:
dim tmp as byte
dim j as word
son léxicamente equivalentes y el resultado del análisis son los ocho tokens siguientes
dim
tmp
as
byte
dim
j
as
word
se descompone en cuatro tokens, con tal de que la cadena literal represente un token:
some_string
=
"mikro foo"
newline character
4
Tokens
El token es el elemento más pequeño del lenguaje de programación Basic reconocido
por el compilador. El código fuente es escaneado de izquierda a derecha. El analizador
sintáctico (parser) extrae los tokens, seleccionando el que coincida con la secuencia de
caracteres más larga posible dentro de la secuencia analizada.
Palabras clave
Las palabras clave o reservadas son los tokens que tienen el significado fijo y no se
pueden utilizar como identificadores. Aparte da las palabras clave estándar en
microBasic hay un conjunto de los identificadores predefinidos (de constantes y de vari-
ables) que describen el microcontrolador específico y no pueden ser redefinidos. Lista
alfabética de las palabras clave en Basic.
absolute cstr form let private stop
and curdir format line procedure str
appactivate currency forward loc program strcomp
array cvar freefile lock property strconv
as cverr function lof pset string
asc data fv long public structure
asm date get longint put sub
at dateadd getattr longword pv switch
atn datediff getobject loop qbcolor syd
attribute datepart gosub lset raise symbol
base dateserial goto me randomize system
bdata datevalue hex mid rate tab
beep ddb hour minute redim time
bit deftype idata mirr register timer
boolean dim if mkdir rem timeserial
byref dir iif mod resume timevalue
byte div ilevel module return to
call do imp month rgb typedef
case doevents implements msgbox right typename
cbool double include name rmdir ubound
cbyte each input new rnd ucase
ccur eio instr next rset unlock
cdate empty int not rx until
cdate end integer not sbit val
cdbl end with io nothing second variant
char environ ipmt now seek vartype
chdir eof irr nper select version
chdrive eqv is npv sendkeys volatile
chr erase isarray object set weekday
cint err isdate oct setattr wend
circle error isempty on sfr while
class exit iserror open sgn width
clear explicit ismissing option shell with
clng explicit isnull option short word
close fileattr isnumeric option single write
code fileattr isobject or sln xdata
command filecopy kill org small xor
compact filedatetime large orgall space
compare filelen lbound pdata spc
const fix lcase pmt sqr
createobject float left ppmt static
csng for len print step
5
Comentarios
Los comentarios son anotaciones utilizadas para interpretar el programa. Son para uso
exclusivo del programador. Se eliminan del código fuente antes del análisis sintáctico.
Los comentarios en mikroBasic deben ocupar sólo una línea. Para escribir comentarios
se utiliza el apóstrofo.
' Any text between an apostrophe and the end of the
' line constitutes a comment. May span one line only.
Identificadores
Los identificadores son los nombres arbitrarios utilizados para identificar los objetos
básicos del lenguaje: etiquetas, tipos, símbolos, constantes, variables, procedimientos y
funciones. Los identificadores pueden contener todas las letras mayúsculas y minúscu-
las del abecedario (a a z, y A a Z), el guión bajo "_", y los dígitos 0 a 9. El primer carác-
ter debe ser una letra o el guión bajo. mikroBasic no distingue mayúsculas y minúscu-
las, así que Sum, sum y suM representan identificadores equivalentes. Aunque los nom-
bres de identificadores son arbitrarios (de acuerdo con las reglas fijas), ocurre un error
si se utiliza el mismo nombre para más de un identificador dentro del mismo ámbito.
Ejemplos de identificadores válidos:
temperatura_V1
Pritisak
no_hit
dat2string
SUM3
_vtext
y de identificadores inválidos:
Literales
Los literales son tokens que representan valores fijos y numéricos o valores de carac-
teres. El tipo de dato correspondiente a una constante es deducido por el compilador en
base a indicios implícitos, como el valor numérico y formato usados en el código fuente.
El rango permitido de los valores de constantes es determinado por el tipo longint para
las constantes con signo (signed) y por el tipo longword para las constantes sin signo
(unsigned).
Parte entera;
Punto decimal;
Parte fraccionaria; y
e/E y un entero con signo (exponente)
0. // = 0.0
-1.23 // = -1.23
23.45e6 // = 23.45 * 10^6
2e-5 // = 2.0 * 10^-5
3E+10 // = 3.0 * 10^10
.09E34 // = 0.09 * 10^34
7
Literales carácter
Un literal carácter es una secuencia de caracteres ASCII delimitados por comillas sim-
ples. Un literal carácter puede ser asignado a variables de tipos entero y cadena, a una
matriz de caracteres y a una matriz de bytes. A una variable de tipo entero se le asig-
nará el valor ASCII del literal carácter correspondiente.
Cadenas literales (alfanuméricas)
Una cadena literal representa una secuencia de caracteres ASCII escritos en una línea
entre comillas dobles. Como hemos mencionado, una cadena literal puede contener
espacio en blanco, esto es, el parser no descompone las cadenas literales en tokens,
sino que las interpreta como una totalidad. La longitud de una cadana literal depende del
número de caracteres en los que consiste. Al final de cada cadena literal se añade un
carácter nulo (null), llamado el ASCII cero, que no cuenta en la longitud total de la cade-
na literal. Una cadena literal que no contiene ningún signo entre comillas (cadena nula)
se almacena como un solo carácter nulo. Las cadenas literales se pueden asignar a vari-
ables de tipo cadena, a una matriz de caracteres o a una matriz de bytes.
Ejemplos de cadenas literales:
Puntuadores
Los puntuadores utilizados en mikroBasic (conocidos como separadores) son:
[ ] - corchetes
( ) - paréntesis
, - coma
; - punto y coma (sólo en las sentenias ASM)
: - dos puntos
. - punto
Corchetes
Los corchetes indican índices de matrices uni y multi dimensionales:
dim abecedario as byte [30]
' ...
abecedario [2] = "c"
Paréntesis
Los paréntesis ( ) sirven para agrupar expresiones, aislar expresiones condicionales,
indicar llamadas a funciones y declaraciones de éstas:
Coma
La coma ‘,’ se utiliza para separar los parámetros en las llamadas a función, los identi-
ficadores en las declaraciones y los elementos del inicializador:
Lcd_Out(1, 1, txt)
dim i, j, k as word
const MESES as byte [12] = (31,28,31,30,31,30,31,31,30,31,30,31)
Punto y coma
El punto y coma indica el inicio de un comentario en los bloques en ensamblador.
Dos puntos
Dos puntos ‘:’ se utilizan para indicar una etiqueta en el programa:
start: nop
goto start
Punto
El punto ‘.’ se utiliza para acceder a un miembro de estructura y a los bits particulares
de registros. Por ejemplo:
nombre.apellido = "Smith"
Organización de programa
Como los demás lenguajes de programación, mikroBasic proporciona un conjunto de
reglas estrictamente definidas que se utilizan al escribir el programa. En otras palabras,
todos los programas escritos en mikroBasic tienen una estructura definida y organizada.
A continuación se muestran los ejemplos de escribir los ficheros de programa. Cada
proyecto en mikroBasic consiste en un fichero de proyecto y en uno o más módulos
(ficheros con extensión .mbas). El fichero de proyecto proporciona las informaciones del
proyecto, mientras que los módulos contienen el fuente de programa.
Módulo principal
Cada proyecto en mikroBasic requiere un solo módulo principal (main modul). Aquel módulo
se identifica por la palabra clave program que está al principio del módulo y da instucciones
al compilador de dónde debe iniciar el proceso de compilación. Después de crear un proyec-
to con éxito en Project Wizard, Code Editor visualizará automáticamente el módulo prin-
cipal. Code Editor contiene la estructura básica de un programa escrito en mikroBasic.
Aparte de comentarios, nada debe preceder a la palabra clave program. La cláusula
include se puede colocar después del nombre de programa. Todos los identificadores
globales (de constantes, variables, etiquetas, rutinas) se declaran delante de la palabra
clave main.
9
programa <nombre_de_programa>
include <incluir_otros_módulos>
'********************************************************
'* Declaraciones globales:
'********************************************************
main:
' escriba el código aquí
end.
Otros módulos
Otros módulos permiten:
descomponer los programas largos en las partes encapsuladas que se pueden edi
tar por separado;
crear librerías que se pueden utilizar en los proyectos diferentes; y
distribuir librerías a otros programadores sin revelar el código fuente.
10
Cada módulo se almacena en su propio fichero y se compila por separado. Los módu-
los compilados se enlazan juntos con el propósito de crear un código ejecutable. Para
compilar un proyecto el compilador tiene que disponer de todos los módulos ya sean los
ficheros de código fuente o ficheros de objetos (ficheros creados por medio de la com-
pilación de módulos). Todos los módulos empiezan por la palabra clave modul. Aparte
de los comentarios nada debe preceder a la palabra clave modul. La cláusula include
se puede colocar después del nombre de módulo.
Organización de otros módulos
Cada módulo consiste en tres secciones: Include, Interface e Implementation. Sólo la
sección Implementation es obligatoria. Siga el modelo a continuación:
module <nombre_de_módulo>
include <incluir_otros_módulos>
'********************************************************
'* Interface (variables_globales):
'********************************************************
end.
11
Cláusula Include
mikroBasic incluye los módulos por medio de la cláusula include. Consiste en la palabra
reservada include y el nombre de módulo entre comillas. El nombre del módulo no
incluye la extensión. Un módulo incluye varias cláusulas include que deben estar colo-
cadas inmediatamente después del nombre de módulo. Por ejemplo:
program MyProgram
include "utils"
include "strings"
include "MyUnit"
...
Si el compilador encuentra los dos ficheros con las extensiones .mbas y .mcl, comp
robará sus fechas e incluirá el fichero de la fecha más reciente en el proyecto. Si el
fichero de la extensión .mbas es de la fecha más reciente, el compilador lo recom
pilará y generará el nuevo fichero .mcl al copiar el antiguo;
Sección Interface
La sección Interface es la sección del módulo que precede a la palabra clave imple-
ments. Esta sección contiene declaraciones globales (de constantes, variables y símbo-
los) para el proyecto dado. En ella no se pueden definir rutinas. Esta sección contiene
las declaraciones de rutinas (definidas en la sección Implementation) que deben ser
visibles fuera del módulo. Las declaraciones de rutinas deben corresponder completa-
mente a las definiciones de éstas.
Sección Implementation
Sección Implementation contiene las declaraciones y definiciones privadas de las ruti-
nas. Esta sección permite encapsular el código. Todo lo que se declara después de la
palabra clave implements es para el uso privado, es decir, el ámbito está limitado a
aquel módulo. Cualquier identificador declarado en esta sección del módulo no se puede
utilizar fuera del módulo, sino sólo en las rutinas definidas después de la declaración del
identificador dado.
12
Ámbito y visibilidad
Ámbito (scope)
El ámbito de un identificador representa la sección de programa en la que se puede uti-
lizar el identificador. Hay varias categorías del ámbito lo que depende de cómo y dónde
se declaran los identificadores:
Visibilidad
Similar al ámbito, la visibilidad representa la sección de programa en la que se puede
utilizar el identificador dado. Ámbito y visibilidad coinciden generalmente, si bien pueden
darse circunstancias en que un objeto puede aparecer invisible temporalmente debido a
la presencia de un identificador duplicado. El objeto existe, pero el identificador original
no puede ser utilizado para accederlo hasta que el identificador duplicado es terminado.
La visibilidad no puede exceder al ámbito, pero éste puede exceder a la visibilidad.
13
Tipos
mikroBasic es estrictamente un lenguaje de tipo, lo que significa que cada variable o
constante son de tipo definido antes de que se inicie el proceso de compilar. Al compro-
bar el tipo no es posible asignar o acceder incorrectamente a objetos.
mikroBasic soporta los tipos de datos estándar (predefinidos) tales como son los tipos
enteros con signo o sin signo de varios tamańos, matrices, cadenas, punteros etc.
Además, el usuario puede definir un nuevo tipo de datos al utilizar la directiva typedef.
Por ejemplo:
Tipos simples
Los tipos simples son los tipos que no se pueden descomponer en los elementos más
básicos. En la tabla a continuación se muestran los tipos simples en mikroBasic:
* tipo char se puede interpretar como el tipo byte en todos los aspectos
14
Matrices
Una matriz representa un conjunto ordenado y limitado que contiene una serie de vari-
ables del mismo tipo, los elementos de la matriz. El tipo de elemento se denomina tipo
básico. Al valor de un elemento se le puede acceder por su índice que es único para
cada elemento, así que los elementos diferentes pueden contener el mismo valor.
Declaración de matrices
Las matrices se declaran de la siguiente manera:
element_type [array_lenght]
main:
' A los elementos de variables de matriz se les puede acceder de la sigu-
iente manera
samples [0] = 1
if samples [37] = 0 then
...
Matrices constantes
Una matriz constante se inicializa al asignarle una secuencia de valores delimitados por
comas entre paréntesis. Por ejemplo:
' Declarar una matriz constante que contiene el número de días en cada
mes:
const MONTHS as byte [12] = (31,28,31,30,31,30,31,31,30,31,30,31)
' Declaración de una matriz de constantes bidimensional:
const NUMBER s byte [4][4] = ((0, 1, 2, 3), (5, 6, 7, 8), (9, 10, 11, 12), (13, 14, 15, 16))
Matrices multidimensionales
Una matriz es unidimensional si es de tipo escalar. A veces las matrices unidimension-
ales se denominan vectores. Las matrices multidimensionales se crean al declarar matri-
ces de tipo matriz.
El ejemplo de una matriz bidimensional:
dim m as byte [50][20] 'matriz bidimensional de tamańo 50x20
La variable m representa una matriz de 50 elementos. Cada uno representa una nueva
matriz de los elementos de tipo byte. Así se crea una matriz de 50x20 elementos. El
primer elemento es m[0][0], mientras que el último es m[49][19]. Si una matriz es un
parámetro de función, se pasa por su dirección como en el siguiente ejemplo:
Cadenas
Una cadena representa un conjunto de caracteres equivalente a una matriz de tipo char.
Se declara de la siguiente manera:
string [string_length]
Empalme de cadenas
mikroBasic permite empalmar las cadenas por medio del operador más (+). Este tipo de con-
catenación se puede aplicar a las variables de cadena, cadenas literales, variables cáracter y
literales carácter. Los caracteres no imprimidos se pueden representar por medio del operador
Chr y el número que es el código ASCII del carácter no imprimido correspondiente (Chr (13)
para CR). Por ejemplo:
Punteros
Un puntero es una variable cuyo fin específico es almacenar direcciones de memoria de
objetos. Una variable accede directamente a la dirección de memoria mientras que el
puntero representa una referencia a la dirección. Para declarar un puntero, es necesario
ańadir el prefijo (^) delante del tipo. Por ejemplo, para declarar un puntero a un objeto
de tipo integer es necesario escribir:
^integer
dim p as ^word
...
p^ = 5
Un puntero se puede asignar al otro puntero, después de que los dos apuntarán a la
misma locación de memoria. Al modificar el objeto al que apunta un puntero, será mod-
ificado automáticamente el objeto al que apunta otro puntero, porque se trata de la
misma locación de memoria.
Operador @
Operador @ devuelve la dirección de una variable o una rutina, es decir, dirige al pun-
tero a su operando. Las siguientes reglas se aplican al operador@:
dim w as word
ptr_b as ^byte
ptr_arr as array_type
arr as byte[10]
main:
ptr_b = @arr ' @ operador devuelve ^byte
w = @arr ' @ operador devuelve ^byte
ptr_arr = @arr ' @ operador devuelve ^byte[10]
end.
Puntero a función
mikroBasic permite el uso de los punteros a función. Este ejemplo muestra cómo definir y
utilizar un puntero a función. Primero vamos a definir el tipo procedural y el puntero a fun-
ción y por fin vamos llamar a función utilizando un puntero.
sub function Func2(dim abc, def as byte, dim ghi as word) as word
result = abc * def + ghi ' devuelve el valor
end sub
sub function Func3(dim first, yellow as byte, dim monday as word) as word '
result = monday - yellow - first ' devuelve el valor
end sub
Estructuras
Las estructuras representan un conjunto heterogéneo de elementos. Cada elemento se
denomina el miembro. En la declaración de estructuras se especifica el nombre y el tipo
de cada miembro. La síntaxis de la estructura es la siguiente:
structure structname
dim member1 as type1
...
dim membern as typen
end structure
Mediante esta declaración son creados dos ejemplos de la estructura Dot, denominados m y
n. La estructura previamente definida puede ser el miembro de otra estructura Por ejemplo:
' Estructura que define un círculo:
structure Circle
dim radius as float
dim center as Dot
end structure
circle1.radius = 3.7
circle1.center.x = 0
circle1.center.y = 0
20
Conversión de tipos
La conversión de un objeto de un tipo definido es el proceso de cambiar su tipo en otro.
mikroBasic soporta las conversiones implícita y explícita de tipos básicos.
Conversión implícita
El compilador realizará la conversión implícita en los siguientes casos:
Promoción
Cuando los operandos son de tipos diferentes, mediante la conversión implícita se real-
iza la promoción de tipo más bajo a tipo más alto, de la siguiente manera:
bit byte/char
byte/char word
short integer
short longint
integer longint
integral float
word longword
Los bytes más altos del operando sin signo extendido se llenan de ceros. Los bytes más
altos del operando con signo extendido se llenan del signo de bit. Si el número es nega-
tivo, los bytes más altos se llenan de ceros, al contrario se llenan de ceros. Por ejemplo:
dim a as byte
dim b as word
...
a = $FF
b = a ' promoción de a a word, de b a $00FF
Recorte
En las sentencias de asignación y en las sentencias que requieren una expresión de tipo
particular, el valor correcto será almacenado en el destino sólo si el resultado de expre-
sión no excede al rango del destino. Al contrario, si el resultado de la expresión excede
al rango del destino los bytes más altos se pierden.
dim i as byte
dim j as word
...
j = $FF0F
i = j ' i obtiene el valor $0F, byte más alto $FF se pierde
21
Conversión explícita
La conversión explícita se puede realizar en cualquier expresión al especificar el tipo
deseado (byte, word, short, integer, longint, longword o float) delante de la expre-
sión que será convertida. La expresión debe estar entre paréntesis. Un caso especial es
conversión entre los tipos con signo y sin signo. La conversión explícita de estos tipos
de datos no cambia la representación binaria de los datos. Por ejemplo:
dim a as byte
dim b as short
...
b = -1
a = byte(b) ' a is 255, not 1
' El dato se queda en la representación binaria 11111111
' pero el compilador la interpreta de la manera diferente
La conversión explícita no se puede realizar en el operando que está a la izquierda del oper-
ador de asignación:
word(b) = a Compilador informa acerca de un error
Ejemplo de la conversión:
dim a, b, c as byte
dim cc as word
...
a = 241
b = 128
Nota: Conversión de datos de punto flotante en datos integrales (en las sentencias de asignación
o mediante conversión explícita - typecasting) produce el resultado correcto sólo si el valor de
punto flotante no excede al ámbito de destino de tipo integral.
22
Variables
Las variables son los objetos cuyo valor se puede modificar en tiempo de ejecución. Cada
variable se declara bajo el nombre único que debe ser el identificador válido. Las variables
se pueden declarar en la sección de declaración de ficheros y rutinas. Cada varaible se
debe declarar antes de ser utilizada en el programa. Las variables globales (las que son vis-
ibles en todos los ficheros) se declaran en la sección de declaración del módulo principal.
Es necesario especificar el tipo de dato de cada variable. La síntaxis básica de la
declaración de variables es la siguiente:
dim i, j, k as byte
counter, temp as word
samples as longint [100]
Constantes
Las constantes son los objetos cuyos valores se han definido en el momento de escribir
el código de programa, y no pueden ser modificados más tarde en tiempo de ejecución.
Las constantes no se almacenan en la memoria RAM. Las constantes se declaran en la
sección de declaración de ficheros y rutinas. La síntaxis es:
const constant_name [as type] = value
Etiquetas
Las etiquetas sirven como objetivos para las sentencias goto y gosub. Marque la sen-
tencia con la etiqueta como en el siguiente ejemplo:
label_identifier : statement
loop: Beep
goto loop
Símbolos
Los símbolos en Basic permiten crear los macros simples sin parámetros. Cualquier
línea de código se puede reemplazar por un identificador. Los símbolos pueden aumen-
tar legibilidad y reutilización de código cuando se utilizan correctamente. Los símbolos
deben ser declarados al principio del módulo, bajo el nombre del módulo y la directiva
(opcional) include.
Funciones y procedimientos
Las funciones y los procedimientos, denominados bajo el nombre común rutinas, son
los subprogramas que ejecutan ciertas tareas a base de un número de los parámetros
de entrada. Las funciones devuelven el valor después de la ejecución, mientras que los
procedimientos no devuelven el valor. mikroBasic no soporta las rutinas inline.
Funciones
Las funciones se declaran de la siguiente manera:
main:
' Get a Structure via function call
MyCircle = DefineCircle(100, 200, 30)
Llamar a función
Una llamada a función se realiza al especificar su nombre seguido por los parámetros
actuales colocados en el mismo orden que los parámetros formales correspondientes.
El compilador es capaz de hacer los parámetros mal aparejados obtener el tipo adecua-
do de acuerdo con las reglas de la conversión implícita. Si hay una llamada a función en
la expresión, el valor devuleto de función se utilizará como el operando en dicha expre-
sión.
Esta función simple calcula xn a base de los parámetros de entrada x y n (n> 0):
sub function power(dim x, n as byte) as longint
dim i as byte
i = 0
result = 1
if n > 0 then
for i = 1 to n
result = result*x
next i
end if
end sub
Procedimientos
Los procedimientos se declaran de la siguiente manera:
Llamar a procedimiento
Una llamada a procedimiento se realiza al especificar su nombre seguido por los
parámetros actuales colocados en el mismo orden que los parámetros formales corre-
spondientes.
26
Operadores
Los operadores son un tipo de tokens que indican las operaciones que se realizan sobre
los operandos en una expresión. Si el orden de realización de operaciones no es deter-
minado explícitamente madiante paréntesis, lo determina el operador de precedencia.
Hay 4 categorías de precedencia en mikroBasic. Los operadores de la misma categoría
tienen igual precedencia. Cada categoría tiene reglas de asociatividad: de izquierda a
derecha () o de derecha a izquierda (). En ausencia de paréntesis, estas reglas
resuelven la agrupación de expresiones con operadores de igual presedencia.
Operadores aritméticos
Los operadores aritméticos se utilizan para realizar operaciones matemáticas. Los operandos
de tipo char son los bytes, así que se pueden utilizar como los operandos sin signo en
operaciones aritméticas. Todos los operadores aritméticos se asocian de izquierda a
derecha.
Operador Operación Operandos Resultado
byte, short, byte, short,
suma integer, word, integer, word,
+ longint, dword, longint, dword, real
real
byte, short, byte, short,
- resta integer, word, integer, word,
longint, dword, longint, dword, real
real
byte, short, byte, integer, word,
* multiplicación integer, word, longint, dword,
dword, real short, real
división de los byte, short, byte, short,
/ objetos de punto integer, word, integer, word, real
flotante dword, real
división entera, byte, short, byte, short,
div redonde al entero integer, word, integer, word,
más cercano longint, dword longint, dword
módulo, devuelve el byte, short, byte, short,
resto de la división integer, longint, integer, longint,
mod de enteros (no word, dword word, dword
puede ser utilizado
con los objetos de
punto flotante)
27
Operadores relacionales
Los operadores relacionales se utilizan para operaciones lógicas. Todos los operadores
relacionales devuelven CIERTO o FALSO. Realizan desplazamientos de izquierda a
derecha.
Operador Operación
= igual que
<> desigual que
> mayor que
< menor que
>= mayor o igual que
<= menor o igual que
Expresiones
Una expresión es una secuencia de operadores, operandos y puntuadores que devuel-
ven un valor. Las expresiones primarias son: literales, constantes, variables y llamadas
a función. Se pueden utilizar para crear las expresiones complejas por medio de oper-
adores. La forma de agrupación de los operandos y de las subexpresiones no represen-
ta obligatoriamente el orden en el que se evalúan en mikroBasic.
Sentencias
Las sentencias especifican y controlan el flujo de ejecución del programa. En ausencia
de las sentencias de salto y de selección, las sentencias se ejecutan en el orden de su
aparición en el código de programa.
Sentencias de asignación
Una sentencia de asignación se parece a lo siguiente:
variable = expression
Sentencias condicionales
Las sentencias condicionales o las sentencias de selección pueden decidir entre varios cur-
sos de acción distintos en función de ciertos valores.
Sentencia If
La sentencia If es una sentencia condicional. La síntaxis de la sentencia if es la siguiente:
if expression then
statement1
[else
statement2]
end if
Los valores posibles de la expresión de control se pueden agrupar para que se varios
valores refierran a una sentencia. Es necesario enumerar los valores y separarlos por
comas.
31
Sentencias de iteración
Las sentencias de iteración permiten repetir un conjunto de sentencias. Las sentencias
break y continue se pueden utilizar para controlar el flujo de ejecución de sentencias
de bucles. La sentencia break termina el bucle en el que está, mientras que la contin-
ue inicia la nueva iteración del bucle.
Sentencia For
La sentencia for se utiliza para implementación del bucle iterativo cuando el número de
iteraciones está especificado. La sintaxis de la sentencia for es la siguiente:
El especificador counter es una variable que se incrementa por el valor del paso
(step_value) con cada iteración del bucle. El parámetro step_value es un valor integral
opcional, que es igual a 1 por defecto si es omitido. Antes de ejecutar la primera iteración
el contador se pone al valor inicial (initial_value) y se incrementa hasta llegar (o exced-
er) al valor final (final_value). Con cada iteración se ejecuta la sentencia dada (state-
ment). Las expresiones initial_value y final_value deben ser compatibles con la vari-
able counter. El especificador statement puede ser cualquier sentencia que no cambia
el valor de la variable counter.
El parámetro step_value puede ser negativo, lo que permite contar atrás.
Ejemplo de calcular el producto escalar de dos vectores a y b, de la longitud n, utilizan-
do la sentencia for:
s = 0
for i = 0 to n-1
s = s + a [i] * b [i]
next i
32
Bucle infinito
La sentencia for resulta en un bucle infinito si final_value equivale o excede al rango de la vari-
able counter. Esto es un ejemplo del bucle infinito ya que la variable counter nunca alcanzará el
valor 300.
dim counter as byte
...
for counter = 0 to 300
nop
next counter
La otra forma de crear un bucle infinito en mikroBasic es por medio de la sentencia while.
Sentencia While
La sentencia while se utiliza para implementación del bucle iterativo cuando el número
de iteraciones no está especificado. Es necesario comprobar la condición de iteración
antes de la ejecución del bucle. La síntaxis de la sentencia while es la siguiente:
La sentencia statement se ejecuta repetidamente siempre que el valor de la expresión
while expression
statement
wend
expression sea cierto. El valor de la expresión se comprueba antes de que se ejecute la sigu-
iente iteración. Si el valor de la expresión es falso antes de entrar el bucle, no es ejecuta ningu-
na iteración, esto es, la sentencia statement no se ejecuta ninguna vez. La forma más sim-
ple de crear un bucle infinito es la siguiente:
while TRUE
...
wend
Sentencia Do
La sentenica do se utiliza para implementación del bucle iterativo cuando el número de
iteraciones no es especificado. La sentencia se ejecuta repetidamente hasta que la
expresión sea cierta. Es necesario chequear la condición de iteración al final del bucle.
La síntaxis de la sentencia do es la siguiente:
do
statement
loop until expression
La sentencia statement se ejecuta repetidamente hasta que el valor de la expresión
expression llegue a ser cierto. La expresión se evalúa después de cada iteración así
que la sentencia se ejecutará por lo menos una vez. Ejemplo de calcular el producto
escalar de dos vectores utilizando la sentencia do:
s = 0
i = 0
...
do
s = s + a [i] * b [i]
i = i + 1
loop until i = n
33
Sentencias de salto
mikroBasic soporta las siguientes sentenicas de salto: break, continue, exit, goto y
gosub.
Sentencia Break
A veces es necesario detener el bucle dentro del cuerpo. La sentencia break dentro del bucle
se utiliza para pasar el control a la primera sentencia después del bucle. Por ejemplo:
Sentencia Continue
La sentencia continue dentro del bucle se utiliza para iniciar la nueva iteración del bucle.
Las sentencias que siguen después de la sentencia continue no se ejecutarán.
Sentencia Exit
La sentencia exit permite salir de rutina (función o procedimiento). Se pasa el control a
la primera sentencia después de la llamada a rutina. Ejemplo:
Sentencia Goto
La sentencia goto se utiliza para saltar de forma incondicional a la parte apropiada de
programa. La síntaxis de la sentencia goto es:
goto label_name
for i = 0 to n
for j = 0 to m
...
if disaster
goto Error
end if
...
next j
next i
...
Error: ' error handling code
Sentencia Gosub
La sentencia gosub se utiliza para saltar de forma incondicional a la parte apropiada de
programa:
gosub label_name
...
label_name:
...
return
Por medio de esta sentencia es posible saltar a la etiqueta label_name. Cuando aparece
la sentencia return el programa sigue ejecutando con la siguiente sentencia después de la
sentencia gosub. Esta sentencia puede preceder o seguir la declaración de etiqueta.
35
Sentencia asm
mikroBasic permite embeber las instrucciones en ensamblador en el código de progra-
ma por medio de las sentencias asm. Las instrucciones en ensamblador se pueden
agrupar utilzando la palabra clave asm:
asm
bloque de instrucciones en ensamblador
end asm
program test
dim myvar as word
main:
myvar = 0
asm
MOVLW 10
MOVWF _myvar
end asm
end.
36
Directivas
Las directivas son las palabras de significado especial que proporcionan las prosibili-
dades adicionales al compilar y mostrar los resultados.
Directivas de compilador
mikroBasic trata los comentaros que empiezan por el signo ‘#’ como directivas de com-
pilador. Estas directivas, entre otras cosas, permiten compilar el código de programa
condicionalmente, es decir, seleccionar las secciones particulares del código para com-
pilarlas. Todas las directivas de compilador deben ser terminadas en el fichero en el que
han empezado.
Directivas #IFDEF..#ELSE
La compilación condicional se realiza por medio de la directiva #IFDEF. Esta directiva
comprueba si una bandera está actualmente definida o no (utilizando la directiva
#DEFINE). La directiva #IFDEF termina por la directiva #ENDIF y puede contener una
cláusula #ELSE opcional:
#IFDEF flag
block of code
#ENDIF
#IFDEF flag_n
block of code n ]
[ #ELSE
alternate block of code ]
#ENDIF
Directivas de enlazamiento
mikroBasic utiliza el algoritmo interno para distribuir los objetos dentro de memoria. Si
es necesario tener una variable o una rutina en una dirección predefinida y específica,
se utilizan las directivas de enlazamiento absolute, org y orgall.
Directiva absolute
Direktiva absolute especifica la dirección inical de una variable en ls memoria RAM. Si
una variable es multi-byte, los bytes altos se almacenarán en las locaciones consecuti-
vas adyacentes empezando por la locación dada. Esta directiva se ańade a la
declaración de la variable:
Directiva org
Directiva org especifica la dirección inicial de una rutina en memoria ROM. Se ańade a
la declaración de rutina. Por ejemplo:
A los agregados constantes (estructuras, matrices) se les puede asignar espacio en una
dirección especificada en memoria ROM por medio de directiva org.
La excepción son los procedimientos interrupt a los que no se puede asignar espacio en
la dirección especificada en memoria ROM por medio de esta directiva.
Directiva orgall
La directiva orgall especifica la dirección inicial de una rutina en memoria ROM desde
la que empieza colocación de todas las rutinas y constantes. Por ejemplo:
main:
orgall(0x200) ' Todas las rutinas y constantes en el programa serán
almacenadas encima de la dirección 0x200, incluyéndola también.
...
end.
TÉRMINOS Y CONDICIONES
Todos los productos de MikroElektronika son protegidos por la ley y por los tratados
internacionales de derechos de autor. Este manual es protegido por los tratados de
derechos de autor, también. Es prohibido copiar este manual, en parte o en conjunto sin
la autorización previa por escrito de MikroElektronika. Se permite imprimir este manual
en el formato PDF para el uso privado. La distribución y la modificación de su contenido
son prohibidas.
MARCAS REGISTRADAS
Los productos y los nombres corporativos utilizados en este manual son protegidos por
la ley de los derechos de autor, sin reparar en la ausencia de notas adicionales. Las
marcas registradas son utilizadas exlusivamente con el propósito de identificar y explicar
los conceptos correspondientes y en beneficio de sus respectivos propietarios, sin
intención de infringirlas.