Si c'est seulement pour afficher des chiffres, il y a ça aussi (moins cher...) :Bonjour,
je viens vers vous pour un renseignement : afin d'adapter au mieux un montage j'aimerais pouvoir écrire une valeur sur 4 afficheurs à segments.
Comment vous y prendriez-vous ?
[FONT=Courier New]
;Afficheur driver MAX7219
;Configuration câblage:
' +V 1 v 8 0V
' 2 7 C.0 to 7219 DIN = DATA IN
' 3 6 C.1 to 7219 LOAD
' 4 5 C.2 to 7219 CLK
;Format des données sur 16 bits:
;|------------------------------w0-------------------------------| |
;|-----------b1------------------|------------b0-----------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
#picaxe 08M2
symbol DIN = C.0 ;Entrée Dta In de l'afficheur
symbol LOAD = C.1 ;Entrée Load de l'afficheur
symbol CLK = C.2 ;Entrée CLK de l'afficheur
symbol LEN = 1 ;durée impulsion 1ms
symbol cpt = b3
low DIN
low LOAD
low CLK
' initialisation 7219
b1=$09 'decode mode
b0=$ff '=yes, all digits=BCD
gosub shiftt
b1=$0a 'intensity
b0=$0f '=max
gosub shiftt
b1=$0b 'limite scanner
b0=$03 '=4 digits, $00=1 digit , $01=2 digits, etc...
gosub shiftt
b1=$0c 'shutdown mode
b0=$01 '=normal
gosub shiftt
b1=$0f 'display test
b0=$01 '=all on
gosub shiftt
b1=$0f 'display test
b0=$00 '=normal
gosub shiftt
b1=$0a 'intensity
b0=$05 '=mid-low, $00=min on, $0f=max on
gosub shiftt
; Boucle de test
Do
' b1=position du digit (1 to 8)
' b0=value à afficher
' gosub shiftt
' Pour afficher un point décimal:
' b0=value or $80
readadc C.4,b5
bintoascii b5,b6,b7,b8
b0=0
b1=b8-48 ;faudrait voir
gosub shiftt
b0=1
b1=b7-48
gosub shiftt
b0=2
b1=b6-48
gosub shiftt
loop
;******** Sous programme affichage *************************
;Format des données sur 16 bits:
; |------------------------------w0-------------------------------| |
; |---------------b1--------------|--------------b0---------------|
; |-X-|-X-|-X-|-X-|----ADRESSE----|----------DONNEES--------------|
; |D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
;Ex: chiffre 6 dans digit 2(qui est numéroté 3..)
; |-X-|-X-|-X-|-X-| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |[/FONT]
shiftt:
for cpt=1 to 16 ;test des 16 bits de w0
w6=w0 & $8000 ;w0 = b1,b0 & %1000 0000 0000 0000: on garde le 1er bit à gauche de w0
if w6=0 then ;w6 est la valeur à transmettre
low DIN ;;si w6 =0 alors on modifie: DIN =0
else ;sinon
high DIN ;DIN=1
endif
pulsout CLK,LEN ; envoi 1 pulse horloge pour valider DIN
w0=w0*2 ; on décale w0 vers la gauche pour examiner le bit suivant
next cpt
pulsout LOAD,LEN ;chargement du registre terminé, un pulse sur load
return
[/FONT]
[FONT=Courier New]
;Afficheur driver MAX7219
;Configuration câblage:
' +V 1 v 8 0V
' 2 7 C.0 to 7219 DIN = DATA IN
' 3 6 C.1 to 7219 LOAD
' 4 5 C.2 to 7219 CLK
;Format des données sur 16 bits:
;|------------------------------w0-------------------------------| |
;|-----------b1------------------|------------b0-----------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
#picaxe 08M2
symbol DIN = C.0 ;Entrée Dta In de l'afficheur
symbol LOAD = C.1 ;Entrée Load de l'afficheur
symbol CLK = C.2 ;Entrée CLK de l'afficheur
symbol LEN = 1 ;durée impulsion 1ms
symbol cpt = b3
low DIN
low LOAD
low CLK
' initialisation 7219
b1=$09 'decode mode
b0=$ff '=yes, all digits=BCD
gosub shiftt
b1=$0a 'intensity
b0=$0f '=max
gosub shiftt
b1=$0b 'limite scanner
b0=$03 '=4 digits, $00=1 digit , $01=2 digits, etc...
gosub shiftt
b1=$0c 'shutdown mode
b0=$01 '=normal
gosub shiftt
b1=$0f 'display test
b0=$01 '=all on
gosub shiftt
b1=$0f 'display test
b0=$00 '=normal
gosub shiftt
b1=$0a 'intensity
b0=$05 '=mid-low, $00=min on, $0f=max on
gosub shiftt
; Boucle de test
Do
' b1=position du digit (1 to 8)
' b0=value à afficher
' gosub shiftt
' Pour afficher un point décimal:
' b0=value or $80
readadc C.4,b5
bintoascii b5,b6,b7,b8
b0=0
b1=b8-48
gosub shiftt
b0=1
b1=b7-48
gosub shiftt
b0=2
b1=b6-48
gosub shiftt
loop
;******** Sous programme affichage *************************
;Format des données sur 16 bits:
; |------------------------------w0-------------------------------| |
; |---------------b1--------------|--------------b0---------------|
; |-X-|-X-|-X-|-X-|----ADRESSE----|----------DONNEES--------------|
; |D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
;Ex: chiffre 6 dans digit 2(qui est numéroté 3..)
; |-X-|-X-|-X-|-X-| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
shiftt:
for cpt=1 to 16 ;test des 16 bits de w0
w6=w0 & $8000 ;w0 = b1,b0 & %1000 0000 0000 0000: on garde le 1er bit à gauche de w0
low DIN ; sortie DIN à 0 à priori
if w6=0 then saut ;w6 est la valeur à transmettre
high DIN ;si w6 <> 0, alors DIN =1
saut: pulsout CLK,LEN ; envoi 1 pulse horloge pour valider DIN
w0=w0*2 ; on décale w0 vers la gauche pour examiner le bit suivant
next cpt
pulsout LOAD,LEN ;chargement du registre terminé, un pulse sur load
return
[/FONT]
Bonjour,IL semble que la commande SPIOUT ne soit pas disponible sur la série M2 (la doc mentirait-elle?).
;Afficheur driver MAX7219
; Programme d'essai
; MM 14/10/13
;Configuration câblage:
'+V 1 v 8 0V
' 2 7 C.0 vers DIN (DATA IN) du 7219
' 3 6 C.1 vers LOAD du 7219
' 4 5 C.2 vers CLK du 7219
;Format des données sur 16 bits:
[FONT=Courier New];|------------------------------w0-------------------------------|
;|-----------b1------------------|------------b0-----------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|[/FONT]
#picaxe 08M2
setfreq m16
symbol DIN = C.0 ;Entrée Dta In de l'afficheur
symbol LOAD = C.1 ;Entrée Load de l'afficheur
symbol CLK = C.2 ;Entrée CLK de l'afficheur
symbol LEN = 1 ;durée impulsion 1ms
symbol cpt = b3
low DIN
low LOAD
low CLK
;******** initialisation 7219 *******
b1=$09 'decode mode
b0=$ff '=yes, all digits=BCD
gosub shiftt
b1=$0a 'intensity
b0=$0f '=max
gosub shiftt
b1=$0b 'limite scanner
b0=$04 '$04=5 digits ,$03=4 digits, $00=1 digit , $01=2 digits, etc...
gosub shiftt
b1=$0c 'shutdown mode
b0=$01 '=normal
gosub shiftt
b1=$0f 'display test
b0=$01 '=all on
gosub shiftt
b1=$0f 'display test
b0=$00 '=normal
gosub shiftt
b1=$0a 'intensity
b0=$05 '=mid-low, $00=min on, $0f=max on
gosub shiftt
; Boucle de test
Do
' b1=position du digit (1 to 8)
' b0=value à afficher
' gosub shiftt
' Pour afficher un point décimal:
' b0=value or $80
readadc10 C.4,w13
w13=w13*64 ;pour afficher les 5 digits
bintoascii w13,b4,b5,b6,b7,b8
b1=1
b0=b8-48
gosub shiftt
b1=2
b0=b7-48
gosub shiftt
b1=3
b0=b6-48
b0=b0 | $80 ;ajout du point décimal
gosub shiftt
b1=4
b0=b5-48
gosub shiftt
b1=5
b0=b4-48
gosub shiftt
loop
;******** Sous programme affichage *************************
;Format des données sur 16 bits:
; [FONT=Courier New] |------------------------------w0-------------------------------|
; |---------------b1--------------|--------------b0---------------|
; |-X-|-X-|-X-|-X-|----ADRESSE----|----------DONNEES--------------|
; |D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
;Ex: chiffre 5 dans digit 2
; |-X-|-X-|-X-|-X-| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |[/FONT]
shiftt:
for cpt=1 to 16 ;test des 16 bits de w0
w6=w0 & $8000 ;w0 = b1,b0 & %1000 0000 0000 0000: on garde le 1er bit à gauche de w0
low DIN ; siortie DIN à 0 à priori
if w6=0 then saut ;w6 est la valeur à transmettre
high DIN ;;si w6 <> 0, alors DIN =1
saut: pulsout CLK,LEN ; envoi 1 pulse horloge pour valider DIN
w0=w0*2 ; on décale w0 vers la gauche pour examiner le bit suivant
next cpt
pulsout LOAD,LEN ;chargement du registre terminé, un pulse sur load
return
Voici le code d'essai corrigé: