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

Écran OLED 0.96 128x64
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1484
Enregistré en : juillet 2016
Localisation : Terre

#1 Message par Temps-x » mar. 31 déc. 2019 12:40

Bonjour tout le forum,

J'ai acheté 6 écrans OLED 0.96 en 128x64 pixels de couleur bleu, jaune & bleu, blanc, donc 5 en mode SPI et 1 en I²C.

Prix d'achat pour chaque écran 1,25 euro, voici son datasheet

Voici les dimensions de l'écran
Dimension OLED 096.png

*****************************************************************************************************************************************************************************************

Mise en fonction des écrans OLED 128x64

Pour la mise en fonction des écrans OLED 128x64 je me suis servi d'un microcontrôleur Pic18F26K22, voici son datasheet

Écran jaune & bleu
Écran OLED 0.96 128x64 spi (jaune & bleu).jpg


Écran blanc
Écran OLED 0.96 128x64 spi (blanc).jpg


Écran bleu
Écran OLED 0.96 128x64 spi (bleu).jpg

D'autre couleur existe, mais le prix augmente, pour l'utilisation que je vais en faire pas besoin de mettre chère.

Attension si vous regardez les photos ci-dessus vous allez vous apercevoir qu'il y a différente version dans le branchement SPI, et dans le branchement de l'alimentation.

Si vous faite pas attention sur la polarité à chaque changement d'écran ça risque de fumer.... :sifflotte:

En ce qui concerne le branchement du mode SPI, j'ai prévu dans le code un changement de broche, en fonction de l'écran utilisé

Je vous joindrai le schéma un peu plus tard.

Le code


Le code ASM a été écrit avec jens file Editor 3.95, dans ce code je traite le protocole SPI

Code : Tout sélectionner

;***********************************************************************************************
;************************************
 "Écran OLED 128x64" **************************************
;***********************************************************************************************

    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 
= OFF 
     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 pousoir PORTB,0                ; RB0 pousoir d'arrêt et remise en fonction du défilement

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

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

     CBLOCK H'20'                          ; bank0  
      loop1               
:1
      loop2               
:1
      loop3               
:1
      loop4               
:1
      loop5               
:1                    

      loop6               
:1
      loop7               
:1
      loop8               
:1                    
      loop9               
:1                    

      buzzer              
:1
      curseur             
:1

      registre            
:1

      virgule             
:1
 
      passage             
:1

      lecture             
:
      lettre              
:1
      phrase              
:1
      fonts               
:1

      posx                
:1  
      posy                
:1

      temps               
:1
      tmps                
:1

      adresse_low         
:
      adresse_hi          
:1

      donner              
:
 
    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 écrit dans l'eeprom  ************************************ 
ecriture_eeprom MACRO valeur1,valeur2,valeur3 

      movlw valeur1
      movwf adresse_hi

      movlw valeur2
      movwf adresse_low

      movf valeur3,W
      movwf donner

      call eeprom_ecriture 

    ENDM

;*************************** Macro pour lire dans l'
eeprom  ************************************ 
lecture_eeprom MACRO valeur1
,valeur2

      movlw valeur1
      movwf adresse_hi

      movlw valeur2
      movwf adresse_low

      call eeprom_lecture

    ENDM

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

      movlw valeur1                       
; hauteur de l'écran 0 à 7 pages (8 lignes)
      movwf posy
                          
      movlw valeur2                       ; largeur de l'
écran 0 à 127 (128 pixels(colonnes))
      movwf posx  

      rcall position_ssd1306
                                  
    ENDM                      

;************************** "Macro pour afficher le texte sur l'écran" ************************* 
print MACRO valeur1
,valeur2

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

      rcall affiche_ssd1306               
; 

    ENDM

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

;     movlw valeur1                       ; hauteur de l'écran 0 à 63 (64 pixels) 
;     movwf posy
                          
;     movlw valeur2                       ; largeur de l'
écran 0 à 127 (128 colonnes)
;
     movwf posx  

;     rcall pixel_ssd1306
                              
    ENDM                      

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

    ORG H
'8'
      retfie 

    ORG H
'18'                                  
      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'00000000'                   ; bit 6 à 1 : PLL * 4
      movwf OSCTUNE                       
; bit 6 à 0 : PLL désactivé
                                         
;*************************** configuration du registre ANSELA ********************************** 

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

;**************************** 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
'00000000'                   ; 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
'00110110'                   ; 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' donc fréquence à 1950 Hz avec prédiviseur à 4

                                  
      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
'00000000'                   ; 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
'01010000'                   ; RC0(11), RC1(12), RC2(13), RC3(14), RC4(15), RC5(16), RC6(17), RC7(18)     
      movwf TRISC                         
; 

      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                      
; B'01000000'
             
      movlw B
'00100001'                   ; B0 ...B3 = spi en mode Maître, clock = FOSC/16, B5 = polarité négative
      movwf SSP1CON1                      
; 16 /16(quartz) = 1Mbps B'00100001'
           
;**************************** configuration du registre INTCON2 ******************************** 

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

;****************************
 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 INTCON *********************************      

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

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

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

      clrf PORTA
      clrf PORTB
      clrf PORTC
   
      clrf LATA
      clrf LATB 
      clrf LATC

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

      bsf cs                              
; désactivé l'émision du port spi

;**************************** " témoin visuel de mise en fonction" *****************************

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

;******************************** "reset de l'
écran OLED 128x64" ******************************* 

      bsf cs                              ; transmission arrêté 

      bcf rst                             ;
      rcall _10ms                         ;
      bsf rst                             ;
 
;*************************** "
initialisation de l'écran OLED 128x64" *************************** 
      movlw D'
32'                         ; longueur de la donnée 
      movwf phrase                        

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

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

      movff TABLAT
,WREG                   ; transfére la donnée récupére dans W
      rcall command_ssd1306               
; charge la configuration           
 
      decfsz phrase
,F
      bra ini_ssd1306   
      
;***********************************************************************************************

      incf phrase,F                       ;

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

      rcall cls_ssd1306                   ; efface l'écran

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

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

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

      locate 3,0                          ; macro : se placer à la hauteur de l'
écran, se placer à la largeur de l'écran
      print 21,44                         ; macro : longueur de la donnée, emplacement du départ de la donnée à lire
         
      locate 4,0                          ; macro : se placer à la hauteur de l'
écran, se placer à la largeur de l'écran
      print 21,66                         ; macro : longueur de la donnée, emplacement du départ de la donnée à lire

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

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

;************ "pause de 5 secondes, laisser temps de voir ce qu'
il y a sur l'écran" ************

      rcall _1s 
      rcall _1s      
      rcall _1s             
      rcall _1s
      rcall _1s     

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

      rcall cls_ssd1306                   ; efface l'
écran

;**************************** "afficher une image sur tout l'écran" **************************** 

      tableau graphique1                  
; macro qui permets de se positionner a l'adresse demandé       

      rcall graphique_ssd1306             ; affichage graphique N°1

;************ "pause de 5 secondes, laisser temps de voir ce qu'
il y a sur l'écran" ************

      rcall _1s 
      rcall _1s      
      rcall _1s             
      rcall _1s
      rcall _1s 

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

      rcall cls_ssd1306                   ; efface l'
écran

;**************************** "afficher une image sur tout l'écran" ****************************

      tableau graphique2                  ; macro qui permets de se positionner a l'adresse demandé       

      rcall graphique_ssd1306             ; affichage graphique N°2

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

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

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

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

      movlw 0x27                          ; défilement horizontal 
      rcall command_ssd1306               ; droite vers gauche 0x26, gauche vers la droite 0x27   
      movlw 0x00                          ;
      rcall command_ssd1306               ; 

      movlw 0x02                          ; début de la page du défilemnt
      rcall command_ssd1306

      movlw 0x07                          ; vitesse du défilement, du plus vite, au plus lent
      rcall command_ssd1306               ; 0x07, 0x04, 0x05, 0x00, 0x06, 0x01, 0x02, 0x03   

      movlw 0x06                          ; fin de la page  du défilement
      rcall command_ssd1306

      movlw 0x00                          ; valider la fin de configuration du défilement
      rcall command_ssd1306
      movlw 0xFF                          ; valider la fin de configuration du défilement
      rcall command_ssd1306

;*********************************************************************************************** 
action

      btfsc pousoir
      bra $-D'
2'
   
      movlw 0x2F                          ; défilement hors fonction 
      rcall command_ssd1306               ; avion à l'
arrêt

      rcall _100ms
 
      btfss pousoir
      bra 
$-D'2'

      movlw 0x2E                          ; défilement en fonction 
      rcall command_ssd1306               
; avion en vol

      rcall _100ms

      bra action

;*********************************************************************************************** 
terminer
      bsf led1                            
; signal la fin  
      nop  
      bra terminer

;*********************************************************************************************** 
      
;************************ "affiche la lettre ou le texte sélectionné" ************************** 
affiche_ssd1306    
     
      tableau message                     
; 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(largeur de des fonts)                                        
    
      movlw D'
5'                          ; 5 passages pour créer un caractère(largeur des fonts)
      movwf passage

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

      movf PRODL
,W                        ;
      addwf TBLPTRL,F                     ;                                
ret2
      tblrd
*+                             ; effectue la lecture, et ensuite incrémente TBLPTR

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

      decfsz passage                      ;
      bra ret2                            ;

      movlw B'00000000'                   ; avance d'un pixel sur la largeur  
      rcall donner_ssd1306

      decfsz phrase,F                     ; "phrase" est la longueur du texte
      bra 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

      movlw D'8' 
      movwf loop1

      movlw D'128'                        ; (128x64)/8 = 1024
      movwf loop2

cls 
      movlw B'00000000'
      rcall donner_ssd1306                ; effacer les données existantes

      decfsz loop2,F      
      bra cls

      bsf loop2,7                         ; 128

      decfsz loop1,F      
      bra cls          

      return

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

      locate 0,0

      movlw D'
8
      movwf loop1

      movlw D'
128'                        ; (128x64)/8 = 1024
      movwf loop2

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

      movff TABLAT,WREG                   ; 
      rcall donner_ssd1306                ;

      decfsz loop2,F
      bra lire_graphique

      bsf loop2,7                         ; 128

      decfsz loop1,F
      bra lire_graphique

      return

;******************************** "position de y et x sans page" ******************************* 
pixel_ssd1306    

;     movf posy,W                         ; hauteur de l'
écran 0 à 63 (64 pixels) 
;     bsf WREG,6
;     rcall command_ssd1306  

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

;      movf posx,W                        ;
;     swapf WREG,W                        ;
;     andlw B'
00000111'                   ; 

;     bsf WREG,4                          ;                                  

;     rcall command_ssd1306               ; envoi du poid fort
     
;     movlw B'
10000000'                   ; 1 pixel
;     rcall donner_ss1306                 ;  

      return

;******************************** "position de y et x avec page" ******************************* 
position_ssd1306
                                                   
      movf posy,W
      addlw 0xB0                          ; hauteur de l'
écran 0 à 7 pages (8 lignes) 
      rcall command_ssd1306 

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

      movf posx,W                         ;
      swapf WREG,W                        ;
      andlw B'
00000111'                   ; envoi du poid fort

      bsf WREG,4

      rcall command_ssd1306 
     
      return

;*********************************************************************************************** 
command_ssd1306
      bcf dc                              ; DC = 0  en mode commande
      bra spi                          
     
;*********************************************************************************************** 
donner_ssd1306
      bsf dc                              ; DC = 1 en mode donnée
      bra spi                             ;     

;*********************************************************************************************** 
spi     
      bcf cs

      movwf SSP1BUF    
attends
      btfss SSP1STAT,BF                   ;
      bra attends  

      bsf cs

      movf SSP1BUF,W                      ;  
      
      return

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

      movlw D'
75'
      movwf loop2

      movlw D'
21'
      movwf loop3

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

      return

;********************* "pause de 100 millisecondes pour horloge de 16 Mhz" ********************* 
_100ms
      movlw D'
119'
      movwf loop1

      movlw D'
8'
      movwf loop2

      movlw D'
3'
      movwf loop3

      decfsz loop1
      bra $-D'
2'
      decfsz loop2
      bra $-D'
6'
      decfsz loop3
      bra $-D'
10'

      return

;********************** "pause de 10 millisecondes pour horloge de 16 Mhz" *********************
_10ms
      movlw D'
241'
      movwf loop1

      movlw D'
52'
      movwf loop2

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

      return

;****************************** "pour écrit dans l'
eeprom" ************************************* 
eeprom_ecriture
      movf adresse_hi,W                   ; adresse du poid fort
      movwf EEADRH                        ;

      movf adresse_low,W                  ; adresse du poid faible
      movwf EEADR                         ; 

      movf donner,W                       ;
      movwf EEDATA                        ; écriture de la donnée
 
      bcf EECON1,EEPGD                    ; préparation à l'autorisation 
      bcf EECON1,CFGS                     ; access eeprom

      bsf EECON1,WREN                     ; Enable writes   
 
      bcf INTCON,GIE                      ; couper les interruptions

      btfsc INTCON,GIE                    ; contrôl si les interruptions sont bien coupés
      bra $-D'2'                          ; remonte à la ligne 2 jusqu'a coupures des interruptions 

      movlw H'55'                         ; séquence spécifique (c'est comme ça, il faut le savoir)
      movwf EECON2                        ; séquence spécifique
      movlw H'AA'                         ; séquence spécifique
      movwf EECON2                        ; séquence spécifique

      bsf EECON1,WR                       ; lance une opération d'écriture

      btfsc EECON1,WR                     ; on attend que l'operation d'ecriture soit finie (de l'ordre de la ms
      bra $-D'2'                          ; remonte à la ligne 2 jusqu'a fin d'écriture

      bcf EECON1, WREN                    ; interdiction de l'écriture

      return

;******************************** "
pour lire dans l'eeprom" ************************************ 
eeprom_lecture
      movf adresse_hi,W                   ; adresse du poid fort
      movwf EEADRH                        ;

      movf adresse_low,W                  ; adresse du poid faible
      movwf EEADR                         ; 

      bcf EECON1,EEPGD                    ; préparation à la lecture
      bcf EECON1,CFGS                     ; access EEPROM
      bsf EECON1,RD                       ; lecture de l'
EEPROM

      movf EEDATA
,W                       ; la valeur lue dans l'éeprom est placée dans W 
      movwf donner

      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, 512 octets maximum" *************************
;*********************************************************************************************** 
    ORG H'8E00' 
                    
message
       db "
‚cran SPI OLED 128x64"         ; ‚  0  
       db "
     Temps-x 2020    "         ; ‚  22
       db "
 est sur le forum de "         ; ‚  44
       db "
      Fantas-Pic     "         ; ‚  66 
       db "
  est vous souhaite  "         ; ‚  88
       db "
une bonne ann‚e 2020 "         ; ‚  110
       db "
 Vol de l'avion A330 "         ; ‚  132 
       db " Mettez vos ceintures"         ; ‚  154
       db "  Avion A330 arr‚t‚  "         ; ‚  176

;***********************************************************************************************
;***************************** "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,0x00,0x00
      db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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°1" **************************************
;*********************************************************************************************** 
    ORG H'EEEE'

graphique1       
      db 0x00,0x01,0xFF,0x93,0x93,0x93,0x93,0xEE,0x00,0x70,0xF8,0x8C,0x04,0x8C,0x9C,0xF8
      db 0x70,0x84,0xFC,0x9C,0x0C,0x8C,0xFC,0xF8,0x00,0x84,0xFC,0x9C,0x0C,0x8C,0xFC,0x80
      db 0x80,0x70,0xF8,0xAC,0x24,0xAC,0xBC,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0xE0,0xEC,0x34,0x34,0xBC,0xF8,0x00,0x00,0x84,0xFC,0x9C,0x0C,0x8C,0xFC,0x80
      db 0x00,0x84,0xFC,0x8C,0x0C,0x8C,0xF8,0x80,0x00,0x70,0xF8,0xAE,0x27,0xAD,0xB8,0xB0
      db 0x00,0x70,0xF8,0xAC,0x24,0xAC,0xB8,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x86,0xC7,0xE1,0xB1,0x9B,0x8E,0x00,0x00,0x3C,0xFE,0x83,0x81,0x83,0xFE,0x3C
      db 0x00,0x86,0xC7,0xE1,0xB1,0x9B,0x8E,0x00,0x00,0x3C,0xFE,0x83,0x81,0x83,0xFE,0x3C
      db 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x00
      db 0x00,0x01,0x01,0x01,0x00,0x01,0x01,0x01,0x00,0x39,0x05,0x75,0x08,0x35,0x75,0xD1
      db 0xD1,0x90,0x90,0x91,0x11,0x11,0x11,0x30,0x20,0x60,0x60,0x40,0xC0,0x80,0x00,0x00
      db 0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x01,0x01,0x01,0x00,0x01,0x01,0x01
      db 0x00,0x01,0x01,0x01,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x00
      db 0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00
      db 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x01,0x01,0x01,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 0xFF,0x2C,0xE9,0x01,0x01,0x01,0x03,0x83,0x82,0xF6,0x74,0x1C,0x0C,0x05,0x27,0x26
      db 0x30,0x1F,0x60,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0
      db 0xE0,0xE0,0xF0,0xF0,0xF0,0xF0,0xF0,0xE0,0xE0,0xE0,0xC0,0xC0,0xC0,0xC0,0x80,0x80
      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,0xC0,0xC0,0xE0,0xE0
      db 0xE7,0xFC,0xF8,0xF0,0xF0,0xF0,0xF8,0x8C,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00
      db 0x00,0x00,0x80,0xE0,0xF8,0xC8,0xCC,0x4C,0x46,0x46,0x46,0x47,0x67,0x67,0x67,0xEF
      db 0x8F,0xCF,0x5F,0xDF,0xBF,0x3F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
      db 0xFF,0xFC,0xF8,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,0x7F,0xFF,0xFF,0xFF
      db 0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3F,0x01,0x87,0xFC,0x00,0x00,0x00,0x80,0x60,0x30
      db 0x18,0x07,0x07,0x63,0x61,0xF9,0x9C,0xCC,0x66,0xF3,0xF3,0xF3,0xFE,0xBE,0xE0,0x38
      db 0xCC,0xCD,0xED,0xCF,0x1B,0xFC,0x0C,0x18,0x20,0xE1,0x87,0x0F,0xFF,0xFF,0xFF,0xFF
      db 0xFF,0xFF,0x7F,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,0x01,0x03,0x07
      db 0x07,0x03,0x03,0x01,0x01,0x03,0x03,0x01,0x01,0x00,0x00,0x00,0xFF,0x01,0x00,0x08
      db 0x08,0x08,0x18,0x78,0xE8,0xC0,0xCF,0x85,0x85,0x07,0x03,0x01,0x00,0x07,0x1C,0x10
      db 0x7F,0x0B,0x6F,0xC7,0x8C,0x0F,0x88,0x98,0x00,0x80,0xC1,0x5F,0x7F,0xFF,0xFF,0xFF
      db 0xFF,0x21,0x60,0xC0,0x80,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,0x1F,0x70,0xC0,0x80
      db 0x00,0x00,0x00,0x00,0x03,0x1F,0x7F,0x7E,0xFD,0xFD,0xF9,0xF9,0xF9,0x79,0x7D,0x3D
      db 0x1F,0x0F,0x07,0x01,0x01,0x01,0x01,0x01,0x1E,0x7F,0xC1,0x80,0x00,0x00,0x01,0x01
      db 0x00,0x80,0x80,0xC0,0x73,0x1E,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,0x01
      db 0x03,0x06,0x08,0x18,0x30,0x30,0x20,0x60,0x40,0x40,0x40,0xC0,0x80,0x80,0x80,0x80
      db 0xC0,0x40,0x40,0x40,0x40,0x20,0x30,0x10,0x18,0x08,0x06,0x03,0x01,0x01,0x01,0x01
      db 0x01,0x01,0x01,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

;*********************************************************************************************** 
;**************************"
affichage d'un graphique N°2" **************************************
;*********************************************************************************************** 
    ORG H'
F2EE'

graphique2      
      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

************************************************************************************************
************************************************************************************************

      0xAE                              ; mettre hors fonction l'
écran

      0xD5                              
; display clock div & param
      0x80                     
      0xA8                              
; set multiplex & param
      0x3F                        
      0xD3                              
; set display offset & param 
      0x00
      0x40                              
; set start line

      0x8D                              
; active l'élévation de tension pour l'écran
      0x14                              
; de 7 volts minimum à 15 vols maximum
      
      0x20                              
; sélection de la façon du balayage de l'écran méthode 1, méthode 2, méthode 3
      0x00                              ; j'
ai choisi la méthode 2
      
      0xA1                              
; segremap (A0/A1, flip horizontally)
      0xC8                              ; comscandec (C0/C8, flip vertically)
      0xDA                              ; set compins () . . . . .  (default)
      0x12                      
      
      0x81                              
; contrast minimum 0x00 à un maximum de 0xFF
      0x7F                              
; réglage au milieu de sa valeur
      
      0xD9                              
; set precharge
      0xF1
      0xDB                              
; set vcom detect
      0x40
      0xA4                              
; display allon_resume . .  (default)
      0xA6                              ; normal display . . . . .  (default)
      
      0xAF                              
; mettre l'écran en fonction
      
      0x21                              ; Dit à l’écran qu'
on lui envoie les limites de colonnes
      0x00                              
; Valeur 1ere colonne
      0x7F                              
; Valeur dernière colonne
      0x22                              
; Dit à l’écran qu'on lui envoie les limites des pages
      0x00                              ; Valeur de la première page
      0x07                              ; Valeur de la dernière page          
      0x2E                              ; désactive le défilement de l'
écran

************************************************************************************************
************************************************************************************************


Fichier code : Ssd1306(Code).zip

Fichier à mettre dans le Pic : Ssd1306(Hex).zip


Premier test, avec défilement (Scroll en anglais)

https://youtu.be/z4NN2GZ04Xg

Dans l'exemple de cette vidéo, je traite un seule sens de défilement, mais il y en a plein d'autre que je vais vous citer.

Mode Horizontal
Gauche vers la droite
Droite vers la gauche

Mode vertical
Bas vers le haut,
Haut vers le bas

Mode diagonal
Bas vers le haut en diagonal
Haut vers le bas en diagonal

J'arrive à afficher du texte et du graphique, mais j'ai encore beaucoup de chose à comprendre, vu la langue pratiqué par la datasheet, ça m'aide pas beaucoup :furieux:

Pour un code en version I²C, sa reste similaire pour la configuration de l'écran, je vais vous mettre le code pour une version I²C, ou peut être dans le même code, :roll: hum... je vais voir si cela est possible.

Oscilloscope en cours de réalisation

https://www.youtube.com/watch?v=NKMaj2xxP-4

==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Temps-x le mer. 5 févr. 2020 00:21, modifié 42 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Écran OLED 0.96 128x64
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 729
Âge : 34
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#2 Message par venom » mar. 31 déc. 2019 17:14

Bonjour,

:bravo: Belle avancer pour Temps-X. Même en période de fête ça boss dur. :langue:
Vivement la suite.






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

Écran OLED 0.96 128x64
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1484
Enregistré en : juillet 2016
Localisation : Terre

#3 Message par Temps-x » mar. 31 déc. 2019 18:42

Bonsoir venom, et tou le forum,

venom a écrit :Source du message Même en période de fête ça boss dur. :langue:


Pour moi..... la programmation et l'électronique son une passion, c'est un hobby, je ne considère pas ça comme un travaille. :langue:

Je n'arrive pas à comprendre cela

Demande.jpg


Tout en anglais :furieux: ....si il y a quelqu'un pour me l'expliquer il serait le bienvenue

La suite arrive......

==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Écran OLED 0.96 128x64
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1281
Âge : 61
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#4 Message par Gérard » jeu. 2 janv. 2020 14:06

Bonjour à tous,

Pour comprendre, je me sers souvent de ça.
Le 18 / 04 / 2019 je suis devenu papy de jumeaux, une fille et un garçon. Quel bonheur.

Écran OLED 0.96 128x64
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1484
Enregistré en : juillet 2016
Localisation : Terre

#5 Message par Temps-x » jeu. 2 janv. 2020 17:26

Bonsoir Gérard, et tout le forum,

Merci pour ton aide, mais Google traduction, et bien d'autre, je connais, l'anglais technique c'est très dur à comprendre même quand c'est traduit ça reste incompréhensible.

Si je reprends les termes du datasheet traduire par google sa donne ça :

Définir la colonne inférieure adresse de début pour adressage de page mode
1) Définissez le quartet inférieur de l'adresse de début de colonne s'enregistrer pour le mode d'adressage de page en utilisant X [3: 0]
comme bits de données.
Le registre de ligne d'affichage initial est réinitialisé à 0000b après RÉINITIALISATION.

Définir une colonne supérieure adresse de début pour adressage de page mode
2) Définissez le quartet supérieur de l'adresse de début de colonne s'enregistrer pour le mode d'adressage de page en utilisant X [3: 0]
comme bits de données.
Le registre de ligne d'affichage initial est réinitialisé à 0000b après RÉINITIALISATION.

:roll: c'est quoi la colonne inférieure et la colonne supérieure ..... j'ai ma petite idée dessus, car j'ai fait des essais, mais je voudrais une petite
explication.

Vraiment une horreur de faire de la programmation quand on comprends pas le langage anglo-saxon :mur:

A+
Modifié en dernier par Temps-x le jeu. 2 janv. 2020 22:21, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Écran OLED 0.96 128x64
satinas
Passioné
Passioné
Messages : 449
Enregistré en : novembre 2015

#6 Message par satinas » jeu. 2 janv. 2020 20:35

Bonjour et bonne année à tous

Je n'arrive pas à comprendre cela
Tout en anglais :furieux: ....si il y a quelqu'un pour me l'expliquer il serait le bienvenue


Temps-x, ce que je comprends

En mode "Page addressing Mode" on pilote le lcd par pages.
Une page fait 8 pixels de haut sur toute la largeur du lcd, 8 pages pour un 64x128.
La page 0 contient les 8 lignes de pixels du haut.
Ensuite il y a des colonnes de pixels 0 à 127, pour un 64x128.

Pour écrire on spécifie un numéro de page, puis la première colonne à écrire.

Pous définir la page (0 à 7), on envoie :
- la commande 0b10110ppp

Pour définir la première colonne (0 à 127) on envoie :
- la commnande 0b0000LLLL (lower nibble -> 4 bits de poids faible, nibble = quartet)
- la commnande 0b0001hhhh (higher nibble -> 4 bits de poids fort)

Ensuite on envoie les datas, des segments verticaux de 8 pixels.

Set the lower nibble of the column start address register for Page Addressing Mode using X[3:0] as data bits.
peut se traduire par
définir le quartet bas de l'index de la colonne de départ pour le mode d'adressage par page, le quartet est dans X[3:0]

Écran OLED 0.96 128x64
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1484
Enregistré en : juillet 2016
Localisation : Terre

#7 Message par Temps-x » jeu. 2 janv. 2020 22:16

Bonsoir satinas, et tout le forum,

Merci ! pour ta réponse, heureusement que tu es là, je t'apprécie énormément. de plus super bien expliqué.
Je vais tester ta théorie, mais je crois que tu as raison sur tous ce que tu as dit.

Je garde ton explication précieusement, car je vais en avoir besoin

:roll: Certaine personne connaissait la réponse, mais ils ne sont pas intervenus, ce ne sais pas le pourquoi ?

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

Écran OLED 0.96 128x64
satinas
Passioné
Passioné
Messages : 449
Enregistré en : novembre 2015

#8 Message par satinas » jeu. 2 janv. 2020 22:21

Pourtant tu es déjà arrivé à le faire fonctionner, et même en graphique vu la vidéo, comment as-tu fait ? :-)
J'avais travaillé sur cet afficheur, mais déjà tout oublié, le fait de relire et c'est revenu, cela doit être le cas pour d'autres.

Écran OLED 0.96 128x64
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1484
Enregistré en : juillet 2016
Localisation : Terre

#9 Message par Temps-x » jeu. 2 janv. 2020 22:30

Re

Ce qui m'a aidé, c'est le tutoriel de Jérémy, après j'ai regardé la datasheel, et ça m'a fait comprendre une grande partie.

Et comme j'avais déjà touché aux écrans Nokia, je me suis dit que c'est la même chose pour gestion ASCII

Après je suis allé voir les source en C+, puis j'ai fait un tas d'essai, des heures, et des heures, pour arrivé à ce résultat.

Rien que pour le mot Scroll il m'a fallut chercher ce que ça voulait dire, fin de compte j'ai trouvé oops défilement de l'écran

Voilà, et j'ai encore à voir pas mal de chose pour le projet que je veux faire.

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

Écran OLED 0.96 128x64
satinas
Passioné
Passioné
Messages : 449
Enregistré en : novembre 2015

#10 Message par satinas » jeu. 2 janv. 2020 22:48

Le problème de cet afficheur et du Nokia, c'est cette histoire de pages. On est obligé d'écrire 8 pixels à la fois.
Sur les autres lcds ont peut écrire 1 seul pixel. Cela simplifie beaucoup le graphique et l'écriture d'un texte n'importe où sur l'écran.


Retourner vers « Langage ASM »

Qui est en ligne

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