Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Algorithme de Bresenham
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1645
Enregistré en : juillet 2016
Localisation : Terre

#1 Message par Temps-x » sam. 28 mars 2020 17:46

Bonjour tout le forum,

Suite au programme écrit en RapidQ ICI sur l'algorithme de Bresenham, j'ai décidé de le réécrire pour microcontrôleur Pic

Je vous joins également un document expliquant son fonctionnement que vous pouvez télécharger ICI

J'ai utilisé un écran Oled 128x64 en mode de communication SPI pour vous montrer le résultat obtenu, voici son datasheet

Le microcontrôleur utilisé est un Pic18F26K22, voici son datasheet

Pour le rendre compatible pour les Pic16Fxxxx et Pic18Fxxxx je n'ai pas utilisé les instructions des microcontrôleurs Pic18Fxxxx

j'ai opté pour le mode SPI bit bang, ce qui permets de choisir les pattes quand veut sur le microcontrôleur, de plus ça le rends compatible
pour les microcontrôleurs ne possèdent pas du SPI

Voici mon branchement pour mode SPI

Code : Tout sélectionner

#DEFINE dc      LATA,2                 ; RA2 ==> sélection du mode : commande = 0 , donnée = 1
#DEFINE cs      LATA,1                 ; RA1 ==> activer ou désactiver la transmission
#DEFINE rst     LATA,0                 ; RA0 ==> reset de l'écran

#DEFINE sck     LATC,3                 ; RC3 ==> horloge de synchronisation 
#DEFINE mosi    LATC,5                 ; RC5 ==> envoyer les données sur écran oled 128x64


Le code ASM a été écrit avec jens file Editor 3.95

Code : Tout sélectionner

;***********************************************************************************************

    Errorlevel-302                        ; Supprime le message "Ensure that bank bits are correct" 

    radix dec                             
; par defaut en mode décimal

    list p
=18f26K22                       ; processeur utilisé                  
    
#include <p18f26K22.inc>              ; Définitions des constantes

;***********************************************************************************************

;
 CONFIG11H
     CONFIG FOSC 
= INTIO67 
     CONFIG FCMEN 
= OFF 
     CONFIG IESO 
= OFF
; CONFIG2L
     CONFIG PWRTEN 
= OFF 
     CONFIG BOREN 
= OFF 
     CONFIG BORV 
= 190
; CONFIG2H
     CONFIG WDTEN 
= OFF 
     CONFIG  WDTPS 
= 1
; CONFIG3H
     CONFIG CCP2MX 
= PORTC1                         
     CONFIG PBADEN 
= OFF
     CONFIG CCP3MX 
= PORTC6
     CONFIG HFOFST 
= OFF
     CONFIG T3CMX 
= PORTC0     
     CONFIG P2BMX 
= PORTC0
     CONFIG MCLRE 
= INTMCLR
; CONFIG4L
     CONFIG STVREN 
= ON 
     CONFIG LVP 
= OFF 
     CONFIG XINST 
= OFF 
     CONFIG DEBUG 
= OFF
; CONFIG5L
     CONFIG CP0 
= OFF 
     CONFIG CP1 
= OFF 
     CONFIG CP2 
= OFF 
     CONFIG CP3 
= OFF
; CONFIG5H
     CONFIG CPB 
= OFF 
     CONFIG CPD 
= OFF
; CONFIG6L
     CONFIG EBTR0 
= OFF
; CONFIG6H
     CONFIG EBTR1 
= OFF
; CONFIG7L
     CONFIG EBTR2 
= OFF
; CONFIG7H
     CONFIG EBTR3 
= OFF

;*************************************** assignations ***************************************** 

#DEFINE dc      LATA,2                 ; RA2 ==> sélection du mode : commande = 0 , donnée = 1
#DEFINE cs      LATA,1                 ; RA1 ==> activer ou désactiver la transmission
#DEFINE rst     LATA,0                 ; RA0 ==> reset de l'écran

#DEFINE sck     LATC,3                 ; RC3 ==> horloge de synchronisation 
#DEFINE mosi    LATC,5                 ; RC5 ==> envoyer les données sur écran oled 128x64

#DEFINE led1    LATC,7                 ; RC7 led verte, témoin de mise en fonction de l'appareil

;********************************* "déclaration des variables" *********************************

     CBLOCK H'20'                          ; bank0  
      loop0               
:1    
      loop1               
:1
      loop2               
:1
      loop3               
:1
      loop4               
:1
      loop5               
:1                    
      loop6               
:1
      loop7               
:1
      loop8               
:1                    
      loop9               
:1                

      buzzer              
:1
      curseur             
:1

      registre            
:1

      res8                
:1
      res16               
:1

      passage             
:1
       
      lecture             
:
      lettre              
:1
      phrase              
:1
      fonts               
:1

      posx                
:1  
      posy                
:1       
       

      frequence           
:1

      tension             
:

      delay               
:

      tempo               
:

      relever             
:1      

      temps               
:1

      tmps                
:4
 
      x1                  
:1
      x2                  
:1
      y1                  
:1
      y2                  
:1

      x                   
:1
      y                   
:1
  
      xdist               
:1
      ydist               
:1
 
      couleur             
:1

      pas                 
:1

      erreur              
:1

      bits                
:1
      envoyer             
:1

    ENDC

;************************* "Macro pour se positionner dans un tableau" ************************* 
tableau MACRO adresse

      movlw UPPER
(adresse)                ; 
      movwf TBLPTRU                       
;
      movlw HIGH(adresse)                 ;
      movwf TBLPTRH                       ; 
      movlw LOW
(adresse)                  ;
      movwf TBLPTRL                 
     
    ENDM

;********************************* "Macro pour effacer l'écran" ******************************** 
cls MACRO
      call cls_ssd1306

    ENDM

;************************** "Macro pour se positionner sur l'écran" **************************** 
locate MACRO valeur1
,valeur2,valeur3

      local nombre4
,good_bye4
                                           
      movlw valeur3
  
      btfss WREG
,0                        ; valeur3 = 0 que pour les nombres 
      goto nombre4                         
; valeur3 = 1 que pour les variables

      movf valeur1
,W                      ; hauteur de l'écran 0 à 7 pages (8 lignes)
      movwf posy
                          
      movf valeur2,W                      ; longueur de l'
écran 0 à 127 (128 pixels(colonnes))
      movwf posx                          ; ne pas utiliser 128

      goto good_bye4

nombre4
      movlw valeur1                       
; hauteur de l'écran 0 à 7 pages (8 lignes)
      movwf posy                          ; ne pas utiliser 8
                          
      movlw valeur2                       ; longueur de l'
écran 0 à 127 (128 pixels(colonnes))
      movwf posx                          ; ne pas utilise 128

good_bye4
      call position_ssd1306
                                  
    ENDM                      
 
;************************** "Macro pour afficher le texte sur l'écran" ************************* 
print MACRO valeur1
,valeur2,valeur3

     local nombre5
,good_bye5

      movlw valeur3
  
      btfss WREG
,0                        ; valeur3 = 0 que pour les nombres 
      goto nombre5                         
; valeur3 = 1 que pour les variables

      movf valeur1
,W                      ; longueur de la donnée
      movwf phrase                        
;  

      movf valeur2
,W                      ; emplacement du départ de la donnée
      movwf lecture                       
; emplacement du départ de la donnée

      goto good_bye5

nombre5
      movlw valeur1                       
; longueur de la donnée
      movwf phrase                        
;  
                                          
;  
      movlw valeur2                       
;  
      movwf lecture                       
; emplacement du départ de la donnée

good_bye5
      call affiche_ssd1306               
; 

    ENDM

;************************** "Macro pour afficher 1 pixel sur l'écran" ************************** 
pset MACRO valeur1
,valeur2,valeur3,valeur4

      local nombre6
,good_bye6
                                
      movlw valeur4
  
      btfss WREG
,0                        ; valeur4 = 0 que pour les nombres 
      goto nombre6                        
; valeur4 = 1 que pour les variables

      movf valeur1
,W                      ; longueur de l'écran 0 à 127 (128 pixels(colonnes))
      movwf posx                          ; ne pas utiliser 128

      movf valeur2,W                      ; hauteur de l'
écran 0 à 63 (64 pixels)
      movwf posy                          ; ne pas utiliser 64
                          
      movf valeur3
,W
      movwf couleur

      goto good_bye6

nombre6
      movlw valeur1                       
; longueur de l'écran 0 à 127 (128 colonnes)
      movwf posx                          ; ne pas utiliser 128

      movlw valeur2                       ; hauteur de l'
écran 0 à 63 (64 pixels) 
      movwf posy                          
; ne pas utiliser 64
                           
      movlw valeur3
      movwf couleur
                                       
good_bye6
      call pset_ssd1306                  
;  

    ENDM                      

;***********************************************************************************************
line MACRO valeur1,valeur2,valeur3,valeur4,valeur5,valeur6

      local nombre7
,good_bye7
                                
      movlw valeur6
  
      btfss WREG
,0                        ; valeur6 = 0 que pour les nombres 
      goto nombre7                        
; valeur6 = 1 que pour les variables

      movf valeur1
,W                      ; 
      movwf x1                            
; 

      movf valeur2
,W                      ; 
      movwf y1                            
; 
                          
      movf valeur3
,W                      ; 
      movwf x2                            
; 

      movf valeur4
,W                      ; 
      movwf y2                            
; 

      movf valeur5
,W                      ; 
      movwf couleur                       
; 

      goto good_bye7

nombre7
      movlw valeur1                       
; 
      movwf x1                            
; 

      movlw valeur2                       
; 
      movwf y1                            
; 
                          
      movlw valeur3                       
; 
      movwf x2                            
; 

      movlw valeur4                       
; 
      movwf y2                            
; 

      movlw valeur5                       
; 
      movwf couleur                       
; 
                                  
good_bye7

      call ligne

    ENDM

;*********************************************************************************************** 
graphique MACRO valeur1
         
      tableau valeur1

      call graphique_ssd1306

    ENDM

;******************************* "adresse de depart après reset" *******************************
    ORG H'0'
      goto debut

    ORG H
'8'                              ; interruption haute priorité
      retfie 
    ORG H
'18'                             ; interruption base priorité     
      retfie 

debut
;***************** "configuration de la bank sélectionné du microcontrôleur" *******************

      movlw B'00000000'          
      movwf BSR

;******************** "configuration de l'oscillateur du microcontrôleur" ********************** 

      movlw B
'01110100'                   ; oscillateur à 16 Mhz, fréquence stable si PLL (16 * 4)= 64 Mhz
;     movlw B'01100100'                   ; oscillateur à 8 Mhz, fréquence stable si PLL (* 4) = 32 Mhz
;     movlw B'01010010'                   ; oscillateur à 4 Mhz, fréquence stable  
;     movlw B'01000010'                   ; oscillateur à 2 Mhz, fréquence stable  
;     movlw B'00110010'                   ; oscillateur à 1 Mhz, fréquence stable  

      movwf OSCCON
      
      movlw B
'00000000'                   ;
      movwf OSCCON2                       ;

;****************************
 configuration du registre OSCTUNE ********************************

      movlw B'01000000'                   ; bit 6 à 1 : PLL * 4
      movwf OSCTUNE                       
; bit 6 à 0 : PLL désactivé
                                         
;*************************** configuration du registre ANSELA ********************************** 

      movlw B
'00100000'                   ; en mode numérique : 7(RA5) 
      movwf ANSELA                        
; en mode E/S       : 2(RA0), 3(RA1), 4(RA2), 5(RA3)

;****************************
 configuration du registre ANSELB ********************************* 

      movlw B
'00000000'                   ; en mode numérique : 
      movwf ANSELB                        
; en mode E/S       : 21(RB0), 22(RB1) 23(RB2), 24(RB3), 25(RB4), 26(RB5)  
             
;**************************** configuration du registre ANSELC ********************************* 

      movlw B
'00000000'                   ; en mode numérique :
      movwf ANSELC                        ; en mode E/S       : 13(RC2),  14(RC3), 15(RC4), 16(RC5), 17(RC6), 18(RC7)  

;*************************** configuration du registre ADCON0 ********************************** 

      movlw B
'00000000'                   ; b0 = ADON mise en service le convertiseur 0 = arrêt : 1 = marche   
      movwf ADCON0                        
; b1 = GO/DONE indique la fin de la conversion analogique, et permet de lancer la conversion
                                          
; b2 à b6 = réglage de la sélection du canal

;*************************** configuration du registre ADCON1 ********************************** 

      movlw B
'00000001'                   ; b2 à b3 = 00 : sélection de la tension de reférence, Vref+ = Vss   
      movwf ADCON1                        
; b0 à b1 = 00 : sélection de la tension de reférence, Vref- = Vdd 
                                          
;*************************** configuration du registre ADCON2 ********************************** 

      movlw B
'00001101'                   ; b0 à b2 = FOSC/64    
      movwf ADCON2                        
; b3 à b5 = 16 TAG 
                                          
; 
                                          
; b7 = détermine si le résultat de la conversion
                                          
; sera justifié à droite = 1 ou à gauche = 0  

;***********************************************************************************************

      movlw B'00000000'                   ; comparateur 1 off
      movwf CM1CON0 

      movlw B
'00000000'                   ; comparateur 2 off
      movwf CM2CON0 

;*********************** "configuration du pwm du microncontrôleur" ****************************

      movlw D'255'                        ; réglage du "débordement" de TMR2 
      movwf PR2                           
; PR2 D'255' (prédiviseur à 4) fréquence à 1950 Hz 

                                  
      movlw B
'00000101'                   ; "prédiviseur à 4" bit zéro à 1, bit un à 0 
      movwf T2CON                         
; "timer on", bit deux à 1 (mise en route du timer2. 0 : arrêt. 1 : marche)
                                          ; "postdiviseur à 1" bit trois à 0, bit quatre à 0, bit cinq à 0, bit six à 0
                                          
; dans registre de contrôle
                                         
      movlw B
'00001100'                   ; "1100" 4 bits mode pwm 
      movwf CCP1CON                       
; "00" 2 bits pour variation du rapport cyclique(RC2) 
      movwf CCP2CON                       
; "00" 2 bits pour variation du rapport cyclique(RC1) 

;***************** configuration des registres TRISA & TRISB & TRISC & TRISE ******************* 

      movlw B
'00100000'                   ; RA0(2), RA1(3), RA2(4), RA3(5), RA4(6), RA5(7), RA6(10), RA7(9)  
      movwf TRISA                         
; 

      movlw B
'11111111'                   ; RB0(21), RB1(22), RB2(23), RB3(24), RB4(25), RB5(26), RB6(27), RB7(28)
      movwf TRISB                         ; 

      movlw B
'00010001'                   ; RC0(11), RC1(12), RC2(13), RC3(14), RC4(15), RC5(16), RC6(17), RC7(18)     
      movwf TRISC                         
; 01010000

      movlw B
'00001000'                   ; RE3(1) 
      movwf TRISE                         
;

                                          ; VSS(8), VSS(19), VDD(20) 

;**************************** configuration du registre SSP1CON1 ******************************* 

;      movlw B'01000000'                   ; B7 = 0 : lecture des données au milieu
;      movwf SSP1STAT                      ; 
             
;      movlw B'00100001'                   ; B0 ...B3 = spi en mode Maître, B5 = polarité négative
;      movwf SSP1CON1                      ; horloge = FOSC/16 application 64 /16 = 4Mbps 
           
;******************************* configuration du registre T1CON *******************************
    
      movlw B
'10000100'                   ; mode asynchrone, division par 0
      movwf T1CON                         
; comptage sur l'entrée RC0

;******************************* configuration du registre PIE1 ********************************

      movlw B'
00000000
      movwf PIE1                          ; b0 = 0 désactivé le débordement du timer1

;**************************** configuration du registre INTCON2 ******************************** 

     movlw B'
00000000'                    ; B7 = 0 résistances en service
     movwf INTCON2                        ; interuption base priorité

;**************************** configuration du registre WPUB *********************************** 
                                        
     movlw B'
11111111'                    ; tirage de résistance sur        : RB0(21), RB1(22), RB2(23), RB3(24), RB4(25), RB5(26), RB6(27), RB7(28)  
     movwf WPUB                           ; pas de tirage de résistance sur :

;**************************** configuration du registre RCON *********************************** 

    movlw B'
00000000'                     ; 
    movwf RCON                            ; 

;**************************** configuration du registre INTCON *********************************      

     movlw B'
00000000'                    ; interruption hors service
     movwf INTCON                         ; 

;************************************ départ du programme **************************************

      clrf CCPR1L                         ; sortie du pwm(RC2) pour buzer
      clrf CCPR2L                         ; sortie du pwm(RC1) 

      clrf PORTA
      clrf PORTB
      clrf PORTC
   
      clrf LATA
      clrf LATB 
      clrf LATC
      
;***********************************************************************************************  

      call vide_bank                     ; mettre la bank0, bank1, bank2, bank3, bank4, bank5, 
                                          ; bank6, bank7, bank8, à zéro 
  
;**************************** " témoin visuel de mise en fonction" *****************************

      movlw D'
2'                          ; pour 2 clignotements
      movwf loop5
clignote
      bsf led1   
      call _1s                               
      bcf led1   
      call _1s
      decfsz loop5,F
      goto clignote  

;*************************** "initialisation de l'
écran oled 128x64" *************************** 

      bsf cs                              ; transmission arrêté 
      call _10ms
      bcf rst                             ; reset
      call _10ms
      bsf rst                             ;

;***********************************************************************************************

      movlw D'32'                         ; longueur de la donnée 
      movwf tmps+0                        

      tableau configuration               ; macro : qui permets de se positionner à l'adresse demandé

ini_ssd1306
      tblrd*+                             ; effectue la lecture, et ensuite incrémente TBLPTR

      movf TABLAT,W                       ; transfére la donnée récupére dans W
      call command_ssd1306               ; charge la configuration           
 
      decfsz tmps+0,F
      goto ini_ssd1306   


;***********************************************************************************************

;******** x1 = debut longueur, y1 = debut hauteur, x2 = fin longueur, y 2 = fin hauteur ********

;***********************************************************************************************

      cls                                 ; efface l'écran 

;-----------------------------------------------------------------------------------------------

      graphique image1

;-----------------------------------------------------------------------------------------------

      call _1s 
      call _1s 
      call _1s 

;-----------------------------------------------------------------------------------------------

      cls                                 ; efface l'écran 

;-----------------------------------------------------------------------------------------------

      locate 0,8,0                        ; macro : se placer à la hauteur de l'écran, se placer à la longueur de l'écran
      print 20,0,0                        ; macro : longueur de la donnée, emplacement du départ de la donnée à lire

;-----------------------------------------------------------------------------------------------

      call _1s 
      call _1s 
      call _1s 

;-----------------------------------------------------------------------------------------------

      cls                                 ; efface l'écran 

;-----------------------------------------------------------------------------------------------

      line 1,1,127,63,0,0                 ; ligne diagonal de la longueur à gauche 

      line 127,1,1,63,0,0                 ; ligne diagonal de la longueur à doite

      line 1,32,127,32,0,0                ; ligne horizontal du milieu

      line 64,1,64,63,0,0                 ; ligne vertical du milieu

;***********************************************************************************************     
terminer
      btfss led1
      bsf led1
      nop 
      goto terminer

;****** "
mettre la bank0, bank1, bank2, bank3, bank4, bank5, bank6, bank7, bank8, à zéro" ****** 
vide_bank
      lfsr FSR0,H'00'                     ; FSR0 pointe sur le début de la bank0      

ch_bank
      clrf POSTINC0                       ; efface l'octet et pointer sur suivants 
      btfss FSR0H,3                       ; tester si terminé FSR0 pointe sur H'800'     
      goto ch_bank                         ; non pas fini
 
      clrf INDF0                          ; sortir à H'800' en effaçant le dernier octet  
    
      return                              ; 

;***********************************************************************************************     
;*********************** "
gestion des fonctions de l'écran OLED 128x64" ************************
;***********************************************************************************************     

;------------------------ "affiche la lettre ou le texte sélectionné" -------------------------- 
affiche_ssd1306    
      
      tableau texte                       ; macro : qui permets de se positionner à l'
adresse demandé

      movf lecture
,W                      ;
      addwf TBLPTRL,F                     ;                   

      incf lecture
,F                      ; lecture pour le prochain passage 

      tblrd
*                              ; effectue la lecture de l’octet pointé par TBLPTR 
                      
      movf TABLAT
,W                       ; transfére le caractère récupéredans TABLAT vers W

lettre_ssd1306
      movwf lettre                        
; transfére le caractère récupére dans "lettre"
      mullw D'5'                          ; multiplier W par 5, résultat dans PRODH PRODL                                        
    
      movlw D
'5'                          ; 5 passages pour créer un caractère
      movwf passage

      tableau ascii                       
; macro  : qui permets de se positionner à l'adresse demandé
      
      movf PRODH,W                        ;
      addwf TBLPTRH,F                     ;  

      bcf STATUS,C                        ;

      movf PRODL,W                        ;
      addwf TBLPTRL,F                     ;                                

      btfsc STATUS,C                      ;
      incf TBLPTRH,F                      ;

ret2
      tblrd*+                             ; effectue la lecture, et ensuite incrémente TBLPTR

      movff TABLAT,WREG                   ; transfére la donnée récupére dans W
      call donner_ssd1306                ;

      decfsz passage                      ;
      goto ret2                            ;

      movlw B'
00000000'                   ; avance d'un pixel sur la longueur  
      call donner_ssd1306

      decfsz phrase
,F                     ; "phrase" est la longueur du texte
      goto affiche_ssd1306                 
; 

      incf phrase
,F                       ; préparation au cas ou il faudrait lire un caractére  

      return 

;----------------------- "efface l'écran & position le curseur au début" -----------------------
cls_ssd1306

      locate 0
,0,0                        ; 

      movlw D
'8' 
      movwf loop1

      movlw D
'128'                        ; ((128 pixels(colonnes))x(64 pixels))/8 bits = 1024 octets
      movwf loop2

cls_1 
      movlw B
'00000000'
      call donner_ssd1306                ; effacer les données existantes

      decfsz loop2
,F      
      goto cls_1

      bsf loop2
,7                         ; (128 pixels(colonnes))

      decfsz loop1,F      
      goto cls_1          
     
      return

;---------------------------- "remplissage de l'écran par un dessin" ---------------------------
graphique_ssd1306 

      locate 0
,0,0                        ;  

      movlw D
'8' 
      movwf loop1

      movlw D
'128'                        ; ((128 pixels(colonnes))x(64 pixels))/8 bits = 1024 octets
      movwf loop2

lire_graphique
      tblrd
*+                             ; effectue la lecture, et ensuite incrémente TBLPTR

      movf TABLAT
,W                       ; lecture du tableau sélectionné
      call donner_ssd1306                
;

      decfsz loop2,F
      goto lire_graphique

      bsf loop2
,7                         ; (128 pixels(colonnes))

      decfsz loop1,F
      goto lire_graphique

      return

;**************************** tracé de ligne d'un point à un autre *****************************
ligne
      clrf erreur

      clrf tmps+0
      clrf tmps+1

      clrf ydist
      clrf xdist   

      clrf pas

;-----------------------------------------------------------------------------------------------

      movf x1,W                           ; x_dist = abs(x2-x1)
      subwf x2,W 
      movwf xdist

      btfsc STATUS,C
      goto st1

      movf xdist,W
      sublw D'
0'
      
      movwf xdist
      
;-----------------------------------------------------------------------------------------------
st1
      movf y1,W                           ; y_dist = abs(y2-y1)
      subwf y2,W 
      movwf ydist                                     

      btfsc STATUS,C
      goto st2

      movf ydist,W
      sublw D'
0'
      
      movwf ydist     

;-----------------------------------------------------------------------------------------------
st2

      movf y1,W                           ; if y2-y1 < -xdist then
      subwf y2,W                                                 
      movwf tmps+0  

      btfsc STATUS,C                      ; est ce que (y2-y1) est négatif
      goto st3                     

      movf tmps+0,W
      sublw D'
0'
      movwf tmps+0
                                  
      movf tmps+0,W                       ;
      subwf xdist,W                       ;
                         
      btfss STATUS,C
      goto permute  

;-----------------------------------------------------------------------------------------------
st3
      movf x1,W                           ; if x2-x1 <= -ydist then
      subwf x2,W                                                 
      movwf tmps+0

      btfsc STATUS,C                      ; est ce que (x2-x1) est négatif
      goto coin                     
                                  
      movf tmps+0,W
      sublw D'
0'
      movwf tmps+0

      movf tmps+0,W
      subwf ydist,W 
                         
      btfsc STATUS,C
      goto coin

;-----------------------------------------------------------------------------------------------
permute                
      movf x1,W                           ; swap x1,x2
      movwf tmps+0

      movf x2,W
      movwf tmps+1

      movf tmps+1,W
      movwf x1

      movf tmps+0,W
      movwf x2
    
      movf y1,W                           ; swap y1,y2
      movwf tmps+0                            
                               
      movf y2,W
      movwf tmps+1
                               
      movf tmps+1,W
      movwf y1

      movf tmps+0,W
      movwf y2

;-----------------------------------------------------------------------------------------------
coin
      movf x1,W                           ; if x1 < x2 then xpas = 1 else xpas = -1
      subwf x2,W
   
      btfsc STATUS,C   
      bsf pas,0                          ; x1 < x2
      btfss STATUS,C
      bcf pas,0                          ; x1 > x2 
 
      movf y1,W                          ; if y1 < y2 then ypas = 1 else ypas = -1 
      subwf y2,W
  
      btfsc STATUS,C
      bsf pas,1                          ; y1 < y2
      btfss STATUS,C
      bcf pas,1                          ; y1 > y2 
  
;-----------------------------------------------------------------------------------------------

      movf ydist,W                       ; if ydist > xdist then
      subwf xdist,W

      btfsc STATUS,C
      goto remb3      

      bcf STATUS,C
      rrcf ydist,W
      
      movwf erreur                        ; erreur = ydist/2

      movf x1,W                           ; x = x1
      movwf x                          

;-----------------------------------------------------------------------------------------------
      movf y1,W                           ; for y = y1 TO y2     
      movwf y

      decf y,F
remb1                                          
      incf y,F

      pset x,y,0,1                       ; pset x,y,couleur,1

      movf xdist,W
      subwf erreur,F                      ; erreur = erreur - xdist    

                                          ; if erreur < 0 THEN
      btfsc STATUS,C   
      goto remb2
                                  
      btfsc pas,0   
      incf  x,F                           ; x = x + 1
      btfss pas,0
      decf  x,F                           ; x = x - 1   
                                            
      movf ydist,W
      addwf erreur,F                      ; erreur = erreur + ydist                                   
                                          
remb2
      movf y2,W
      xorwf y,W
      btfss STATUS,Z 
      goto remb1                           ; next y

      return

;-----------------------------------------------------------------------------------------------
remb3                                     ; else  

      bcf STATUS,C
      rrcf xdist,W                        ; erreur = xdist/2  

      movwf erreur                        ;

      movf y1,W                           ; y = Y1
      movwf y      

      movf x1,W 
      movwf x

      decf x,F
remb4                                     ; for x = x1 TO x2     
      incf x,F

      pset x,y,0,1                        ; pset x,y,couleur,1

      movf ydist,W
      subwf erreur,F                      ; erreur = erreur - ydist    


      btfsc STATUS,C                      ; if erreur < 0 then
      goto remb5
  
      btfsc pas,1   
      incf y,F                            ; y = y + 1
      btfss pas,1
      decf y,F                            ; y = y - 1   

      movf xdist,W
      addwf erreur,F                      ; erreur = erreur + xdist
                                          
remb5                                     ; end if 
      movf x2,W
      xorwf x,W
      btfss STATUS,Z 
      goto remb4                           ; next x

      return

;------------------------------------ "écriture d'
un pixel" ------------------------------------ 
pset_ssd1306    
      btfss INTCON,RBIF                   ; regarder si interuption en service
      bcf INTCON,GIE                      ; non, on coupe les interruptions

pset_co2
      movf posy,W                         ;  
      movwf relever                       ; sauvegarde de la hauteur de 0 à 63 (64 pixels)    
     
      bcf STATUS,C                        ; se positionner à la page
      rrcf posy,F                         ;
      bcf STATUS,C                        ;
      rrcf posy,F                         ;
      bcf STATUS,C                        ;
      rrcf posy,F                         ;

      call position_ssd1306              ; se positionné à la page demandé, et la longueur demandé
                                          ; 
      movf posy,W                         ;  
      mullw D'8'                          ; début de la page, (page x 8 bits), résultat dans PRODH PRODL                                        
                                          ; 
      movf PRODL,W                        ; 
      subwf relever,F                     ; position actuelle, (posy - (page x 8 bits)) 

      movlw B'00000001'                   ; 
      movwf loop9
                        
pset_re       
      movf relever,W                      ;
      xorlw D'0'
      btfss STATUS,Z                      ;
      goto pset_no 
      goto pset_en                         ;
pset_no
      decf relever,F
      bcf STATUS,C  
      rlcf loop9,F                        ;                   
      goto pset_re 

pset_en
      lfsr FSR1,H'300'                    ; H'300' bank3 debut de l'écran qui est en mémoire sdram dans les 
                                          ; bank3, bank4, bank5, bank6, bank7  
      movf posy,W                         
      mullw D'128'                        ; page x (128 pixels(colonnes)) = nombre d'octet

      bcf STATUS,C                        ; mettre carry à zéro, pour effectuer l'addition

      movf posx,W                         ; 
      addwf PRODL,F                       ; nombre d'octet + posx = nombre d'octet total
  
      btfsc STATUS,C                      ; regarder si il y a eu une retenu de l'addition
      incf PRODH,F                        ; ajouter 1 si retenu, en mémoire high

      movf PRODH,W                        ;
      addwf FSR1H,F                       ; se positionner a l'adresse en mémoire high   

      bcf STATUS,C                        ; mettre carry à zéro, pour effectuer l'addition

      movf PRODL,W                        ; 
      addwf FSR1L,F                       ; se positionner a l'adresse en mémoire low
    
      btfsc STATUS,C                      ; regarder si il y a eu une retenu de l'addition
      incf FSR1H,F                        ; ajouter 1 si retenu, en mémoire high

      movf INDF1,W                        ; récupérer la valeur qui est en mémoire  
      iorwf loop9,W                       ; fusionner les deux valeurs, en mettant le résultat dans W 

      movff WREG,INDF1                    ; mémoriser la donnée en sdram

pset_sp
      call donner_ssd1306                ; envoies des données, pour affichage sur l'ecran   
 
      btfss INTCON,RBIF                   ; regarder si interuption en service 
      bsf INTCON,GIE                      ; non, on restaure les interruptions

      return

;-------------------------------- "
position de y et x avec page" -------------------------------
position_ssd1306
      btfss INTCON,RBIF                   ; regarder si interuption en service
      bcf INTCON,GIE                      ; non, on coupe les interruptions      

      movf posx,W                         ; longueur de l'écran 0 à 127 (128 pixels(colonnes))
      andlw B'00001111'                   ;            
      call command_ssd1306               ; envoi du poids faible

      movf posx,W                         ;
      swapf WREG,W                        ;

      andlw B'00000111'                   ;
      bsf WREG,4                          ;
      call command_ssd1306               ;  envoi du poids fort                                     

      movf posy,W
      addlw 0xB0                          ; hauteur de l'écran 0 à 7 pages(8 lignes) 
      call command_ssd1306 
     
      btfss INTCON,RBIF                   ; regarder si interuption en service 
      bsf INTCON,GIE                      ; non, on restaure les interruptions

      return
                        
;----------------- "
fonction pour mettre l'écran oled 128x64 en mode commande" -----------------

command_ssd1306
      bcf dc                              ; DC = 0  en mode commande
      goto spi                          
     
;------------------ "fonction pour mettre l'
écran oled 128x64 en mode donnée" ------------------ 
donner_ssd1306
      bsf dc                              ; DC = 1 en mode donnée
      goto spi                             ;     

;*********************************************************************************************** 
spi
      btfss INTCON,RBIF                   ; regarder si interuption en service
      bcf INTCON,GIE                      ; non, on coupe les interruptions

      movwf envoyer 

      bcf cs                              ; marche       
      
      movlw D'8'                          ; envoies de 8 bits 
      movwf bits

ev1_ssd1306
      btfss envoyer,7                     ; 1 lecture sur le bit 7
      goto ev2_ssd1306      
      bsf mosi                            ; envoie 1
      bsf sck                             ; 
      bcf sck                             ;
      goto ev3_ssd1306
ev2_ssd1306
      bcf mosi                            ; envoie 0
      bsf sck                             ; 
      bcf sck                             ; 
ev3_ssd1306
      rlncf envoyer,F                     ; rotation des bits à gauche sans carry
      decfsz bits,F
      goto ev1_ssd1306

      bsf cs  

      btfss INTCON,RBIF                   ; regarder si interuption en service 
      bsf INTCON,GIE                      ; non, on restaure les interruptions

      return

;************************* "
pause de 1 seconde pour horloge de 64 Mhz" ************************* 
_1s
      movlw D'0'
      movwf loop1

      movlw D'43'
      movwf loop2

      movlw D'82'
      movwf loop3

      decfsz loop1,F
      goto $-D'2'
      decfsz loop2,F
      goto $-D'6'
      decfsz loop3,F
      goto $-D'10'

      return
;********************** "
pause de 10 millisecondes pour horloge de 64 Mhz" *********************
_10ms
      movlw D'201'
      movwf loop1

      movlw D'208'
      movwf loop2

      decfsz loop1
      goto $-D'2'
      decfsz loop2
      goto $-D'6'

      return

;*********************************************************************************************** 
;******************************** "
configuration de l'écran" ***********************************
;*********************************************************************************************** 
    ORG H'
8D9C
            
configuration
      db 0xAE,0xD5,0x80,0xA8,0x3F,0xD3,0x00,0x40,0x8D,0x14,0x20,0x00,0xA1,0xC8,0xDA,0x12
      db 0x81,0x7F,0xD9,0xF1,0xDB,0x40,0xA4,0xA6,0xAF,0x21,0x00,0x7F,0x22,0x00,0x07,0x2E

;*********************************************************************************************** 
;************************* "affichage des phrases, 255 octets maximum" *************************
;*********************************************************************************************** 
    ORG H'
8E00
                    
texte 
      db "Algorithme Bresenham"

;***********************************************************************************************
;***************************** "table des caractères ASCII" ************************************
;*********************************************************************************************** 
    ORG H'
9000'

ascii                           
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5F,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x14
      db 0x7F,0x14,0x7F,0x14,0x24,0x2A,0x7F,0x2A,0x12,0x26,0x16,0x08,0x34,0x32,0x76,0x49
      db 0x55,0x22,0x50,0x00,0x00,0x05,0x03,0x00,0x00,0x1C,0x22,0x41,0x00,0x00,0x41,0x22
      db 0x1C,0x00,0x14,0x08,0x3E,0x08,0x14,0x08,0x08,0x3E,0x08,0x08,0x00,0x50,0x30,0x00
      db 0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x60,0x60,0x00,0x00,0x20,0x10,0x08,0x04,0x02
      db 0x3E,0x51,0x49,0x45,0x3E,0x00,0x42,0x7F,0x40,0x00,0x42,0x61,0x51,0x49,0x46,0x21
      db 0x41,0x45,0x4B,0x31,0x18,0x14,0x12,0x7F,0x10,0x27,0x45,0x45,0x45,0x39,0x3C,0x4A
      db 0x49,0x49,0x30,0x01,0x01,0x79,0x05,0x03,0x36,0x49,0x49,0x49,0x36,0x06,0x49,0x49
      db 0x29,0x1E,0x00,0x36,0x36,0x00,0x00,0x00,0x56,0x36,0x00,0x00,0x00,0x08,0x14,0x22
      db 0x41,0x14,0x14,0x14,0x14,0x14,0x41,0x22,0x14,0x08,0x00,0x02,0x01,0x51,0x09,0x06
      db 0x3E,0x41,0x49,0x55,0x5E,0x7E,0x11,0x11,0x11,0x7E,0x7F,0x49,0x49,0x49,0x36,0x3E
      db 0x41,0x41,0x41,0x22,0x7F,0x41,0x41,0x22,0x1C,0x7F,0x49,0x49,0x49,0x41,0x7F,0x09
      db 0x09,0x09,0x01,0x3E,0x41,0x49,0x49,0x3A,0x7F,0x08,0x08,0x08,0x7F,0x00,0x41,0x7F
      db 0x41,0x00,0x20,0x41,0x41,0x3F,0x00,0x7F,0x08,0x14,0x22,0x41,0x7F,0x40,0x40,0x40
      db 0x40,0x7F,0x02,0x0C,0x02,0x7F,0x7F,0x04,0x08,0x10,0x7F,0x3E,0x41,0x41,0x41,0x3E
      db 0x7F,0x09,0x09,0x09,0x06,0x3E,0x41,0x51,0x21,0x5E,0x7F,0x09,0x19,0x29,0x46,0x46
      db 0x49,0x49,0x49,0x31,0x01,0x01,0x7F,0x01,0x01,0x3F,0x40,0x40,0x40,0x3F,0x1F,0x20
      db 0x40,0x20,0x1F,0x3F,0x40,0x3C,0x40,0x3F,0x63,0x14,0x08,0x14,0x63,0x07,0x08,0x70
      db 0x08,0x07,0x61,0x51,0x49,0x45,0x43,0x00,0x7F,0x41,0x41,0x00,0x02,0x04,0x08,0x10
      db 0x20,0x00,0x41,0x41,0x7F,0x00,0x04,0x02,0x01,0x02,0x04,0x40,0x40,0x40,0x40,0x40
      db 0x00,0x01,0x02,0x04,0x00,0x20,0x54,0x54,0x54,0x78,0x7F,0x48,0x44,0x44,0x38,0x38
      db 0x44,0x44,0x44,0x20,0x38,0x44,0x44,0x48,0x7F,0x38,0x54,0x54,0x54,0x18,0x08,0x7E
      db 0x09,0x01,0x02,0x08,0x54,0x54,0x54,0x3C,0x7F,0x08,0x04,0x04,0x78,0x00,0x44,0x7D
      db 0x40,0x00,0x20,0x40,0x44,0x3D,0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x41,0x7F,0x40
      db 0x00,0x7C,0x04,0x18,0x04,0x78,0x7C,0x08,0x04,0x04,0x78,0x38,0x44,0x44,0x44,0x38
      db 0x7C,0x14,0x14,0x14,0x08,0x08,0x14,0x14,0x18,0x7C,0x7C,0x08,0x04,0x04,0x08,0x48
      db 0x54,0x54,0x54,0x20,0x04,0x3F,0x44,0x40,0x20,0x3C,0x40,0x40,0x20,0x7C,0x1C,0x20
      db 0x40,0x20,0x1C,0x3C,0x40,0x38,0x40,0x3C,0x44,0x28,0x10,0x28,0x44,0x0C,0x50,0x50
      db 0x50,0x3C,0x44,0x64,0x54,0x4C,0x44,0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x7F,0x00
      db 0x00,0x00,0x41,0x36,0x08,0x00,0x08,0x08,0x2A,0x1C,0x08,0x08,0x1C,0x2A,0x08,0x08
      db 0x1E,0xA1,0xE1,0x21,0x10,0x3D,0x40,0x40,0x20,0x7D,0x38,0x56,0x55,0x54,0x18,0x20
      db 0x56,0x55,0x56,0x78,0x20,0x55,0x54,0x55,0x78,0x20,0x54,0x55,0x56,0x78,0x20,0x54
      db 0x55,0x54,0x78,0x0E,0x51,0x71,0x11,0x08,0x38,0x56,0x55,0x56,0x18,0x38,0x55,0x54
      db 0x55,0x18,0x38,0x54,0x55,0x56,0x18,0x00,0x45,0x7C,0x41,0x00,0x00,0x46,0x7D,0x42
      db 0x00,0x00,0x45,0x7E,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38
      db 0x46,0x45,0x46,0x38,0x38,0x45,0x44,0x45,0x38,0x38,0x45,0x46,0x44,0x38,0x3C,0x42
      db 0x41,0x22,0x7C,0x3C,0x40,0x41,0x22,0x7C,0x0C,0x51,0x50,0x51,0x3C,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x20,0x54,0x56,0x55,0x78,0x00,0x46,0x7D,0x40,0x00,0x38,0x44,0x46,0x45,0x38,0x3C
      db 0x42,0x41,0x20,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x55,0x00,0x55,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x16,0x7C,0x16,0x15,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0xF8,0x54,0x54,0x54,0x28,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x40
      db 0x40,0x20,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x08
      db 0x7C,0x08,0x10,0x10,0x20,0x7C,0x20,0x10,0x02,0x05,0x02,0x00,0x00,0x38,0x44,0x48
      db 0x30,0x4C,0xF8,0x54,0x54,0x54,0x28,0x38,0x44,0x4C,0x54,0x24,0x28,0x54,0x54,0x44
      db 0x20,0x58,0x64,0x04,0x64,0x58,0x44,0x3C,0x04,0x7C,0x44,0x63,0x55,0x49,0x41,0x41
;*********************************************************************************************** 
;**************************"affichage d'
un graphique N°2" **************************************
;*********************************************************************************************** 
    ORG H'F2EE'

image1      
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0x60,0x70,0x70,0xF0,0xF0,0xD0,0x90,0x90,0xB0
      db 0x30,0x30,0x70,0x70,0x70,0xF0,0xE0,0xE0,0xE0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0
      db 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0xC0
      db 0xC0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0xC0,0xE0,0x70,0x38,0x18,0x0C
      db 0x0C,0x8C,0xFC,0x7C,0x4C,0xFC,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0xC6,0xEC,0x7C,0xBC,0xF8,0xF8,0xF9,0xF1
      db 0xF1,0xF3,0x33,0x1A,0x0E,0x8E,0xC6,0x63,0x63,0x61,0xC1,0x01,0x00,0x00,0x00,0xC0
      db 0xC0,0x40,0x40,0x40,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xC1,0xC1,0xC1,0xC1,0x81,0x01,0x83,0xC3,0x83
      db 0x82,0x82,0x06,0x86,0x86,0x84,0x84,0x8C,0x0C,0x8C,0x88,0x88,0x98,0x18,0x18,0x9E
      db 0xBF,0xB3,0xB3,0x27,0x6D,0x6D,0x7F,0x7F,0x3F,0x3F,0x0F,0x00,0x00,0x00,0x00,0x00
      db 0x00,0xFF,0xCF,0xE4,0xFE,0xFF,0xC1,0xC0,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x3F,0x70,0x6F,0x7F,0xFF,0xFF,0xFF
      db 0x83,0x80,0xF8,0xDC,0xC6,0x9E,0xBF,0xBF,0xFF,0xFB,0x7E,0x3E,0xF8,0xDC,0x9E,0x3E
      db 0x7E,0x7E,0xF6,0xF6,0xFE,0x7D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x80,0x80,0xC0,0xC0,0xC0,0x4F,0x7C,0x78,0x7F,0x3F,0x3F,0x20,0x2F,0x3D,0x79
      db 0x7F,0x7F,0x70,0xFF,0xEF,0xA9,0xAF,0xAF,0xE0,0x67,0x6F,0x6B,0x7F,0xFF,0xF0,0xF7
      db 0x9F,0x9B,0xDF,0xDF,0x78,0x78,0x38,0x38,0x38,0x38,0x38,0x38,0x30,0x30,0x60,0x60
      db 0xC0,0xC0,0xC0,0xC1,0xC1,0xC3,0xC3,0xC3,0xC6,0xC7,0xE5,0xEF,0xEF,0xBB,0xBB,0xBE
      db 0xDE,0xCE,0x84,0x0E,0x3E,0x3B,0x33,0x60,0x61,0x61,0x39,0x3D,0x1F,0x0F,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF8,0x3C,0x0E,0x07,0x03,0x01,0x01
      db 0x01,0x01,0x01,0x01,0x01,0x03,0x03,0x02,0x06,0x04,0x0C,0x1C,0x18,0x71,0xF1,0x91
      db 0x19,0x19,0x19,0x09,0x08,0x08,0xCC,0xEC,0x6C,0xEC,0xE4,0x04,0x04,0x06,0x06,0x06
      db 0x07,0x0F,0x8D,0xD9,0x79,0xF1,0xF1,0xE3,0xE3,0xE2,0xC6,0xC6,0x86,0x8C,0x8C,0x0C
      db 0x18,0x18,0x18,0x30,0x30,0x30,0x20,0x61,0x61,0x41,0xC3,0xC3,0xC2,0x82,0x86,0x86
      db 0x06,0x07,0x0F,0x0F,0x0B,0x1B,0x1A,0x1E,0x1E,0x3E,0x3C,0x2C,0x2C,0x78,0x78,0xF0
      db 0xF0,0xE0,0xC0,0x00,0x38,0x7C,0xE4,0xE6,0xC7,0xBF,0xBD,0x1C,0x8D,0x8D,0xC5,0xC4
      db 0xC0,0x72,0x7B,0x3B,0x1F,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x0F,0x1C,0x18,0x30,0x30,0x20
      db 0x60,0x60,0x60,0x40,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xFF,0xDF
      db 0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xE0,0x70,0x7F,0x6F,0x60,0x60,0x20,0x20,0x30
      db 0x30,0x7F,0xE3,0xC1,0xBC,0x7F,0xFF,0xFF,0xE3,0xE1,0xE1,0xE3,0x7F,0x8D,0xE1,0xFF
      db 0x9F,0x83,0xC2,0xC2,0xC6,0x46,0x64,0x64,0x6C,0x2C,0x3C,0x38,0x18,0x19,0x19,0x19
      db 0x19,0x19,0x1B,0x1B,0x1B,0x1B,0x1A,0x1A,0x0A,0x0A,0x0E,0x0E,0x0E,0x06,0x07,0x07
      db 0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x02,0x02,0x02,0x03,0x03,0x03,0x01,0x01
      db 0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

    End


Fichier code + fichier à mettre dans le Pic : Line.zip

Une petite vidéo
https://youtu.be/JvbgqLQi7EU

==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Temps-x le jeu. 9 avr. 2020 12:51, modifié 46 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Algorithme de Bresenham
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 778
Âge : 34
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#2 Message par venom » sam. 28 mars 2020 18:20

:eek: Oh.... Beau rendu. #Temps-XMaSaperMaSoiree. :cry:

Bravo (même si je n'en attendais pas moins ;de ta part) :langue:







@++
En fait tout est une question de BIT ? :-D

Algorithme de Bresenham
JJE
Passioné
Passioné
Messages : 399
Âge : 79
Enregistré en : novembre 2017
Localisation : Picardie

#3 Message par JJE » mar. 31 mars 2020 18:41

merci Temps-x, belle réalisation.
Je m'en servirai dans mon papier en cours d'écriture sur la programmation modulaire en MPASM, ce qui fera une réponse plus complète
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

Algorithme de Bresenham
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1645
Enregistré en : juillet 2016
Localisation : Terre

#4 Message par Temps-x » mer. 1 avr. 2020 04:44

Bonsoir JJE, et tout le forum,

Je te mets le code de l'algorithme de Bresenham, avec ses variables et sa macro, il y a rien d'autre

Code : Tout sélectionner

;***********************************************************************************************
;**********************************
 "déclaration des macros" **********************************
;***********************************************************************************************
line MACRO valeur1,valeur2,valeur3,valeur4,valeur5,valeur6

      local nombre7
,good_bye7
                                
      movlw valeur6
  
      btfss WREG
,0                        ; valeur6 = 0 que pour les nombres 
      goto nombre7                        
; valeur6 = 1 que pour les variables

      movf valeur1
,W                      ; 
      movwf x1                            
; 

      movf valeur2
,W                      ; 
      movwf y1                            
; 
                          
      movf valeur3
,W                      ; 
      movwf x2                            
; 

      movf valeur4
,W                      ; 
      movwf y2                            
; 

      movf valeur5
,W                      ; 
      movwf couleur                       
; 

      goto good_bye7

nombre7
      movlw valeur1                       
; 
      movwf x1                            
; 

      movlw valeur2                       
; 
      movwf y1                            
; 
                          
      movlw valeur3                       
; 
      movwf x2                            
; 

      movlw valeur4                       
; 
      movwf y2                            
; 

      movlw valeur5                       
; 
      movwf couleur                       
; 
                                  
good_bye7

      call ligne

    ENDM
;***********************************************************************************************
;*********************************
 "déclaration des variables" *********************************
;***********************************************************************************************

 CBLOCK H'20'                          
      tmps                
:4
 
      x1                  
:1
      x2                  
:1
      y1                  
:1
      y2                  
:1

      x                   
:1
      y                   
:1
  
      xdist               
:1
      ydist               
:1
 
      couleur             
:1

      pas                 
:1

      erreur              
:1

    ENDC

;***********************************************************************************************
;****************************
 tracé de ligne d'un point à un autre *****************************
;***********************************************************************************************
ligne
      clrf erreur

      clrf tmps+0
      clrf tmps+1

      clrf ydist
      clrf xdist   

      clrf pas

;-----------------------------------------------------------------------------------------------

      movf x1,W                           ; x_dist = abs(x2-x1)
      subwf x2,W 
      movwf xdist

      btfsc STATUS,C
      goto st1

      movf xdist,W
      sublw D'
0'
      
      movwf xdist
      
;-----------------------------------------------------------------------------------------------
st1
      movf y1,W                           ; y_dist = abs(y2-y1)
      subwf y2,W 
      movwf ydist                                     

      btfsc STATUS,C
      goto st2

      movf ydist,W
      sublw D'
0'
      
      movwf ydist     

;-----------------------------------------------------------------------------------------------
st2

      movf y1,W                           ; if y2-y1 < -xdist then
      subwf y2,W                                                 
      movwf tmps+0  

      btfsc STATUS,C                      ; est ce que (y2-y1) est négatif
      goto st3                     

      movf tmps+0,W
      sublw D'
0'
      movwf tmps+0
                                  
      movf tmps+0,W                       ;
      subwf xdist,W                       ;
                         
      btfss STATUS,C
      goto permute  

;-----------------------------------------------------------------------------------------------
st3
      movf x1,W                           ; if x2-x1 <= -ydist then
      subwf x2,W                                                 
      movwf tmps+0

      btfsc STATUS,C                      ; est ce que (x2-x1) est négatif
      goto coin                     
                                  
      movf tmps+0,W
      sublw D'
0'
      movwf tmps+0

      movf tmps+0,W
      subwf ydist,W 
                         
      btfsc STATUS,C
      goto coin

;-----------------------------------------------------------------------------------------------
permute                
      movf x1,W                           ; swap x1,x2
      movwf tmps+0

      movf x2,W
      movwf tmps+1

      movf tmps+1,W
      movwf x1

      movf tmps+0,W
      movwf x2
    
      movf y1,W                           ; swap y1,y2
      movwf tmps+0                            
                               
      movf y2,W
      movwf tmps+1
                               
      movf tmps+1,W
      movwf y1

      movf tmps+0,W
      movwf y2

;-----------------------------------------------------------------------------------------------
coin
      movf x1,W                           ; if x1 < x2 then xpas = 1 else xpas = -1
      subwf x2,W
   
      btfsc STATUS,C   
      bsf pas,0                          ; x1 < x2
      btfss STATUS,C
      bcf pas,0                          ; x1 > x2 
 
      movf y1,W                          ; if y1 < y2 then ypas = 1 else ypas = -1 
      subwf y2,W
  
      btfsc STATUS,C
      bsf pas,1                          ; y1 < y2
      btfss STATUS,C
      bcf pas,1                          ; y1 > y2 
  
;-----------------------------------------------------------------------------------------------

      movf ydist,W                       ; if ydist > xdist then
      subwf xdist,W

      btfsc STATUS,C
      goto remb3      

      bcf STATUS,C
      rrcf ydist,W
      
      movwf erreur                        ; erreur = ydist/2

      movf x1,W                           ; x = x1
      movwf x                          

;-----------------------------------------------------------------------------------------------
      movf y1,W                           ; for y = y1 TO y2     
      movwf y

      decf y,F
remb1                                          
      incf y,F

     ; pset x,y,0,1                       ; pset x,y,couleur,1

      movf xdist,W
      subwf erreur,F                      ; erreur = erreur - xdist    

                                          ; if erreur < 0 THEN
      btfsc STATUS,C   
      goto remb2
                                  
      btfsc pas,0   
      incf  x,F                           ; x = x + 1
      btfss pas,0
      decf  x,F                           ; x = x - 1   
                                            
      movf ydist,W
      addwf erreur,F                      ; erreur = erreur + ydist                                   
                                          
remb2
      movf y2,W
      xorwf y,W
      btfss STATUS,Z 
      goto remb1                           ; next y

      return

;-----------------------------------------------------------------------------------------------
remb3                                     ; else  

      bcf STATUS,C
      rrcf xdist,W                        ; erreur = xdist/2  

      movwf erreur                        ;

      movf y1,W                           ; y = Y1
      movwf y      

      movf x1,W 
      movwf x

      decf x,F
remb4                                     ; for x = x1 TO x2     
      incf x,F

    ;  pset x,y,0,1                        ; pset x,y,couleur,1

      movf ydist,W
      subwf erreur,F                      ; erreur = erreur - ydist    


      btfsc STATUS,C                      ; if erreur < 0 then
      goto remb5
  
      btfsc pas,1   
      incf y,F                            ; y = y + 1
      btfss pas,1
      decf y,F                            ; y = y - 1   

      movf xdist,W
      addwf erreur,F                      ; erreur = erreur + xdist
                                          
remb5                                     ; end if 
      movf x2,W
      xorwf x,W
      btfss STATUS,Z 
      goto remb4                           ; next x

      return


la macro pset ne sera pas pris en compte, car ici il y a pas d'écran, aumusse toi bien il ya beaucoup de nombre négatif :-D

Si savait fait cette fonction pour seulement les Pic18Fxxxx j'aurais gagné du temps, car les Pic18Fxxxx possède un bit d'indication d'un résultat négatif. (voir registre STATUS)

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités