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