Programmation des sorties du port imprimante by 031pMMx

VIEWS: 35 PAGES: 6

									                   Programmation des sorties du port imprimante en Q-Basic

Q-Basic est un programme qui vous permet de créer vos propres logiciels.
Si vous parlez quelques mots d’anglais alors vous allez pouvoir programmer
Vous allez apprendre à écrire des programmes grâce auxquels vous ferez réaliser par l’ordinateur une suite
d’instructions que vous lui aurez commandée.

Quelques mots clé et commandes de base
REM. Parfois quand les programmeurs écrivent des programmes très longs, ils notent des remarques à
l'intérieur de leur programme celui-ci plus compréhensible lors d’une relecture. Vous pouvez remplacer REM
par une apostrophe (')
        REM ceci est une remarque
              Ce commentaire n’apparaît pas à l’écran et n’a aucune incidence sur le programme.

END : instruction qui indique la fin du programme

CLS : Il signifie CLear Screen en anglais : effacer l'écran.

PRINT :: Il vous voulez écrire quelque chose à l'écran.

COLOR : instruction qui est utilisée pour changer la couleur d'un mot à l'écran quand vous exécutez un
programme.
                0 Noir       4 Rouge           8 Gris               12 Rouge clair
                1 Bleu       5 Magenta         9 Bleu clair         13 Magenta clair
                2 Vert       6 Jaune           10 Vert clair        14 Jaune clair
                3 Cyan       7 Blanc           11 Cyan clair        15 Blanc vif

LOCATE : cette instruction déplace le curseur à une position spécifiée de l’écran
L’écran dans son mode par défaut comporte 25 lignes de 80 caractères
       LOCATE Y, X positionne le curseur à la ligne Y et la colonne X

Lancez le programme Q-Basic
Ecrivez ce programme dans l’éditeur de Q-Basic
        REM Affichage d‟un message à l‟écran
        CLS
        LOCATE 5 , 12
        COLOR 4
        PRINT "Je programme en Q-BASIC "
        REM Le texte entre guillemets s‟affichera à l‟écran
        END
Lancez ce programme (un raccourci : la touche F5 )

INPUT "question " ;c : demande une valeur qui sera affectée à c
INPUT "question " ;c$ : demande un mot (appelé chaîne de caractères) qui sera affectée à c$

Ecrivez ce programme dans l’éditeur de Q-Basic
        CLS : COLOR 4
        INPUT “code de la couleur (0 à 15)”; c
        INPUT “mot à écrire” ; mot$
        CLS : LOCATE 10 , 30 : COLOR c
        PRINT mot$ ; “en couleur “ ; c
        END
Comment communiquer avec le port parallèle ? Programmer le module DEL
Il y a deux mots clé permettant de communiquer avec les ports : OUT et INP
OUT sert à en envoyer des informations par ce port : il permet de transmettre un octet à un port D'E /S.
        Cette instruction est : OUT ad, val
    - Ad représente l’adresse du registre de donnée du port parallèle utilisé,
    - Val représente la valeur (octet) en décimal que l’on envoie.
Le registre de données du port imprimante, par lequel nous allons communiquer, se trouve à l’adresse
hexadécimale 378H ou 888 en décimal
        OUT &H378, n             n est la valeur en décimal que vous donnez à l’octet à envoyer

INP sert à récupérer les informations provenant du port.
        INP retourne l'octet lu sur un port D'E/S.

             Premières applications
            Ecrire un petit programme qui allumera la del 1 du module 8 DEL, en affichant à
        l‟écran « j‟allume la première DEL »
            Modifiez ce programme pour qu‟une DEL sur deux soit allumée.
            Le sauvegarder : DEL1

SLEEP instruction qui suspend l’exécution du programme pendant une durée précisée.
Cette instruction est : SLEEP n      n représente le nombre de secondes de temporisation du programme
        Le chenillard1
        Transformez le programme précédent pour allumer l‟une après l‟autre les huit diodes (une
        seule diode étant allumée à la fois) d‟abord dans un sens puis dans l‟autre sens
        Le sauvegarder : Chenillard1

Les Boucles
Dans le programme précédent, on répète plusieurs la même instruction en modifiant uniquement la valeur de
l’octet. On peut demandez à l’ordinateur de faire cette répétition en utilisant une structure de boucle
La boucle FOR … NEXT
Elle permet de faire autant de fois que l'on veut une certaine action.
        FOR n = X TO Y
                …….
                Suite d’instructions
                ……
        NEXT
         - n est une variable qui au cours des différentes boucles va voir sa valeur varier de X à Y par pas de 1
Si l’on veut que le pas de la progression soit différent, on ajoute le mot clé STEP
        - NEXT signifie que la boucle s'arrête à cet endroit

        FOR nbre = 1 TO 10
        PRINT nbre
        NEXT                       Rem Cette boucle affichera les nombres de 1 à 10

        FOR nb = 10 TO 0 STEP -2
        PRINT nb
        NEXT                Rem Cette boucle affichera la suite décroissante :             10 8 6 4        2 0

Pour des durées inférieures à une seconde il est préférable de créér à la place de Sleep n un sous-programme
nommé par exemple « attendre » qui obligera l’ordinateur à perdre du temps
Attendre :
For i = 1 to 10000
Next i
return
Le chenillard2
       Reprenez le programme Chenillard1 précédent mais utilisez cette fois la boucle FOR …
       NEXT pour ne pas répéter la même commande OUT (deux boucles consécutives seront
       nécessaires).
       Rappelez-vous que le poids de chaque bit peut se mettre sous forme d‟une puissance de 2
       (en basic notée 2^n)
       Le sauvegarder : Chenillard2

La boucle DO … LOOP
Le programme s’arrête après un seul cycle d’allumage des diodes ! Ne pourrait–on pas faire continuer
indéfiniment ce chenillard ?
La boucle DO … LOOP va permettre au programme de s’exécuter en boucle.
                                 DO
                                 ‘
                                 ‘
                                 LOOP
Evidemment au bout d’un certain temps on désire interrompre le programme : un appui simultané sur les
touches « Ctrl » et « Pause » provoque cet arrêt.
Mais il est plus logique d’introduire une condition d’arrêt dans le programme, à la suite de la commande de
boucle :
                                 DO
                                 ‘
                                 LOOP UNTIL [condition]
Le programme s’arrête, une fois la condition remplie et la boucle terminée
         DO
         Print " Option MPI "
         LOOP UNTIL INKEY$ = " a"
         Rem ce programme affiche ligne après ligne Option MPI tant que la touche « a » n‟est pas enfoncée
La commande INKEY$ lit un caractère entré au clavier
        Le chenillard2
        Complétez le programme Chenillard2 pour faire tourner le chenillard jusque l‟appui d‟une
        touche
        Le sauvegarder toujours sous Chenillard2

Programmez d’autres séquences pour le module DEL

Le module AFFICHEUR 7 SEGMENTS

        Programmez les séquences pour compter, avec temporisation d‟une seconde, de 0 à 9 sur
        l‟afficheur puis pour décompter de 9 à 0 et laisser clignoter le zéro jusque l‟appui de la
        touche « f »
        Le sauvegarder toujours sous Afficheur1


        - Interagir avec le programme
Tous les programmes précédents, s’effectuez sans qu’on puisse intervenir dans leurs déroulements.
Il serait intéressant, dans l’exemple précédent, que le programme nous propose le choix du chiffre à afficher.
Ce questionnement va pouvoir être fait avec l’instruction INPUT

INPUT lit les données entrées au clavier
      INPUT " message " ; Var
      message : message d’attente optionnel qui indique à l’utilisateur ce qu’il doit entrer au clavier
      le ; placé après le message ajoute un point d’interrogation au message
      Var est la variable dans laquelle sera placée la donnée entrée au clavier
Ecrivez ce programme dans l’éditeur de Q-Basic
        REM Affichage d‟un message à l‟écran
        CLS
        LOCATE 5,2
        PRINT “Je vais te montrer que je sais multiplier par 5 ! ”
        PRINT
              REM permet de passer une ligne
        INPUT “Entre un nombre : ” ; nb
        PRINT
        COLOR 4
        PRINT "le résultat de la multiplication par 5 donne : " ; 5*nb
        END
Lancez ce programme (raccourci : F5 )

        - Faire un choix parmi plusieurs possibilités
Vos programmes peuvent désormais collecter des informations mais il doit pouvoir prendre une décision en
fonction de l’information entrée, donc faire un choix entre plusieurs possibilités.
IF … THEN …. ELSE …. END IF
Travaillons sur un exemple : vous entrez deux nombre au clavier, l’ordinateur qui sait faire des comparaisons
devra vous afficher lequel est le plus grand.
     Soit les deux nombres contenus dans les variables nb1 et nb2
       Si nb1 > nb2 alors
       Afficher nb1 "est supérieur à" nb2
       Sinon
       Afficher nb2 est supérieur à nb1
Q-Basic fonctionne de la même manière sauf que les mots clé de cette instruction sont en anglais.
        Si = If
        Alors = Then
        Sinon = Else
Complétez et testez le programme permettant à l’ordinateur de faire cette comparaison
        REM programme comparaison
        CLS
        INPUT "entrez un premier nombre " ; …………
        INPUT "entrez un deuxième nombre " ; ………….
        IF ……………………… THEN PRINT ……………………………
        ELSE PRINT ……………………………..
        END IF
        REM il ne faut pas oublier le ENDIF pour dire à Q-Basic que l'instruction Si est finie.
        END
Il ne vous reste plus qu‟à programmer le module Afficheur 7 segments pour qu‟il affiche le chiffre entré au
clavier.
Rappel. Pour chaque chiffre de 0 à 9, indiquez la valeur à envoyer sur le port imprimante pour obtenir
l‟affichage du chiffre
 Chiffre
 Valeur décimale

Pour cela vous devrez enchaîner plusieurs fois l‟instruction IF … THEN ….
Le sauvegarder sous Afficheur2
Pour complétez votre programme, vous pourrez utiliser, pour permettre plusieurs choix successifs, une boucle
DO … LOOP avec comme condition d‟arrêt l‟entrée du nombre 10
Le module Carrefour
Programmez le fonctionnement des feux du carrefour pour qu‟il s‟exécute jusque l‟appui sur une touche
              * en mode nuit
diode          D5          D4          D3           D2          D1          D0
               VB          OB          RB           VA          OA          RA          Valeur décimale
Phase 1
Phase 2
Le sauvegarder sous Feuxnuit
                * en mode jour
                           Voie B                        Voie A
                D5        D4         D3        D2        D1     D0
                VB        OB         RB        VA        OA     RA           Valeur décimale     temporisation
   Phase 1
   Phase 2




Le sauvegarder sous Feuxjour
         * en mode Complet (Fonctionnement en jour ou nuit selon l’état de la LDR)
La LDR, qui doit commander le fonctionnement en mode jour ou nuit, modifie l’état du bit 7 (BUSY) du
registre d’état du port de la sortie imprimante à l’adresse 379H ou 889 en décimal
         - si la LDR est éclairée ce bit est à 1 et le mode jour doit fonctionner.
         - si la LDR est dans l’ombre, le bit est à zéro et le mode nuit doit se mettre en fonction.
Comment tester l’état de ce bit ?
     INP sert à récupérer les informations provenant du port.
              INP (addr) retourne la valeur de l'octet lu sur le port D'E/S d‟adresse addr.
Dans l'exemple ci dessus on peut tester la valeur de l'octet qui passe de 127 (au maximum) à 128 (au minimum)
lorsque le bit 7 passe de 0 à 1..
         en Qbasic          Valport = INP(889)
                            IF Valport < 128 THEN b7 = 0 ELSE b7 = 1
On affecte à la variable notée ici Valport, la valeur de l'octet du registre d’état du port d’adresse 379H.
Si cette valeur est strictement inférieure à 128 alors on peu être sûr que le bit b7 est à zéro, donc que la LDR
n’est pas éclairée et que le mode nuit doit être en fonction.
Le programme complet en Basic
Il reste maintenant à assembler vos deux « sous-programmes » précédents pour en faire un seul qui gérera les
deux modes jour et nuit.
         Déclarer les sous programmes feuxjour et feuxnuit
         Lire l’état du bit 7 (BUSY)
         Si l’état du bit7 est à 1 alors lancer l’exécution de feuxjours
         Sinon lancer l’exécution de feuxnuit
         Recommencer tant qu’une condition d’arrêt n’est pas réalisée
        Rem PROGCarrefour.bas
         DECLARE SUB feuxnuit ()
         DECLARE SUB feuxjour ()
         …………………………………
         ………………………… „le programme principal avec la boucle faisant le choix du mode
         SUB feuxjour
               ………… „description du sous-programme
         END SUB
         SUB feuxnuit
               ………… „description du sous-programme
         END SUB
Exemples de programmes
' Module DEL                                     Rem PROGCarrefour.bas
CLS                                              DECLARE SUB feuxnuit ()
ad = 888                                         DECLARE SUB feuxjour ()
OUT ad, 255                                      CLS
PRINT "toutes les sorties sont actives"          LOCATE 24, 1
SLEEP 3                                          PRINT "appuyez sur une touche pour arrêter"
FOR j = 0 TO 7
     OUT ad, 2^j                                 DO
     PRINT " bit de donnée"; j                   Valport = INP(889)
SLEEP 1                                           IF Valport < 128 THEN feuxnuit ELSE feuxjour
NEXT                                             LOOP UNTIL INKEY$ <> ""
FOR j = 7 TO 0 STEP -1
     OUT ad, 2^j                                 SUB feuxjour
     PRINT " bit de donnée"; j                   LOCATE 10,10
SLEEP 1                                          PRINT "JOUR"
NEXT                                             OUT Port, 12
' remet à zéro                                   SLEEP 4
OUT ad, 0                                        OUT Port, 10
END                                              SLEEP 1
                                                 OUT Port, 9
' Afficheur 7 segments                           SLEEP 1
ad = 888 'adresse du port parallèle LPT1         OUT Port, 33
CLS                                              SLEEP 4
PRINT "test des segments"                        OUT Port, 17
OUT ad, 255                                      SLEEP 1
                                                 OUT Port, 9
SLEEP 2
                                                 SLEEP 1
OUT ad, 0                                        END SUB
DO
  INPUT "Entrer un chiffre entre 0 et 9 (10      SUB feuxnuit
                              pour sortir)"; c   LOCATE 10,10
      IF c = 0 THEN OUT ad, 63                   PRINT "NUIT"
      IF c = 1 THEN OUT ad, 6                    OUT Port, 18
      IF c = 2 THEN OUT ad, 91                   SLEEP 1
      IF c = 3 THEN OUT ad, 79                   OUT Port, 00
      IF c = 4 THEN OUT ad, 102                  SLEEP 1
      IF c = 5 THEN OUT ad, 109                  END SUB
      IF c = 6 THEN OUT ad, 125
      IF c = 7 THEN OUT ad, 7
      IF c = 8 THEN OUT ad, 127
      IF c = 9 THEN OUT ad, 111
LOOP UNTIL c = 10
' remet à zéro
OUT ad, 0

								
To top