prof. Jacques Lepot
Introduction à BASCOM
Cette page est une rapide initiation au langage du compilateur Bascom. Nous supposons que le lecteur a déjà des connaissances en programmation, nous décrivons uniquement les particularités de ce langage.

Le programme


Basic est un des plus vieux langage informatique, il garde une trace de l'époque des cartes perforées et de l'assembler:
Une seule instruction par ligne, il n'y a pas de séparateur équivalent au ";" du C. (il y a des possibilités avec ":" mais éviter)
Si des fonctions (appelées aussi Sub) sont présentes, elles sont placées après le programme principal ( le main du C )
Le programme principal se termine par l'instruction End.
Le langage ne fait pas la distinction entre majuscules et minuscules, BABAR=1 est identique à Babar=1
Une ligne commentaire est précédé du caractère ' , on peut terminer une ligne par un commentaire.

Tout au début du programme on ajoute les lignes suivantes

$regfile = "M8def.dat"
$crystal = 8000000
$baud = 9600
$hwstack = 32
$swstack = 32 $framesize = 32

' Précise le modèle de processeur cible.
' Précise la clock utilisée (pour les wait)
' Uniquement si le port série est utilisé
' stack pour interruptions
' stack pour les appels de fonctions
' heap pour les variables locales

 
Les variables

Toute variable ou fonction doit être déclarée au début du programme de la manière suivante

Dim Babar As integer
Dim Compt_pulse As byte
Dim keyname As String*10


Il y a 7 types:

bit 0 ou 1
byte 0 à 255
word 0 à 65535, pas de signe
integer -32768 à 32767, positifs et négatifs
long -2147483648 à 2147483647, virgule flottante, positifs et négatifs
single 1.5 x 10^–45 à 3.4 x 10^38
string maximum 254 caractères, la longueur fixe doit être déclarée,
dans l'exemple *10 signifie 10 caractères

Evitez si possible les longs et les singles, il s'agit d'un processeur 8 bits, les librairies nécessaires utilisent assez bien de mémoire programme et les calculs sont beaucoup plus lents.

Additionner une constante à une variable prends 7 cycles d'horloge pour un byte, 16 cycles pour un word, 35 cycles pour un long et 198 cycles pour un single !

Les tableaux sont uniquement à une dimension (un indice), il se déclarent de la manière suivante:

Dim Tmprat(50) as word

Il y à 50 éléments, le premier est l'élément 1 (pas de Tmprat(0)).

Le nombre maximum d'éléments est de 65536, mais la vraie limite est la mémoire disponible.

Il n'y à pas de type structuré ou défini par l'utilisateur.

Pour définir une valeur Hexadéciamle, utilisez: &Hnn pour un byte, &Hnnnn pour un word,

exemples    &H0F = 15, &H10 = 16, &H0101 = 257

 

Les expressions

6 opérateurs arithmétiques: + , - , * , / , \ , ^
\ est la division entière division entière, plus rapide .

6 opérateurs de comparaison = ,<>,<,>,<=,>=

4 opérateurs logiques, NOT,OR,AND,XOR

Les expression doivent être "simples", c'est à dire 1 calcul à la fois.

A = B * C, ok
A = D(2) + 4, ok
A = C * 3 + B * 4, non, il y à 2 opérateurs

Il faut décomposer vos calculs complexes en sous opérations
(un peu comme en assembler, dommage)

 

Les structures de contrôle

Il n'y a pas d'équivalent aux " { " et " } " du C, chaque fin de bloc est défini par un mot clé.

Boucle For Next

For I = 5 To 25
   Babar = Babar + 1
   Maxi = Zer * Babar
Next
pas de parenthèses, utiliser le mot "To"


indique la fin du bloc à répéter.

For I = 1To 100 step 2
   incr Babar
   Maxi = Z(i) * Babar
Next
I avance de 2 à chaque boucle
une autre façon, plus rapide de faire + 1

indique la fin du bloc à répéter.

Boucle Do Loop

Do
   waitms 100
   Set LED
   waitms 100
   Reset LED
Loop
pause de 100 mili secondes

cette boucle ne s'arrètera jamais

Do
   waitms 100
   Toggle LED
   incr A
Loop until A>=10
toggle, inverse l'état d'un bit

Boucle While Wend

While A <= 10
   Print A
   Incr A
Wend



Wend indique la fin du bloc

Alternative If End If

If entree=1 then
   Set LED
   incr tempo
End If

Une seule branche, ne rien écrire dèrrière Then


End If, termine le bloc.


If entree=1 Then
   Set LED
   incr tempo
Else
   Reset LED
   decr tempo
End If

Deux branches, ne rien écrire derrière Then


Else termine le premier bloc


End If termine le deuxième bloc.

Select Case End Select

Select Case X
 Case 1 To 3 : Print "1 , 2 ou 3 "
 Case 4 : Print "4"
 Case 5 : Print "5"
 Case Else : Print "error"
End Select

La variable de sélection est un entier ou un caractère

 

End select termine le bloc

Pour terminer, un petit exemple complet

 

' Petit programme démo, les leds clignotent et le hp émet des beeps
' brancher des leds entre la masse et les sorties des ports B ou C, avec une résistance de 330 ohms en série
' pour le HP mettre en série un condensateur de quelques uF.

$regfile = "M8def.dat"      'le type de processeur
$crystal = 8000000      'sa fréquence
$hwstack = 32
$swstack = 32
$framesize = 32

' Déclaration de 2 variables
Dim i as byte
Dim j as byte

Declare Sub tuuut( nb as word)          ' Déclaration de la fonction tuut, prototype

' configurer les périfériques
Config PortB = output
Config PortC = output
hpout ALIAS PortC.0

Portb=0

Do
     j=1
     for i=1 to 8
          j=j * 2
          Portb=j
          Waitms 250      ' pause de 250 ms
     next

Loop

End

' la fonction tuuut
Sub tuuut (nb as word)

local iloc as Word         'local remplace Dim dans une fonction pour définir une variable locale.

  For iloc=1 to nb
    Toggle hpout
    waitms 2
  Next

End Sub