You are on page 1of 40

GUA DE REFERENCIA RPIDA A

mikroBasic
ESTIMADOS CLIENTES,
Querra 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. Adems,
seguimos mejorando nuestros rendimientos para responder a sus necesidades.
Nebojsa Matic
Director general
3
La gua referente proporciona definiciones formales de los elementos lxicos del lengua-
je de programacin mikroBasic. Estos elementos son pareciados a las unidades recono-
cidas por mikroBasic. Cada programa escrito en mikroBasic consiste en las secuencias
de los caracteres ASCII tales como letras, dgitos y signos especiales. Los signos no
imprimibles (por ejemplo: carcter nueva lnea, tabulador, etc) se refieren a los signos
especiales tambin. El conjunto de los elementos bsicos en mikroBasic es organizado
y limitado. El programa se escribe en un editor de texto tal como mikroBasic Code Edi-
tor. Durante el proceso de compilacin se realiza el anlisis sintctico (parsing). El pars-
er debe identificar los tokens de forma que el cdigo fuente es tokenizado, es decir,
reducido a tokens y espacios en blanco (whitespace).
Espacio en blanco
El espacio en blanco (whitespace) es el nombre genrico dado a los espacios (en blanco),
tabuladores horizontales y verticales y nueva lnea. Los espacios en blanco se utilizan
como separadores para indicar donde empiezan y terminan los tokens. Por ejemplo, las
dos secuencias:
y
son lxicamente equivalentes y el resultado del anlisis son los ocho tokens siguientes
Espacio en blanco en las cadenas literales
Cuando el espacio en blanco est dentro de una cadena literal no se utiliza como sepa-
rador, sino que se interpreta como un carcter comn, esto es, como una parte de una
sola cadena. Por ejemplo, la siguiente cadena:
se descompone en cuatro tokens, con tal de que la cadena literal represente un token:
dim tmp as byte
dim j as word
dim tmp as byte
dim j as word
dim
tmp
as
byte
dim
j
as
word
Visin general de los elementos lxicos
some_string = "mikro foo"
some_string
=
"mikro foo"
newline character
4
Tokens
El token es el elemento ms pequeo del lenguaje de programacin Basic reconocido
por el compilador. El cdigo fuente es escaneado de izquierda a derecha. El analizador
sintctico (parser) extrae los tokens, seleccionando el que coincida con la secuencia de
caracteres ms 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 estndar en
microBasic hay un conjunto de los identificadores predefinidos (de constantes y de vari-
ables) que describen el microcontrolador especfico y no pueden ser redefinidos. Lista
alfabtica de las palabras clave en Basic.
absolute
and
appactivate
array
as
asc
asm
at
atn
attribute
base
bdata
beep
bit
boolean
byref
byte
call
case
cbool
cbyte
ccur
cdate
cdate
cdbl
char
chdir
chdrive
chr
cint
circle
class
clear
clng
close
code
command
compact
compare
const
createobject
csng
cstr
curdir
currency
cvar
cverr
data
date
dateadd
datediff
datepart
dateserial
datevalue
ddb
deftype
dim
dir
div
do
doevents
double
each
eio
empty
end
end with
environ
eof
eqv
erase
err
error
exit
explicit
explicit
fileattr
fileattr
filecopy
filedatetime
filelen
fix
float
for
form
format
forward
freefile
function
fv
get
getattr
getobject
gosub
goto
hex
hour
idata
if
iif
ilevel
imp
implements
include
input
instr
int
integer
io
ipmt
irr
is
isarray
isdate
isempty
iserror
ismissing
isnull
isnumeric
isobject
kill
large
lbound
lcase
left
len
let
line
loc
lock
lof
long
longint
longword
loop
lset
me
mid
minute
mirr
mkdir
mod
module
month
msgbox
name
new
next
not
not
nothing
now
nper
npv
object
oct
on
open
option
option
option
or
org
orgall
pdata
pmt
ppmt
print
private
procedure
program
property
pset
public
put
pv
qbcolor
raise
randomize
rate
redim
register
rem
resume
return
rgb
right
rmdir
rnd
rset
rx
sbit
second
seek
select
sendkeys
set
setattr
sfr
sgn
shell
short
single
sln
small
space
spc
sqr
static
step
stop
str
strcomp
strconv
string
structure
sub
switch
syd
symbol
system
tab
time
timer
timeserial
timevalue
to
typedef
typename
ubound
ucase
unlock
until
val
variant
vartype
version
volatile
weekday
wend
while
width
with
word
write
xdata
xor
5
Comentarios
Los comentarios son anotaciones utilizadas para interpretar el programa. Son para uso
exclusivo del programador. Se eliminan del cdigo fuente antes del anlisis sintctico.
Los comentarios en mikroBasic deben ocupar slo una lnea. Para escribir comentarios
se utiliza el apstrofo.
Adems, los bloques de instrucciones en ensamblador pueden introducir los comentar-
ios unilneas al colocar el signo ; delante del comentario.
Identificadores
Los identificadores son los nombres arbitrarios utilizados para identificar los objetos
bsicos del lenguaje: etiquetas, tipos, smbolos, constantes, variables, procedimientos y
funciones. Los identificadores pueden contener todas las letras maysculas y minscu-
las del abecedario (a a z, y A a Z), el guin bajo "_", y los dgitos 0 a 9. El primer carc-
ter debe ser una letra o el guin bajo. mikroBasic no distingue maysculas y minscu-
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 ms de un identificador dentro del mismo mbito.
Ejemplos de identificadores vlidos:
y de identificadores invlidos:
' Any text between an apostrophe and the end of the
' line constitutes a comment. May span one line only.
asm
some_asm ; This assembly instruction
end asm
temperatura_V1
Pritisak
no_hit
dat2string
SUM3
_vtext
7temp // NO -- no puede empezar por un numeral
%higher // NO -- no puede contener los caracteres especiales
xor // NO -- no puede coincidir con las palabras reservadas
j23.07.04 // NO -- no puede contener los caracteres especiales(dot)
6
Literales
Los literales son tokens que representan valores fijos y numricos o valores de carac-
teres. El tipo de dato correspondiente a una constante es deducido por el compilador en
base a indicios implcitos, como el valor numrico y formato usados en el cdigo fuente.
Constantes literales enteras
Las constantes literales enteras pueden estar expresadas en los formatos decimal, octal
o hexadecimal.
En el formato decimal las constantes enteras se representan como una secuencia
de dgitos con el prefijo opcional + o - (no estn delimitados por coma, espacio en
blanco o puntos). Si no se especifica el prefijo, el valor de la constante se considera
positivo. Por ejemplo, el nmero 6258 equivale a +6258.
Las constantes con el prefijo $ o 0x se consideran nmeros hexadecimales. Por
ejemplo, $8F o 0x8F
Las constantes con el prefijo % se consideran nmeros binarios. Por ejemplo,
%01010101.
Ejemplos de las constantes literales:
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).
Constantes literales de punto flotante (fraccionarias)
Las constantes literales de punto flotante consisten en:
Parte entera;
Punto decimal;
Parte fraccionaria; y
e/E y un entero con signo (exponente)
Ejemplos de las constantes de punto flotante:
11 ' literal decimal
$11 ' literal hexadecimal, equivale a literal decimal 17
0x11 ' literal hexadecimal, equivale a literal decimal 17
%11 ' literal binario, equivale a literal decimal 3
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 carcter
Un literal carcter es una secuencia de caracteres ASCII delimitados por comillas sim-
ples. Un literal carcter 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 carcter correspondiente.
Cadenas literales (alfanumricas)
Una cadena literal representa una secuencia de caracteres ASCII escritos en una lnea
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
nmero de caracteres en los que consiste. Al final de cada cadena literal se aade un
carcter nulo (null), llamado el ASCII cero, que no cuenta en la longitud total de la cade-
na literal. Una cadena literal que no contiene ningn signo entre comillas (cadena nula)
se almacena como un solo carcter 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
( ) - parntesis
, - coma
; - punto y coma (slo en las sentenias ASM)
: - dos puntos
. - punto
Corchetes
Los corchetes indican ndices de matrices uni y multi dimensionales:
Parntesis
Los parntesis ( ) sirven para agrupar expresiones, aislar expresiones condicionales,
indicar llamadas a funciones y declaraciones de stas:
"Hola mundo!" ' mensaje de 11 caracteres
"La temperatura es estable" ' mensaje de 25 caracteres
" " ' dos espacios de 2 caracteres
"C" ' letra C de 1 carcter
"" ' cadena nula de 0 caracteres
dim abecedario as byte [30]
' ...
abecedario [2] = "c"
d = c * (a + b) ' modifica la precedencia normal
if (d = z) then ... ' expresin condicional
func() ' llamada a funcin, sin parmetros
sub function func2(dim n as word) ' declaracin de funcin, con parmetros
8
Coma
La coma , se utiliza para separar los parmetros en las llamadas a funcin, los identi-
ficadores en las declaraciones y los elementos del inicializador:
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:
Punto
El punto . se utiliza para acceder a un miembro de estructura y a los bits particulares
de registros. Por ejemplo:
Como los dems lenguajes de programacin, 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 continuacin se muestran los ejemplos de escribir los ficheros de programa. Cada
proyecto en mikroBasic consiste en un fichero de proyecto y en uno o ms mdulos
(ficheros con extensin .mbas). El fichero de proyecto proporciona las informaciones del
proyecto, mientras que los mdulos contienen el fuente de programa.
Mdulo principal
Cada proyecto en mikroBasic requiere un solo mdulo principal (main modul). Aquel mdulo
se identifica por la palabra clave programque est al principio del mdulo y da instucciones
al compilador de dnde debe iniciar el proceso de compilacin. Despus de crear un proyec-
to con xito en Project Wizard, Code Editor visualizar automticamente el mdulo prin-
cipal. Code Editor contiene la estructura bsica de un programa escrito en mikroBasic.
Aparte de comentarios, nada debe preceder a la palabra clave program. La clusula
include se puede colocar despus del nombre de programa. Todos los identificadores
globales (de constantes, variables, etiquetas, rutinas) se declaran delante de la palabra
clave main.
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)
start: nop
goto start
nombre.apellido = "Smith"
Organizacin de programa
9
Organizacin del mdulo principal
El mdulo principal se puede dividir en dos partes: declaraciones y el cuerpo de progra-
ma. Las declaraciones deben estar organizadas y colocadas en el cdigo apropiada-
mente. Al contrario, el compilador no puede interpretar el programa correctamente. Para
esribir el cdigo es recomendable seguir el ejemplo a continuacin.
Otros mdulos
Otros mdulos permiten:
descomponer los programas largos en las partes encapsuladas que se pueden edi
tar por separado;
crear libreras que se pueden utilizar en los proyectos diferentes; y
distribuir libreras a otros programadores sin revelar el cdigo fuente.
programa <nombre_de_programa>
include <incluir_otros_mdulos>
'********************************************************
'* Declaraciones globales:
'********************************************************
' declaraciones de smbolos
symbol ...
' declaraciones de constantes
const ...
' declaraciones de variables
dim ...
' deklaraciones de procedimientos
sub procedure procedure_name(...)
<declaraciones_locales>
...
end sub
' declariciones de funciones
sub function function_name(...)
<declaraciones_locales>
...
end sub
'********************************************************
'* Cuerpo de programa:
'********************************************************
main:
' escriba el cdigo aqu
end.
10
Cada mdulo se almacena en su propio fichero y se compila por separado. Los mdu-
los compilados se enlazan juntos con el propsito de crear un cdigo ejecutable. Para
compilar un proyecto el compilador tiene que disponer de todos los mdulos ya sean los
ficheros de cdigo fuente o ficheros de objetos (ficheros creados por medio de la com-
pilacin de mdulos). Todos los mdulos empiezan por la palabra clave modul. Aparte
de los comentarios nada debe preceder a la palabra clave modul. La clusula include
se puede colocar despus del nombre de mdulo.
Organizacin de otros mdulos
Cada mdulo consiste en tres secciones: Include, Interface e Implementation. Slo la
seccin Implementation es obligatoria. Siga el modelo a continuacin:
module <nombre_de_mdulo>
include <incluir_otros_mdulos>
'********************************************************
'* Interface (variables_globales):
'********************************************************
' declaraciones de smbolos
symbol ...
' declaraciones de constantes
const ...
' declaraciones de variables
dim ...
' prototipos de procedimientos
sub procedure procedure_name(...)
' prototipos de funciones
sub function function_name(...)
'********************************************************
'* Implementation:
'********************************************************
implements
' declaraciones de constantes
const ...
' declaraciones de variables
dim ...
' declaraciones de procedimientos
sub procedure procedure_name (...)
<declaraciones_locales>
...
end sub
' declaraciones de funciones
sub function function_name(...)
<declaraciones_locales>
...
end sub
end.
11
Clusula Include
mikroBasic incluye los mdulos por medio de la clusula include. Consiste en la palabra
reservada include y el nombre de mdulo entre comillas. El nombre del mdulo no
incluye la extensin. Un mdulo incluye varias clusulas include que deben estar colo-
cadas inmediatamente despus del nombre de mdulo. Por ejemplo:
Despus de llegar al nombre de mdulo, el compilador comprueba si el proyecto con-
tiene ficheros con el nombre dado y las extensiones .mcl y .mbas, de acuerdo con el
orden y la ubicacin especificados en la opcin Search Paths.
Si el compilador encuentra los dos ficheros con las extensiones .mbas y .mcl, comp
robar sus fechas e incluir el fichero de la fecha ms reciente en el proyecto. Si el
fichero de la extensin .mbas es de la fecha ms reciente, el compilador lo recom
pilar y generar el nuevo fichero .mcl al copiar el antiguo;
Si el compilador slo encuentra el fichero de la extensin .mbas, el compilador lo
recompilar y generar el fichero de la extensin .mcl;
Si encuentra el fichero de la extensin .mcl, el compilador lo incluir en el formato dado;
Si no encuentra ningn fichero, el compilador informa acerca del error
Seccin Interface
La seccin Interface es la seccin del mdulo que precede a la palabra clave imple-
ments. Esta seccin contiene declaraciones globales (de constantes, variables y smbo-
los) para el proyecto dado. En ella no se pueden definir rutinas. Esta seccin contiene
las declaraciones de rutinas (definidas en la seccin Implementation) que deben ser
visibles fuera del mdulo. Las declaraciones de rutinas deben corresponder completa-
mente a las definiciones de stas.
Seccin Implementation
Seccin Implementation contiene las declaraciones y definiciones privadas de las ruti-
nas. Esta seccin permite encapsular el cdigo. Todo lo que se declara despus de la
palabra clave implements es para el uso privado, es decir, el mbito est limitado a
aquel mdulo. Cualquier identificador declarado en esta seccin del mdulo no se puede
utilizar fuera del mdulo, sino slo en las rutinas definidas despus de la declaracin del
identificador dado.
program MyProgram
include "utils"
include "strings"
include "MyUnit"
...
12
mbito y visibilidad
mbito (scope)
El mbito de un identificador representa la seccin de programa en la que se puede uti-
lizar el identificador. Hay varias categoras del mbito lo que depende de cmo y dnde
se declaran los identificadores:
Visibilidad
Similar al mbito, la visibilidad representa la seccin 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.
Ubicacin de declaracin mbito
El identificador se declara en la
seccin de declaracin del mdulo
principal, fuera de cualquier funcin o
procedimiento
El mbito se extiende desde el punto
de declaracin hasta el final del
fichero, incluyendo todas las rutinas
dentro del mbito.
El identificador se declara en la
funcin o en el procedimiento
El mbito se extiende desde el punto
de declaracin hasta el final de la
rutina. Estos identificadores se
denominan locales.
El identificador se declara en la
seccin Interface del mdulo
El mbito se extiende desde el punto
de declaracin hasta el final del
mdulo. Incluye otros mdulos o
programas que utilizan ese mdulo.
La nica excepcin son los smbolos
cuyo mbito est limitado al fichero en
el que se declaran.
El identificador se declara en la
seccin Implementation, pero no se
declara dentro de culaquier funcin o
procedimiento
El mbito se extiende desde el punto
de declaracin hasta el final del
mdulo. El identificador est
disponible a cualquier funcin o
procedimiento definidos debajo de la
declaracin del identificador.
13
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 estndar (predefinidos) tales como son los tipos
enteros con signo o sin signo de varios tamaos, matrices, cadenas, punteros etc.
Adems, 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 ms
bsicos. En la tabla a continuacin se muestran los tipos simples en mikroBasic:
Tipos
Typedef MyType1 as byte
Typedef MyType2 as integer
Typedef MyType3 as ^word
Typedef MyType4 as ^MyType1
dim mynumber as MyType2
* tipo char se puede interpretar como el tipo byte en todos los aspectos
Tipo Tamao Rango
byte 8bit 0 255
char* 8bit 0 255
word 16bit 0 65535
short 8bit -128 127
integer 16bit -32768 32767
longint 32bit -2147483648 2147483647
longword 32-bit 0-4294967295
float 32bit 1.17549435082 * 10
-38
.. 6.80564774407 * 10
38
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
bsico. 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.
Declaracin de matrices
Las matrices se declaran de la siguiente manera:
Cada elemento de una matriz est numerado de 0 a array_lenght -1. El especificador
element_type representa el tipo de elementos de matriz (tipo bsico). A cada elemento
de matriz se le puede acceder al especificar el nombre de matriz seguido por el ndice
de elementos entre corchetes. Por ejemplo:
Matrices constantes
Una matriz constante se inicializa al asignarle una secuencia de valores delimitados por
comas entre parntesis. Por ejemplo:
El nmero de los valores asignados no debe exceder a la longitud especificada de
matriz, pero puede ser menor. En este caso, a los dems elementos se les asignarn los
ceros hasta llegar a la longitud total.
dim weekdays as byte [7]
dim samples as word [50]
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
...
' Declarar una matriz constante que contiene el nmero de das en cada
mes:
const MONTHS as byte [12] = (31,28,31,30,31,30,31,31,30,31,30,31)
' Declaracin 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))
element_type [array_lenght]
15
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:
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
parmetro de funcin, se pasa por su direccin 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:
El especificador string_name representa el nombre de la cadena y debe ser un identi-
ficador vlido. El especificador string_length representa el nmero de caracteres en las
que consiste la cadena. Al final de cada cadena se aade un carcter nulo (null), llama-
do el ASCII cero, que no cuenta en la longitud total de la cadena. Una cadena nula ('')
representa una matriz que contiene slo un caracter nulo.
Las cadenas se pueden asignar a las variables de tipo cadena, a la matriz de caracteres
y a la matriz de bytes.
Por ejemplo:
dim m as byte [50][20] 'matriz bidimensional de tamao 50x20
sub procedure example(dim byref m as byte [50][20])
...
inc(m [1][1])
end sub
dim m as byte [50][20] 'matriz bidimensional de tamao 50x20
dim n as byte [4][2][7] 'matriz tridimensional de tamao 4x2x7
main:
...
func(m)
end.
string [string_length]
dim poruka1 as string [20]
dim poruka2 as string [19]
main:
msg1 = "Esto es el primer mensaje"
msg2 = "Esto es el segundo mensaje"
msg1 = msg2
16
A una cadena se le puede acceder elemento por elemento. Por ejemplo:
Empalme de cadenas
mikroBasic permite empalmar las cadenas por medio del operador ms (+). Este tipo de con-
catenacin se puede aplicar a las variables de cadena, cadenas literales, variables cracter y
literales carcter. Los caracteres no imprimidos se pueden representar por medio del operador
Chr y el nmero que es el cdigo ASCII del carcter no imprimido correspondiente (Chr (13)
para CR). Por ejemplo:
mikroBasic contiene la librera String que facilita operaciones con cadenas.
dim s as string [5]
...
s = "mik"
' s [0] es el literal de caracteres "m"
' s [1] es el literal de caracteres "i"
' s [2] es el literal de caracteres "k"
' s [3] es cero (carcter nulo)
' s [4] es indefinido
' s [5] es indefinido
dim mensaje as string [100]
dim res_txt as string [5]
dim res, channel as word
main:
res = Adc_Read(channel) ' Resultado de la conversin AD
WordToStr(res, res_txt) ' Crear una cadena del resultado nmerico
' Preparar el mensaje de salida
mensaje = "Result is" + ' Texto "Resultado es"
Chr(13) + ' Aadir la secuencia CR/LF
Chr(10) + ' Aadir la secuencia LF
res_txt + ' Resultado de la conversin AD
"." ' Aadir un punto
17
Punteros
Un puntero es una variable cuyo fin especfico es almacenar direcciones de memoria de
objetos. Una variable accede directamente a la direccin de memoria mientras que el
puntero representa una referencia a la direccin. Para declarar un puntero, es necesario
aadir el prefijo (^) delante del tipo. Por ejemplo, para declarar un puntero a un objeto
de tipo integer es necesario escribir:
Para acceder al dato almacenado en la locacin de memoria a la que apunta un pun-
tero, es necesario aadir el sufijo (^) al final del nombre de la variable. Por ejemplo,
vamos a declarar la variable p que apunta a un objeto de tipo word, y luego vamos a
asignarle al objeto el valor 5:
Un puntero se puede asignar al otro puntero, despus de que los dos apuntarn a la
misma locacin de memoria. Al modificar el objeto al que apunta un puntero, ser mod-
ificado automticamente el objeto al que apunta otro puntero, porque se trata de la
misma locacin de memoria.
Operador @
Operador @ devuelve la direccin de una variable o una rutina, es decir, dirige al pun-
tero a su operando. Las siguientes reglas se aplican al operador@:
Si X es una variable, @X devuelve la direccin de X;
Si la variable X es de tipo array, el operador @ devolver el puntero a su primer elemen-
to bsico, excepto en el caso de que la parte izquierda de la expresin en la que se uti-
liza X sea el puntero a la matriz. En este caso, el operador @ devolver el puntero a la
matriz, y no a su primer elemento bsico.
Si F es una rutina (funcin o un procedimiento), @F devuelve el puntero a F.
^integer
dim p as ^word
...
p^ = 5
typedef array_type as byte[10]
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.
18
Puntero a funcin
mikroBasic permite el uso de los punteros a funcin. Este ejemplo muestra cmo definir y
utilizar un puntero a funcin. Primero vamos a definir el tipo procedural y el puntero a fun-
cin y por fin vamos llamar a funcin utilizando un puntero.
' Definicin de tipo procedural
typedef TMyFunctionType = function (dim param1, param2 as byte, dim param3 as word) as word
dim MyPtr as ^TMyFunctionType ' Puntero al tipo procedural previamente definido
dim sample as word
' Definicin de funcin
' Prototipo de funcin debe corresponder a la definicin de tipo procedural
sub function Func1(dim p1, p2 as byte, dim p3 as word) as word '
result = p1 and p2 or p3 ' devuelve el valor
end sub
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
' programa principal:
main:
' MyPtr ahora apunta a Func1
MyPtr = @Func1
' Llamar a funcin Func1 mediante puntero
Sample = MyPtr^(1, 2, 3)
' MyPtr ahora apunta a Func2
MyPtr = @Func2
' Llamar a funcin Func2 mediante puntero
Sample = MyPtr^(1, 2, 3)
' MyPtr ahora apunta a Func3
MyPtr = @Func3
' Llamar a funcin Func3 mediante puntero
Sample = MyPtr^(1, 2, 3)
end.
19
Estructuras
Las estructuras representan un conjunto heterogneo de elementos. Cada elemento se
denomina el miembro. En la declaracin de estructuras se especifica el nombre y el tipo
de cada miembro. La sntaxis de la estructura es la siguiente:
donde el especificador structname representa el nombre de estructura y debe ser el
identificador vlido; los especificadores member1..membern representan uno o ms
miembros de la estructura que deben ser identificadores vlidos, mientras que los
especificadores type1.. typen representan los tipos de los miembros de estructura cor-
respondientes. El mbito de un identificador de miembros est limitado a la estructura
en la que est, as que no hace falta tener en cuenta la coincidencia de los nombres de
los identificadores de miembros y las dems variables. En mikroBasic la estructura se
puede declarar slo como un tipo nuevo. Por ejemplo, en la siguiente declaracin es
creada la estructura denominada Dot:
Cada Dot contiene dos miembros: las coordenadas x y y. La memoria se asigna al
definir el objeto de tipo de estructura como en el siguiente ejemplo:
Mediante esta declaracin son creados dos ejemplos de la estructura Dot, denominados my
n. La estructura previamente definida puede ser el miembro de otra estructura Por ejemplo:
Acceso a miembros de estructura
A los miembros de estructura se les puede acceder mediante el operador punto .. Si
declaramos las variables circle1 y circle2 del tipo previamente definido Circle:
a sus miembros individules se les puede acceder de la siguiente manera:
structure structname
dim member1 as type1
...
dim membern as typen
end structure
structure Dot
dim x as float
dim y as float
end structure
dim m, n as Dot
' Estructura que define un crculo:
structure Circle
dim radius as float
dim center as Dot
end structure
dim circle1, circle2 as Circle
circle1.radius = 3.7
circle1.center.x = 0
circle1.center.y = 0
20
La conversin de un objeto de un tipo definido es el proceso de cambiar su tipo en otro.
mikroBasic soporta las conversiones implcita y explcita de tipos bsicos.
Conversin implcita
El compilador realizar la conversin implcita en los siguientes casos:
si una sentencia requiere una expresin de tipo particular, y se utiliza la expresin
de tipo diferente;
si un operador requiere un operando de tipo particular, y se utiliza un operando de tipo diferente;
si una funcin requiere un parametro formal de tipo particular, y se le pasa el objeto de tipo diferente;
si el resultado de una funcin no corresponde al tipo del valor devuelto.
Promocin
Cuando los operandos son de tipos diferentes, mediante la conversin implcita se real-
iza la promocin de tipo ms bajo a tipo ms alto, de la siguiente manera:
bit byte/char
byte/char word
short integer
short longint
integer longint
integral float
word longword
Los bytes ms altos del operando sin signo extendido se llenan de ceros. Los bytes ms
altos del operando con signo extendido se llenan del signo de bit. Si el nmero es nega-
tivo, los bytes ms altos se llenan de ceros, al contrario se llenan de ceros. Por ejemplo:
Recorte
En las sentencias de asignacin y en las sentencias que requieren una expresin de tipo
particular, el valor correcto ser almacenado en el destino slo si el resultado de expre-
sin no excede al rango del destino. Al contrario, si el resultado de la expresin excede
al rango del destino los bytes ms altos se pierden.
Conversin de tipos
dim a as byte
dim b as word
...
a = $FF
b = a ' promocin de a a word, de b a $00FF
dim i as byte
dim j as word
...
j = $FF0F
i = j ' i obtiene el valor $0F, byte ms alto $FF se pierde
21
Conversin explcita
La conversin explcita se puede realizar en cualquier expresin al especificar el tipo
deseado (byte, word, short, integer, longint, longword o float) delante de la expre-
sin que ser convertida. La expresin debe estar entre parntesis. Un caso especial es
conversin entre los tipos con signo y sin signo. La conversin explcita de estos tipos
de datos no cambia la representacin binaria de los datos. Por ejemplo:
La conversin explcita no se puede realizar en el operando que est a la izquierda del oper-
ador de asignacin:
Ejemplo de la conversin:
dim a as byte
dim b as short
...
b = -1
a = byte(b) ' a is 255, not 1
' El dato se queda en la representacin binaria 11111111
' pero el compilador la interpreta de la manera diferente
dim a, b, c as byte
dim cc as word
...
a = 241
b = 128
c = a + b ' es igual a 113
c = word(a + b) ' es igual a 369
cc = a + b ' es igual a 369
word(b) = a Compilador informa acerca de un error
Nota: Conversin de datos de punto flotante en datos integrales (en las sentencias de asignacin
o mediante conversin explcita - typecasting) produce el resultado correcto slo si el valor de
punto flotante no excede al mbito de destino de tipo integral.
22
Las variables son los objetos cuyo valor se puede modificar en tiempo de ejecucin. Cada
variable se declara bajo el nombre nico que debe ser el identificador vlido. Las variables
se pueden declarar en la seccin de declaracin 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 seccin de declaracin del mdulo principal.
Es necesario especificar el tipo de dato de cada variable. La sntaxis bsica de la
declaracin de variables es la siguiente:
El especificador identifier_list representa una lista de identificadores de variables sep-
arados por comas; el especificador type representa su tipo. mikroBasic permite utilizar
la versin reducida de la sntaxis que contiene slo la palabra clave dim seguida por las
declaraciones de variables mltiples. Por ejemplo:
Las constantes son los objetos cuyos valores se han definido en el momento de escribir
el cdigo de programa, y no pueden ser modificados ms tarde en tiempo de ejecucin.
Las constantes no se almacenan en la memoria RAM. Las constantes se declaran en la
seccin de declaracin de ficheros y rutinas. La sntaxis es:
Cada constante se declara bajo el nombre nico (especificador constant_name) que
debe ser el identificador vlido. Los nombres de constantes se escriben normalmente en
maysculas. Al declarar una constante es necesario especificar su valor que corre-
sponde al tipo dado. No es obligatorio especificar el tipo. En ausencia de tipo el compi-
lador supone un tipo simple con el mnimo mbito que corresponda al valor de con-
stante. MikroBasic permite utilizar una versin reducida de la sntaxis que contiene slo
la palabra clave const seguida por las declaraciones de constantes mltiples. Por ejem-
plo:
Variables
dim identifier_list as type
dim i, j, k as byte
counter, temp as word
samples as longint [100]
Constantes
const constant_name [as type] = value
const MAX as longint = 10000
MIN = 1000 ' compilador supone el tipo word
SWITCH = "n" ' compilador supone el tipo char
MSG = "Hello" ' compilador supone el tipo string
MONTHS as byte [12] = (31,28,31,30,31,30,31,31,30,31,30,31)
23
Las etiquetas sirven como objetivos para las sentencias goto y gosub. Marque la sen-
tencia con la etiqueta como en el siguiente ejemplo:
Las declaraciones de etiquetas no son obligatorias en mikroBasic. El nombre de la eti-
queta debe ser el identificador vlido. La sentencia marcada as como las sentencias
goto/gosub deben pertenecer al mismo bloque. Por lo tento no es posible saltar a un
procedimiento o a una funcin o de ellos. Una etiqueta se puede declarar slo una vez
dentro del mismo bloque.
Ejemplo del bucle infinito que llama al procedimiento Beep repetidamente:
Los smbolos en Basic permiten crear los macros simples sin parmetros. Cualquier
lnea de cdigo se puede reemplazar por un identificador. Los smbolos pueden aumen-
tar legibilidad y reutilizacin de cdigo cuando se utilizan correctamente. Los smbolos
deben ser declarados al principio del mdulo, bajo el nombre del mdulo y la directiva
(opcional) include.
Los smbolos no se almacenan en la memoria RAM - el compilador reemplaza cada sm-
bolo por la lnea de cdigo apropiada de la declaracin. Por ejemplo:
Etiquetas
label_identifier : statement
loop: Beep
goto loop
Smbolos
symbol alias = code
symbol MAXALLOWED = 216 'Smbolo como alias para el valor numrico
symbol PORT = PORTC 'Smbolo como alias para los SFR
symbol MYDELAY = Delay_ms(1000)'Smbolo como alias para llamar a procedimiento
dim cnt as byte 'Alguna variable
'...
main:
if cnt > MAXALLOWED then
cnt = 0
PORT.1 = 0
MYDELAY
end if
24
Las funciones y los procedimientos, denominados bajo el nombre comn rutinas, son
los subprogramas que ejecutan ciertas tareas a base de un nmero de los parmetros
de entrada. Las funciones devuelven el valor despus de la ejecucin, mientras que los
procedimientos no devuelven el valor. mikroBasic no soporta las rutinas inline.
Funciones
Las funciones se declaran de la siguiente manera:
El especificador function_name representa el nombre de funcin y puede ser cualquier
identificador vlido. El especificador parameter_list entre parntesis es la lista de los
parmetros formales que se declaran de la manera similar a las variables. Para pasar
un parmetro a funcin por direccin se debe introducir la palabra clave byref al princi-
pio de la declaracin del parmetro. Las declaraciones locales son las declaraciones
opcionales de variables, constantes y etiquetas y se refieren slo a la funcin dada. El
cuerpo de funcin representa una secuencia de sentencias que se ejecutarn despus
de llamar a funcin.
El especificador return_type representa el tipo de valor devuelto de funcin que puede
ser de tipo complejo. El ejemplo a continuacin muestra cmo se define y utiliza funcin
que devuelve el tipo complejo.
structure TCircle ' Structure
dim CenterX, CenterY as word
dim Radius as byte
end structure
dim MyCircle as TCircle ' Global variable
' DefineCircle function returns a Structure
sub function DefineCircle(dim x, y as word, dim r as byte) as TCircle
result.CenterX = x
result.CenterY = y
result.Radius = r
end sub
main:
' Get a Structure via function call
MyCircle = DefineCircle(100, 200, 30)
' Access a Structure field via function call
MyCircle.CenterX = DefineCircle(100, 200, 30).CenterX + 20
' |------------------------| |------|
' | |
' Function returns TCircle Access to one field of TCircle
end.
Funciones y procedimientos
sub function_name(parameter_list) as return_type
[declaraciones locales]
cuerpo de funcin
end sub
25
Llamar a funcin
Una llamada a funcin se realiza al especificar su nombre seguido por los parmetros
actuales colocados en el mismo orden que los parmetros formales correspondientes.
El compilador es capaz de hacer los parmetros mal aparejados obtener el tipo adecua-
do de acuerdo con las reglas de la conversin implcita. Si hay una llamada a funcin en
la expresin, el valor devuleto de funcin se utilizar como el operando en dicha expre-
sin.
Esta funcin simple calcula x
n
a base de los parmetros de entrada x y n (n> 0):
Al llamar a esta funcin es posible calcular, por ejemplo, 3
12
:
Procedimientos
Los procedimientos se declaran de la siguiente manera:
El especificador procedure_name representa el nombre de procedimiento y puede ser
cualquier identificador vlido. El especificador parameter_list entre parntesis repre-
senta la lista de parmetos formales que se declaran de la manera similar a las vari-
ables. Para pasar un parmetro a procedimiento por direccin se debe introducir la pal-
abra clave byref al principio de la declaracin del parmetro. Las declaraciones locales
son las declaraciones opcionales de variables, constantes y etiquetas y se refieren slo
al procedimiento dado. El cuerpo de procedimiento representa una secuencia de senten-
cias que se ejecutarn despus de llamar a procedimiento.
Llamar a procedimiento
Una llamada a procedimiento se realiza al especificar su nombre seguido por los
parmetros actuales colocados en el mismo orden que los parmetros formales corre-
spondientes.
sub procedure procedure_name(parameter_list)
[declaraciones locales]
cuerpo de procedimiento
end sub
tmp = power(3, 12)
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
26
Los operadores son un tipo de tokens que indican las operaciones que se realizan sobre
los operandos en una expresin. Si el orden de realizacin de operaciones no es deter-
minado explcitamente madiante parntesis, lo determina el operador de precedencia.
Hay 4 categoras de precedencia en mikroBasic. Los operadores de la misma categora
tienen igual precedencia. Cada categora tiene reglas de asociatividad: de izquierda a
derecha () o de derecha a izquierda (). En ausencia de parntesis, estas reglas
resuelven la agrupacin de expresiones con operadores de igual presedencia.
Operadores aritmticos
Los operadores aritmticos se utilizan para realizar operaciones matemticas. Los operandos
de tipo char son los bytes, as que se pueden utilizar como los operandos sin signo en
operaciones aritmticas. Todos los operadores aritmticos se asocian de izquierda a
derecha.
Operadores
Precedencia Operandos Operadores Asociatividad
4 1 @ not + -
3 2 * / div mod and << >>
2 2 + - or xor
1 2 = <> < > <= >=
Operador Operacin Operandos Resultado
+
suma
byte, short,
integer, word,
longint, dword,
real
byte, short,
integer, word,
longint, dword, real
- resta
byte, short,
integer, word,
longint, dword,
real
byte, short,
integer, word,
longint, dword, real
* multiplicacin
byte, short,
integer, word,
dword, real
byte, integer, word,
longint, dword,
short, real
/
divisin de los
objetos de punto
flotante
byte, short,
integer, word,
dword, real
byte, short,
integer, word, real
div
divisin entera,
redonde al entero
ms cercano
byte, short,
integer, word,
longint, dword
byte, short,
integer, word,
longint, dword
mod
mdulo, devuelve el
resto de la divisin
de enteros (no
puede ser utilizado
con los objetos de
punto flotante)
byte, short,
integer, longint,
word, dword
byte, short,
integer, longint,
word, dword
27
Divisin por cero
Al utilizar un cero (0) explcitamente como el divisor en la operacin de divisin (x div 0),
es decir, al dividir cualquier nmero por cero, el compilador informa acerca de un error y
no genera el cdigo. En caso de la divisin implcita, o sea en caso de que el divisor sea
un objeto cuyo valor es 0 (x div y, donde y=0), el resultado ser indefinido.
Operadores aritmticos unitarios
El operador - se utiliza como operador unitario para cambiar el signo de un objeto. El
operador + puede ser utilizado como operador aritmtico unitario tambin, sin tener influ-
encia en el objeto. Por ejemplo:
Operadores relacionales
Los operadores relacionales se utilizan para operaciones lgicas. Todos los operadores
relacionales devuelven CIERTO o FALSO. Realizan desplazamientos de izquierda a
derecha.
Operadores relacionales en expresiones
La precedencia de los operadores aritmticos y relacionales permite que las expresiones
complejas generen el resultado esperado sin utilizar parntesis. Por ejemplo:
Operadores de manejo de bits
Los operadores de manejo de bits se utilizan para modificar los bits individuales de
operandos. Los operadores de manejo de bits realizan desplazamientos de izquierda a
derecha. La nica excepcin es el complemento not que realiza un desplazamiento de
derecha a izquierda.
b = -a
Operador Operacin
= igual que
<>
>
<
>= mayor o igual que
menor o igual que
menor que
mayor que
desigual que
<=
a + 5 >= c - 1.0 / e ' (a + 5) >= (c - (1.0 / e))
28
Tabla de los operadores de manejo de bits
Operadores lgicos de manejo de bits
Los operadores lgicos and, or o xor realizan operaciones sobre los pares de bits
apropiados de sus operandos. El operador not complementa a cada bit de un operan-
do. Por ejemplo:
Operadores de desplazamiento de bits
Hay dos operadores de desplazamiento de bits en mikroBasic. Son el operador << que
realiza un desplazamiento de bits a la izquierda y el operador >> que realiza un
desplazamiento de bits a la derecha. Los operadores de desplazamiento de bits tienen
dos operandos. El operando izquierdo es un objeto que se desplaza, mientras que el
derecho indica el nmero de desplazamientos que se realizarn. Los dos operandos
deben ser de tipo integral. El operando derecho debe ser el valor positivo. Al desplazar
a la izquierda los bits que salen por la izquierda se pierden, mientras que los nuevos
bits a la derecha se rellenan con ceros. Por lo tanto, el desplazamiento del operando que
carace de signo a la izquierda por n posiciones equivale a multiplicarlo por 2
n
si todos
los bits descartados son ceros. Lo mismo se puede aplicar a los operandos con signo si
todos los bits descartados son iguales que el signo de bit. Al desplazar a la derecha los
bits que salen por la derecha se pierden, mientras que los nuevos bits a la izquierda se
rellenan con ceros (en caso del operando sin signo) o con el signo de bit (en caso del
operando con signo). El desplazamiento del operando a la derecha por n posiciones
equivale a dividirlo por 2
n
.
Operador Operacin
and
operador Y; compara pares de bits y devuleve 1 si los ambos bits
estn a 1; en caso contrario devuelve 0.
or
operador O; compara pares de bits y devuelve 1 si uno o los ambos
bits estn a 1; en caso contrario devuelve 0.
xor
operador exclusivo O (XOR); compara pares de bits y devuelve 1 si
los ambos bits son complementarios; en caso contrario devuelve 0.
not operador de complemento (unitario); invierte cada bit
<<
desplazamiento a izquierda; desplaza los bits a izquierda, el bit ms
a la izquierda se pierde y se le asigna un 0 al bit ms a la derecha.
>>
desplazamiento a derecha; desplaza los bits a derecha, el bit ms a
la derecha se pierde. Si el objeto carece de signo, se le asignar un
0 al bit ms a la izquierda; en caso contrario se le asignar un signo
de bit.
$1234 and $5678 // es igual a $1230
{ because ..
$1234 : 0001 0010 0011 0100
$5678 : 0101 0110 0111 1000
----------------------------
and : 0001 0010 0011 0000 .. esto es, $1230 }
29
Una expresin es una secuencia de operadores, operandos y puntuadores que devuel-
ven un valor. Las expresiones primarias son: literales, constantes, variables y llamadas
a funcin. Se pueden utilizar para crear las expresiones complejas por medio de oper-
adores. La forma de agrupacin de los operandos y de las subexpresiones no represen-
ta obligatoriamente el orden en el que se evalan en mikroBasic.
Las sentencias especifican y controlan el flujo de ejecucin del programa. En ausencia
de las sentencias de salto y de seleccin, las sentencias se ejecutan en el orden de su
aparicin en el cdigo de programa.
Sentencias de asignacin
Una sentencia de asignacin se parece a lo siguiente:
La sentencia de asignacin evala la expresin y le asigna el valor de la expresin a una
variable aplicando las reglas de la conversin implcita. El especificador variable puede
ser cualquier variable declarada, mientras que el especificador expression representa
la expresin cuyo valor corresponde a la variable dada. Hay que distinguir el operador
de asignacin = del operador relacional = utilizado para comprobar igualdad.
Sentencias condicionales
Las sentencias condicionales o las sentencias de seleccin pueden decidir entre varios cur-
sos de accin distintos en funcin de ciertos valores.
Sentencia If
La sentencia If es una sentencia condicional. La sntaxis de la sentencia if es la siguiente:
Si expression se evala como cierto, statement1 se ejecuta. Si expression se evala
como falso, statement2 se ejecuta. La rama else compuesta de palabra clave else y la
sentencia statement2 es opcional.
Expresiones
Sentencias
variable = expression
if expression then
statement1
[else
statement2]
end if
30
Sentencia Select Case
La sentencia Select case es una sentencia condicional de ramificacin mltiple. Con-
siste en una sentencia de control (selector) y una lista de los valores posibles de la
expresin. La sntaxis de la sentencia select case es la siguiente:
El especifiador selector es una expresin de control evaluada como un valor integral.
Los especifiadores value1..value_n representan los valores posibles del selector. Pue-
den ser literales, constantes o expresiones. Los especificadores statement1..state-
ment_n representan las sentencias. La clusula else es opcional. Primero se evala el
valor de la expresin de control. Luego se compara con todos los valores disponibles. Si
coinciden los valores, se ejecutar la sentencia apropiada y terminar la sentencia
select case. En el caso de que coincidan los valores mltiples se ejecutar la primera
sentencia coincidente. Si no coincide ningn valor con el selector, se ejecutar la sen-
tencia default_statement en la rama else (si hay alguna).
Ejemplo de la sentencia select case:
Los valores posibles de la expresin de control se pueden agrupar para que se varios
valores refierran a una sentencia. Es necesario enumerar los valores y separarlos por
comas.
select case selector
case value_1
statement_1
...
case value_n
statement_n
[case else
default_statement]
end select
select case operator
case "*"
res = n1 * n2
case "/"
res = n1 / n2
case "+"
res = n1 + n2
case "-"
res = n1 - n2
case else
res = 0
cnt = cnt + 1
end select
31
for counter = initial_value to final_value [step step_value]
statement
next counter
s = 0
for i = 0 to n-1
s = s + a [i] * b [i]
next i
Sentencias Select Case anidadas
Las sentencias Select Case se pueden definir dentro de otras sentencias select case.
Este proceso es denominado anidamiento.
Sentencias de iteracin
Las sentencias de iteracin permiten repetir un conjunto de sentencias. Las sentencias
break y continue se pueden utilizar para controlar el flujo de ejecucin de sentencias
de bucles. La sentencia break termina el bucle en el que est, mientras que la contin-
ue inicia la nueva iteracin del bucle.
Sentencia For
La sentencia for se utiliza para implementacin del bucle iterativo cuando el nmero 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 iteracin del bucle. El parmetro step_value es un valor integral
opcional, que es igual a 1 por defecto si es omitido. Antes de ejecutar la primera iteracin
el contador se pone al valor inicial (initial_value) y se incrementa hasta llegar (o exced-
er) al valor final (final_value). Con cada iteracin 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 parmetro step_value puede ser negativo, lo que permite contar atrs.
Ejemplo de calcular el producto escalar de dos vectores a y b, de la longitud n, utilizan-
do la sentencia for:
select case reg
case 0
opmode = 0
case 1,2,3,4
opmode = 1
case 5,6,7
opmode = 2
end select
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.
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 implementacin del bucle iterativo cuando el nmero
de iteraciones no est especificado. Es necesario comprobar la condicin de iteracin
antes de la ejecucin del bucle. La sntaxis de la sentencia while es la siguiente:
La sentencia statement se ejecuta repetidamente siempre que el valor de la expresin
expression sea cierto. El valor de la expresin se comprueba antes de que se ejecute la sigu-
iente iteracin. Si el valor de la expresin es falso antes de entrar el bucle, no es ejecuta ningu-
na iteracin, esto es, la sentencia statement no se ejecuta ninguna vez. La forma ms sim-
ple de crear un bucle infinito es la siguiente:
Sentencia Do
La sentenica do se utiliza para implementacin del bucle iterativo cuando el nmero de
iteraciones no es especificado. La sentencia se ejecuta repetidamente hasta que la
expresin sea cierta. Es necesario chequear la condicin de iteracin al final del bucle.
La sntaxis de la sentencia do es la siguiente:
La sentencia statement se ejecuta repetidamente hasta que el valor de la expresin
expression llegue a ser cierto. La expresin se evala despus de cada iteracin as
que la sentencia se ejecutar por lo menos una vez. Ejemplo de calcular el producto
escalar de dos vectores utilizando la sentencia do:
while expression
statement
wend
while TRUE
...
wend
dim counter as byte
...
for counter = 0 to 300
nop
next counter
do
statement
loop until expression
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
Aveces es necesario detener el bucle dentro del cuerpo. La sentencia break dentro del bucle
se utiliza para pasar el control a la primera sentencia despus del bucle. Por ejemplo:
Sentencia Continue
La sentencia continue dentro del bucle se utiliza para iniciar la nueva iteracin del bucle.
Las sentencias que siguen despus de la sentencia continue no se ejecutarn.
Sentencia Exit
La sentencia exit permite salir de rutina (funcin o procedimiento). Se pasa el control a
la primera sentencia despus de la llamada a rutina. Ejemplo:
' Esperar a que se inserte la tarjeta CF ;
Lcd_Out(1, 1, "No card inserted")
while true
if Cf_Detect() = 1 then
break
end if
Delay_ms(1000)
wend
' tarjeta CF se puede utilizar ahora ...
Lcd_Out(1, 1, "Card detected")
' continue salta aqu
for i = ...
...
continue
...
next i
' continue salta aqu
while condition
...
continue
...
wend
do
...
continue
...
'continue salta aqu
loop until condition
sub procedure Proc1()
dim error as byte
...
if error = TRUE then
exit
end if
... ' el cdigo no se ejecutar si error tiene el valor TRUE
end sub
34
Sentencia Goto
La sentencia goto se utiliza para saltar de forma incondicional a la parte apropiada de
programa. La sntaxis de la sentencia goto es:
Por medio de esta sentencia se ejecuta el salto a la etiqueta label_name. No es posible
saltar a un procedimiento o una funcin o de ellos. La sentencia goto se puede utilizar
para salir de cualquier nivel de las estructuras anidadas. No es recomendable saltar a
bucles u otras sentencias estructuradas, ya que se pueden producir resultados inesepra-
dos. En general no es recomendable utilizar la sentencia goto dado que prcticamente
cada algoritmo se puede realizar sin ella dando programas estructurados legibles.
No obstante, la sentencia goto es til para salir de las estructuras de control profunda-
mente anidadas.
Sentencia Gosub
La sentencia gosub se utiliza para saltar de forma incondicional a la parte apropiada de
programa:
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 despus de la
sentencia gosub. Esta sentencia puede preceder o seguir la declaracin de etiqueta.
for i = 0 to n
for j = 0 to m
...
if disaster
goto Error
end if
...
next j
next i
...
Error: ' error handling code
goto label_name
gosub label_name
...
label_name:
...
return
Sentencia asm
mikroBasic permite embeber las instrucciones en ensamblador en el cdigo de progra-
ma por medio de las sentencias asm. Las instrucciones en ensamblador se pueden
agrupar utilzando la palabra clave asm:
mikroBasic permite escribir los comentarios en el cdigo ensamblador embebido.
Adems, los comentarios unilneas en ensamblador se pueden escribir al introducir
punto y coma ; delante del comentario.
35
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
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 cdigo de programa
condicionalmente, es decir, seleccionar las secciones particulares del cdigo para com-
pilarlas. Todas las directivas de compilador deben ser terminadas en el fichero en el que
han empezado.
Directivas #DEFINE y #UNDEFINE
La directiva #DEFINE se utiliza para definir una constante condicional de compilador -
una bandera (flag). La bandera puede ser cualquier identificador vlido. Las banderas
tienen los espacios de nombres separados as que no hay posibilidad de confusin con
los identificadores de programa. Es posible definir slo una bandera por directiva. Por
ejemplo:
La diretiva #UNDEFINE sirve para indefinir (borrar) la bandera previamente definida.
Directivas #IFDEF..#ELSE
La compilacin 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
clusula #ELSE opcional:
Primero directiva #IFDEF comprueba si la bandera est definida por la directiva
#DEFINE. Si est definida, se compilar slo <block of code>. Si no est definida, se
compilar <alternate block of code>. La directiva #ENDIF seala el final de la secuen-
cia de compilacin condicional. El resultado de lo anteriormente dicho es que slo una
seccin de cdigo (puede estar vaca) ser compilada. La parte compilada puede con-
tener las directivas condicionales adicionales (anidadas). Cada directiva #IFDEF debe
terminar por la directiva #ENDIF. Por ejemplo:
#DEFINE extended_format
Directivas
#IFDEF flag
block of code
#ENDIF
#IFDEF flag_n
block of code n ]
[ #ELSE
alternate block of code ]
#ENDIF
37
Banderas previamente definidas
mikroBasic dispone de las banderas previamente definidas que se pueden utilizar para
compilar el cdigo de programa para los diferentes plataformas de hardware.
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 direccin predefinida y especfica,
se utilizan las directivas de enlazamiento absolute, org y orgall.
Directiva absolute
Direktiva absolute especifica la direccin inical de una variable en ls memoria RAM. Si
una variable es multi-byte, los bytes altos se almacenarn en las locaciones consecuti-
vas adyacentes empezando por la locacin dada. Esta directiva se aade a la
declaracin de la variable:
Directiva org
Directiva org especifica la direccin inicial de una rutina en memoria ROM. Se aade a
la declaracin de rutina. Por ejemplo:
A los agregados constantes (estructuras, matrices) se les puede asignar espacio en una
direccin especificada en memoria ROM por medio de directiva org.
' Descomentar la bandera apropiada:
'#DEFINE resolution8
#IFDEF resolution8 THEN
... ' code specific to 8-bit resolution
#ELSE
... ' default code
#ENDIF
dim x as byte absolute $22
' Variable x ocupa 1 byte en la direccin $22
dim y as word absolute $23
' Varibale y ocupa 2 bytes en las direcciones $23 y $24
sub procedure proc(dim par as byte) org $200
' Procedimiento proc se almacenar en la direccin $200
...
end sub
const arr as byte[10] = (0,1,2,3,4,5,6,7,8,9) org 0x400
' matriz constante ocupa 10 bytes en la direccin 0x400
38
La excepcin son los procedimientos interrupt a los que no se puede asignar espacio en
la direccin especificada en memoria ROM por medio de esta directiva.
Directiva orgall
La directiva orgall especifica la direccin inicial de una rutina en memoria ROM desde
la que empieza colocacin de todas las rutinas y constantes. Por ejemplo:
main:
orgall(0x200) ' Todas las rutinas y constantes en el programa sern
almacenadas encima de la direccin 0x200, incluyndola tambin.
...
end.
TRMINOS 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, tambin. Es prohibido copiar este manual, en parte o en conjunto sin
la autorizacin previa por escrito de MikroElektronika. Se permite imprimir este manual
en el formato PDF para el uso privado. La distribucin y la modificacin de su contenido
son prohibidas.
MikroElektronika proporciona este manual como est sin garantas de ninguna
especie, sean expresas o implcitas, incluyendo las garantas o condiciones implcitas de
comerciabilidad y aptitud para fines especficos.
Aunque MikroElektronika ha puesto el mximo empeo en asegurar la exactitud de la
informacin incluida en este manual, no asume la responsabilidad de ninguna especie
de daos derivados del acceso a la informacin o de los programas y productos
presentados en este manual (incluyendo daos por la prdida de los beneficios
empresariales, informacin comercial, interrupcin de negocio o cualquier otra prdida
pecuniaria).Las informaciones contenidas en este manual son para el uso interno.
Pueden ser modificadas en cualquier momento y sin aviso previo.
ACTIVIDADES DE ALTO RIESGO
Los productos de MikroElektronika no son tolerantes a fallos y no estn diseados,
fabricados o pensados para su uso o reventa como equipo de control en lnea en entornos
peligrosos que requieran un funcionamiento sin fallos, como en instalaciones nucleares, en
la navegacin area o en sistemas de comunicaciones, de trfico areo, mquinas de
auxilio vital o sistemas de armamento, en los que un fallo del software podra conducir
directamente a la muerte, lesiones corporales o daos fsicos o medioambientales graves
(Actividades de alto riesgo). MikroElektronika y sus proveedores niegan especficamente
cualquier garanta expresa o implcita de aptitud para Actividades de alto riesgo.
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 propsito de identificar y explicar
los conceptos correspondientes y en beneficio de sus respectivos propietarios, sin
intencin de infringirlas.
Copyright 2003 2009 por MikroElektronika. Todos los derechos reservados.
Si quiere saber ms de nuestros productos, por favor visite nuestra pgina web www.mikroe.com
Si tiene problemas con cualquiera de nuestros productos o slo necesita informacin adicional, deje
un ticket en www.mikroe.com/en/support
Si tiene alguna pregunta, comentario o propuesta de negocio, pngase en contacto con nosotros en
office@mikroe.com

You might also like