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 ---
- 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 ---
Modérateur : mazertoc
test affichage a MAX7219
- ducran lapoigne
Débutant- Messages : 96
- Enregistré en : septembre 2015
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
j' ai pensé que le code pourrait intéresser quelques membres du forum
ci dessous,test avec un 16F84
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
j' ai pensé que le code pourrait intéresser quelques membres du forum
ci dessous,test avec un 16F84
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-0
;-------------------------------------------------------------------------
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 +7
; 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+1
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
test affichage a MAX7219
Bonjour ducran lapoigne, F6FCO, et tout le forum,
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
A+
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
A+
test affichage a MAX7219
-
folkeu08
Débutant- Messages : 45
- Âge : 57
- Enregistré en : novembre 2017
- Localisation : Ardennes (08)
- Contact :
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
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
Débutant- Messages : 96
- Enregistré en : septembre 2015
en principe ceci devrait fonctionner
voir page 8 notice MAX72219
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
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......
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 en ASM il faut comprendre ce que tu fais, sinon tu vas dans le
A+
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 en ASM il faut comprendre ce que tu fais, sinon tu vas dans le
A+
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 43 invités