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

test affichage a MAX7219
ducran lapoigne
Avatar de l’utilisateur
Débutant
Débutant
Messages : 96
Enregistré en : septembre 2015

#1 Message par ducran lapoigne » ven. 30 mars 2018 17:24

bonjour tous

vous connaissez peut être ces afficheurs vendus pour une poignée de yuans
si vous ne les trouvez pas tapez MAX7219 display dans le moteur de recherche de la bay

7219_displ.jpg


j' ai pensé que le code pourrait intéresser quelques membres du forum
ci dessous,test avec un 16F84

7219_tst.JPG


Code : Tout sélectionner

;**********************************************************************
;
;
    NOM:      max7219 / 16F84
;    Date:     25/11/2014
;     Release   30/03/2018    
;    Version:  1.1
;    Circuit: 
;    Auteur:   Ducran Lapoigne
;
;**********************************************************************
;
                                                                     
;    Fichier requis: P16F84.inc                                       
;                                                                     
;**********************************************************************
;
                                                                     
;    Notes: affiche le contenu de Digit .... Digit + 7
;     sur un afficheur chinois 8 digits à MAX7219       
;    Digit est l' afficheur le + a droite; Digit + 7 le plus a gauche       
;                                                    
;             ________________________                _______________
;            |                        |              |               |
;            |1 RA2            RA1 18 |              |               |
;            |                        |              |               |
;            |2 RA3            RAO 17 |              |               |
;            |                        |              |               |
;            |3 RA4/TOCKI     OSC1 16 |              |               |
;            |                        |              |               |
;            |4 /MCLR         OSC2 15 |              |               |
;            |                        |              |               |
;            |5 Vss            VDD 14 |              |               |
;            |                        |              |               |
;            |6 RBO/INT        RB7 13 |------------- | D_in          |
;            |                        |              |               |
;            |7 RB1            RB6 12 |------------- | Clk           |
;            |                        |              |               |
;            |8 RB2            RB5 11 |------------- | LOAD          |
;            |                        |              |               |
;            |9 RB3            RB4 10 |              |               |
;            |_______________________ |              |_______________|
;
;                PIC16F84                                 MAX7219
;
    LIST      p=16F84            ; Définition de processeur
    #include <p16F84.inc>        ; Définitions de variables

 __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC


;*********************************************************************
;                              ASSIGNATIONS                          *
;*********************************************************************

OPTIONVAL    EQU    H'
0008'    ; Valeur registre option
                        ; Résistance pull-up ON
                        ; Pas de préscaler

;*********************************************************************
;                             DEFINE                                 
;*********************************************************************

#DEFINE PAGE0 bcf STATUS,RP0
#DEFINE PAGE1 bsf STATUS,RP0
#define    CLK_Pin        PORTB, 6
#define    DATA_Pin    PORTB, 7
#define    LATCH_Pin    PORTB, 5

;*********************************************************************
;                      CONSTANTES  DU MAX 7219                            
;*********************************************************************
MAX_Digit_0            equ 0x01
MAX_Digit_1            equ 0x02
MAX_Digit_2            equ 0x03
MAX_Digit_3            equ 0x04
MAX_Digit_4            equ 0x05
MAX_Digit_5            equ 0x06
MAX_Digit_6            equ 0x07
MAX_Digit_7            equ 0x08
MAX_decode_mode        equ 0x09
MAX_Intensity        equ 0x0A
MAX_Scan_Limit        equ 0x0B
MAX_Shutdown        equ 0x0C
MAX_display_Test    equ 0x0F

;*********************************************************************
;                             MACRO                                  
;*********************************************************************



;*********************************************************************
;                   DECLARATIONS DE VARIABLES                        
;*********************************************************************

    CBLOCK 0x00C        ; début de la zone variables

    Digit        : 8        ; 8 octets pour les variables a afficher
    bit_counter    : 1        ;
    nbre_aff    : 1     ; nombre de digit a afficher
    addr_aff     : 1        ; addresse afficheur
    maxim_hi    : 1        ;
    maxim_lo    : 1        ;

    ENDC                ; Fin de la zone 
  


;*********************************************************************
;                      DEMARRAGE SUR RESET                           
;*********************************************************************

    org     0x000         ; Adresse de départ après reset
    call    initports    ; initialisation des ports du 16F84
;---------------------------------------------------------------------
;                Chargement des datas a afficher
;---------------------------------------------------------------------
    movlw    D'
0'            ; 
    movwf    Digit            ; sera affiché sur digit le + a droite
    movlw    D'
1'
    movwf    Digit +1    
    movlw    D'
2'
    movwf    Digit +2    
    movlw    D'
3'
    movwf    Digit +3    
    movlw    D'
4'
    movwf    Digit +4    
    movlw    D'
5'
    movwf    Digit +5    
    movlw    D'
6'
    movwf    Digit +6    
    movlw    D'
7'
    movwf    Digit +7        ; sera affiché sur digit le + a gauche
;---------------------------------------------------------------------    
    call    init_MAX7219    ; initialiser le max7219
    call    disp_32         ; afficher 
  
forever      
      nop                        ; une fois le boulot fait, on boucle ici ;-)
      goto forever

;*********************************************************************
;           INITIALISATION DES PORTS ET DES VARIABLES                             
;*********************************************************************
initports
    CLRF    PORTA                    ;
    CLRF    PORTB                    ;
    PAGE1                            ;page 1
    MOVLW    B'
00000001'                ;tout le port en sortie sauf b0
    MOVWF    TRISB                    ;configuration port B
    MOVLW    B'
00011111'                ;pour l' exemple
    MOVWF    TRISA                    
;configuration port A
    MOVLW    OPTIONVAL                
;B'00000000'            ;
    MOVWF    OPTION_REG                ;configuration OPTION
    PAGE0                            
;page 0
    CLRF    PORTB                    
;
    return
;*************************************************************************
;
                        initialisation du MAX7219
;**************************************************************************
init_MAX7219
    movlw   00
    movwf   PORTB

;-------------------------------------------------------------------------
;
 shutdown: registre 0x0C du max7219
; xxxxxxx0 : arret
; xxxxxxx1 : normal operation
;-------------------------------------------------------------------------
shutdown
    movlw   MAX_Shutdown
    movwf   maxim_hi
    movlw   0x01                
; turn on display
    movwf   maxim_lo
    call    disp_write
;------------------------------------------------------------------------
;
 decode mode registre 0x09 du max7219
; 00000000 (0x00) :pas de décodage bcd
; 00000001 (0x01) :décodage pour digit 0 pas décodage pour 7 à 1
; 00001111 (0x0F) :décodage pour digit 3-0 pas décodage pour 7 à 4
; 11111111 (0xFF) :décodage pour digit 7-
;-------------------------------------------------------------------------
decode_mode
    movlw   MAX_decode_mode        
; adresse registre 'Decode mode'du MAX7219
    movwf   maxim_hi
    movlw   0xFF                
; code pour decode for all digits
    movwf   maxim_lo
    call   disp_write
;-------------------------------------------------------------------------
;
 intensity registre 0x0A du max7219
; règle l'intensité 0x00 :min    0xFF :max
;-------------------------------------------------------------------------
intensity
    movlw   MAX_Intensity        ; adresse registre '
Intensity 'du MAX7219
    movwf   maxim_hi
    movlw   0x0B                ; max intensity (min 01  max 0F )
    movwf   maxim_lo
    call    disp_write
;-------------------------------------------------------------------------
; scan limit registre 0x0B du max7219
; display digit 0: 0xX0
; display digit 0-1: 0xX1
; display digit 0-1-2: 0xX2
; display digit 0-1-2-3: 0xX3
; display digit 0-1-2-3-4: 0xX4
; display digit 0-1-2-3-4-5: 0xX5
; display digit 0-1-2-3-4-5-6: 0xX6
; display digit 0-1-2-3-4-5-6-7: 0xX7
;-------------------------------------------------------------------------
scan_limit
    movlw   MAX_Scan_Limit        ; adresse registre '
scan limit 'du MAX7219
    movwf   maxim_hi
    movlw   H'
07'                ; 8 digits
    movwf   maxim_lo
    call    disp_write
;-------------------------------------------------------------------------
; disp test registre 0x0F du max7219
;-------------------------------------------------------------------------
disp_test
    movlw   MAX_display_Test    ; adresse registre '
Display test'du MAX7219
    movwf   maxim_hi
    movlw   H'
00'                ; test
    movwf   maxim_lo
    call    disp_write
    return
;*************************************************************************
;  sous routine envoi de commandes ou data vers le max7219
;  sous la forme d'
 un mot de 16 bits
;  Le MSB (bit15) est envoyé le premier                      
;**************************************************************************
disp_write:
    movlw   h'00'
    movwf   PORTB
    movlw   h
'08'                ; 
    movwf   bit_counter            
; compteur bits
    bcf     STATUS 
,C            ; clear carry
loop_hi
    rlf     maxim_hi
,f            ;
    btfss   STATUS ,C
    goto    toggle_clock_hi
    bsf     DATA_Pin
toggle_clock_hi
    bsf     CLK_Pin                
; front montant impulsion sur CLK
    bcf     CLK_Pin                
; front descendant impulsion sur CLK
    bcf     DATA_Pin            
; if set,reset it.
    decfsz  bit_counter,f
    goto    loop_hi
    movlw   h
'08'                ; counter
    movwf   bit_counter
    bcf     STATUS 
,C            ; clear carry
loop_lo
    rlf     maxim_lo
,f
    btfss   STATUS 
,C
    goto    toggle_clock_lo
    bsf     DATA_Pin
toggle_clock_lo
    bsf     CLK_Pin
    bcf     CLK_Pin
    bcf     DATA_Pin            
; if set,reset it.
    decfsz  bit_counter,f
    goto    loop_lo
toggle_load
    bsf     LATCH_Pin
    bcf     LATCH_Pin
    return                        
;
;**************************************************************************
       
; affiche le contenu de Digit sur le digit de droite, puis Digit+1 Digit+2.....
;
 jusque Digit +
; Digit +7 affiché sur le digit le + a gauche
;**************************************************************************  
disp_32
    movlw   Digit                
; addresse de "Digit"
    movwf   FSR                    ; data-pointer
    movlw   h
'08'                ; counter : number digits to display
    movwf   nbre_aff            
; to var 'nbre_aff'
    movlw   h'01'                ; adresse 1er digit
    movwf   addr_aff                
; to var 'addr_aff'
    
next_digit
    movf    addr_aff
,w            ; addr digit -> W
    movwf   maxim_hi            
;
    movf    INDF,w                ; data to display -> W
    movwf   maxim_lo            
;
    call    disp_write            ;
    incf    FSR,f                ; pointer data suivante
    incf    addr_aff
,f            ; addr digit = addr digit+
    decfsz  nbre_aff
,f            ; 
    goto    next_digit            
; fini ???
    return

    end
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

test affichage a MAX7219
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#2 Message par F6FCO » ven. 30 mars 2018 19:48

Merci Antoine, effectivement çà pourra servir.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

test affichage a MAX7219
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Enregistré en : juillet 2016
Localisation : Terre

#3 Message par Temps-x » ven. 30 mars 2018 20:24

Bonjour ducran lapoigne, F6FCO, et tout le forum,

:bravo: pour le code, super d'avoir fait ça avec un Pic16F84

Comme c'est un super boulot je mets le datasheet du Max7219 : https://drive.google.com/open?id=1_ej0V ... hWlyfvXmVg

Merci !

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

test affichage a MAX7219
folkeu08
Débutant
Débutant
Messages : 45
Âge : 57
Enregistré en : novembre 2017
Localisation : Ardennes (08)
Contact :

#4 Message par folkeu08 » lun. 17 sept. 2018 21:54

Bonjour,
J'update un vieux projet qu'un amis m'avait fait en asm avec comme gestionnaire d'affichage un MC14499.
Je suis pour le remplacer par un Max7219 grâce à votre routine. l'ASM permettait de faire afficher par incrément ou décrément une valeur de 1 à 512 codée sur 2 octets (si j'utilise le bon terme) -> la valeur était "coupée" dans 2 variables pour un 16F877.
Comment faire pour supprimer l'affichage des "0" sur la gauche du nombre (exemple "005"). Je me heurtais à ce problème. J'ai laissé tombé car je maitrise très mal l'assembleur.
Merci
François

test affichage a MAX7219
ducran lapoigne
Avatar de l’utilisateur
Débutant
Débutant
Messages : 96
Enregistré en : septembre 2015

#5 Message par ducran lapoigne » lun. 17 sept. 2018 23:22

en principe ceci devrait fonctionner

voir page 8 notice MAX72219


Code : Tout sélectionner

;---------------------------------------------------------------------
;
                Chargement des datas a afficher
;---------------------------------------------------------------------
    movlw    D'0'            ; 
    movwf    Digit            
; sera affiché sur digit le + a droite
    movlw    D
'1'
    movwf    Digit +1    
    movlw    D
'2'
    movwf    Digit +2    
    movlw    D
'3'
    movwf    Digit +3    
    movlw    D
'4'
    movwf    Digit +4    
    movlw    0xFF            
;0xFF = code pour éteindre un digit
    movwf    Digit 
+5    
    movlw    0xFF            
;0xFF = code pour éteindre un digit
    movwf    Digit 
+6    
    movlw    0xFF            
;0xFF = code pour éteindre un digit
    movwf    Digit 
+7        ; sera affiché sur digit le + a gauche
;---------------------------------------------------------------------

test affichage a MAX7219
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Enregistré en : juillet 2016
Localisation : Terre

#6 Message par Temps-x » mar. 18 sept. 2018 02:04

Bonsoir folkeu08, ducran lapoigne, et tout le forum,


Hum...... ça va pas être simple à expliqué, deux variables chez moi ça fait 16 bits, il faut la décomposer

Tu veux du tout fait, ou tu veux comprendre.

Je te donne une solution, accroche toi......

Code : Tout sélectionner



 CBLOCK H
'20'                             ; zone de la sdram en bank 1 : H'20' à H'7F' soit 96 octets              
      tmps           
:1  
      temps          
:1

      dix_millième   
:1
      millième       
:1
      centaine       
:1
      dizaine        
:1
      unité          
:1

      res8           
:1
      res16          
:1
 ENDC
 

;*********************************************************************************************** 
;*********************************************************************************************** 
;*********************************************************************************************** 
   
       call traduire
      
do
      goto do

;*********************************************************************************************** 
;*********************************************************************************************** 
;*********************************************************************************************** 
traduire
      call convertir

      movfw dix_millième
      xorlw D
'48'
      btfsc STATUS,Z
      goto 
$+D'4'

      movfw dix_millième
      movwf lettre      
      call ecrit_lcd                                        
; <==== ici écran LCD
      
      movfw millième
      xorlw D
'48'
      btfsc STATUS,Z
      goto 
$+D'4'

      movfw millième
      movwf lettre
      call ecrit_lcd 

      movfw centaine
      xorlw D
'48'
      btfsc STATUS,Z
      goto 
$+D'4'

      movfw centaine
      movwf lettre
      call ecrit_lcd 

      movfw dizaine
      xorlw D
'48'
      btfsc STATUS,Z
      goto 
$+D'4'

      movfw dizaine
      movwf lettre
      call ecrit_lcd 

      movf unité
,W
      movwf lettre
      call ecrit_lcd 
 
       return
;*********************************************************************************************** 
convertir

; "16 bits"

      clrf unité
      clrf dizaine
      clrf centaine
      clrf millième
      clrf dix_millième

      btfss res16
,7
      goto 
$+D'11'            

      movlw D
'3'                          ; 32768  
      addwf dix_millième
,F
      movlw D
'2'                          ;  2768  
      addwf millième
,F
      movlw D
'7'                          ;   768
      addwf centaine
,F                 
      movlw D
'6'                          ;    68
      addwf dizaine
,F                 
      movlw D
'8'                          ;     8
      addwf unité
,F                 


      btfss res16
,6
      goto 
$+D'11'            

      movlw D
'1'                          ; 16384  
      addwf dix_millième
,F
      movlw D
'6'                          ;  6384  
      addwf millième
,F
      movlw D
'3'                          ;   384
      addwf centaine
,F                 
      movlw D
'8'                          ;    84
      addwf dizaine
,F                 
      movlw D
'4'                          ;     4
      addwf unité
,F                 


      btfss res16
,5
      goto 
$+D'9'            

      movlw D
'8'                          ; 8192  
      addwf millième
,F
      movlw D
'1'                          ;  192
      addwf centaine
,F                 
      movlw D
'9'                          ;   92
      addwf dizaine
,F                 
      movlw D
'2'                          ;    2
      addwf unité
,F                 


      btfss res16
,4
      goto 
$+D'9'            

      movlw D
'4'                          ; 4096  
      addwf millième
,F
      movlw D
'0'                          ;  096
      addwf centaine
,F                 
      movlw D
'9'                          ;   96
      addwf dizaine
,F                 
      movlw D
'6'                          ;    6
      addwf unité
,F                 


      btfss res16
,3
      goto 
$+D'9'            

      movlw D
'2'                          ; 2048  
      addwf millième
,F
      movlw D
'0'                          ;  048
      addwf centaine
,F                 
      movlw D
'4'                          ;   48
      addwf dizaine
,F                 
      movlw D
'8'                          ;    8
      addwf unité
,F                 


      btfss res16
,2
      goto 
$+D'9'            

      movlw D
'1'                          ; 1024  
      addwf millième
,F
      movlw D
'0'                          ;  024
      addwf centaine
,F                 
      movlw D
'2'                          ;   24
      addwf dizaine
,F                 
      movlw D
'4'                          ;    4
      addwf unité
,F                 


      btfss res16
,1
      goto 
$+D'7'            

      movlw D
'5'                          ;  512
      addwf centaine
,F                 
      movlw D
'1'                          ;   12
      addwf dizaine
,F                 
      movlw D
'2'                          ;    2
      addwf unité
,F                 


      btfss res16
,0
      goto 
$+D'7'            

      movlw D
'2'                          ;  256
      addwf centaine
,F                 
      movlw D
'5'                          ;   56
      addwf dizaine
,F                 
      movlw D
'6'                          ;    6
      addwf unité
,F                 

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

; "8 bits"

      btfss res8,7
      goto 
$+D'7'            

      movlw D
'1'                          ;  128
      addwf centaine
,F                 
      movlw D
'2'                          ;   28
      addwf dizaine
,F                 
      movlw D
'8'                          ;    8
      addwf unité
,F                 


      btfss res8
,6
      goto 
$+D'5'            

      movlw D
'6'                          ;   64
      addwf dizaine
,F                 
      movlw D
'4'                          ;    4
      addwf unité
,F                 


      btfss res8
,5
      goto 
$+D'5'            

      movlw D
'3'                          ;   32
      addwf dizaine
,F                 
      movlw D
'2'                          ;    2
      addwf unité
,F                 


      btfss res8
,4
      goto 
$+D'5'            

      movlw D
'1'                          ;   16
      addwf dizaine
,F                    
      movlw D
'6'                          ;    6
      addwf unité
,F                 

      movlw B
'00001111'                   ; 8, 4, 2, 1
      andwf res8
,W    
    
      addwf unité
,F     

;********************************************************************************************** 
total_unite
      movfw unité
      movwf tmps    
      movfw dizaine
    
      call decompose  

      movwf dizaine
      movfw tmps
      movwf unité

total_dizaine
      movfw dizaine
      movwf tmps    
      movfw centaine
    
      call decompose  

      movwf centaine
      movfw tmps
      movwf dizaine

total_centaine
      movfw centaine
      movwf tmps    
      movfw millième
    
      call decompose  

      movwf millième
      movfw tmps
      movwf centaine

total_millieme
      movfw millième
      movwf tmps    
      movfw dix_millième
    
      call decompose  

      movwf dix_millième
      movfw tmps
      movwf millième 

      movlw D
'48'  

      addwf unité
,F
      addwf dizaine
,F
      addwf centaine
,F
      addwf millième
,F
      addwf dix_millième
,F   

      return

;********************* séparer les nombres des chiffres, et additionnes ************************ 
decompose      

      movwf temps

      movfw tmps
      sublw D
'10'                         ; retir 10 de W
      btfsc STATUS
,Z                      ; si le bit Z est à 1 on va à la ligne 1                                       
      goto 
$+D'4'                         ; si Z = 1 , résultat égal
      btfss STATUS
,C                      ; si le bit C est à 0 on va à la ligne 1
      goto 
$+D'2'
      goto $+D'5'                         
      movlw D
'10' 
      subwf tmps
,F   
      incf temps
,F  
      goto 
$-D'10'

      movfw temps

      return    


res8 est le nombre dans ta première variable, res16 est le nombre dans ta deuxième variable.

Et voila, l'affichage des "0" sur la gauche sont supprimés, même pas la peine d'éteindre les afficheurs.

L'exemple qui est donnée fonction sur un écran LCD, c'est la même chose pour les digits
Il faudra surement modifier un paramètre, car pour un digit, l'ajout du nombre "48" n'est pas une obligation.

il y a plus court, mais, je préfère quelque chose que je comprenne, qu'une chose qui mais apporté sur un plateau, et que je ne comprenne pas.

c'est pas du MicroC :langue: en ASM il faut comprendre ce que tu fais, sinon tu vas dans le :mur:

==> 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 3 invités