AFFICHEUR LEDS avec DRIVER MAX7219
PICAXE 08M2
APPLICATION THERMOMÈTRE base DS18B20
Pour l'affichage de données, il y a le choix entre l'afficheur LCD et l'afficheur LED.
Ces deux types d'afficheurs sont présents dans les pages de ce site. Les LCD 1602 à 2004 sont souvent préférés pour leur facilité d'utilisation (surtout en version série) et le nombre de caractères disponibles. Pour les afficheurs LED, le câblage des afficheurs et l'utilisation du multiplexage sont pénalisants, pour un résultat parfois médiocre.
Un forumeur m'a fait découvrir sur eBay des afficheurs composés de 2, 4, 5 ou 8 beaux digits de 20 mm de haut, pilotés par un MAX7219, et tout change:
Les avantages sont nombreux:
- liaison simplifiée, 5 fils en tout, alimentation comprise
- Déjà monté sur plaquette avec le driver (mais peuvent être achetés séparément)
- Affichage de chaque digit par décodage (table de caractères intégrée: on tape 1, il écrit 1) ou segment par segment pour fabriquer des caractères non présents dans la table, ex "°" ou "C"
- Réglage de la luminosité
- fonction test
- Très économique (4 à 5 euros tout compris)
- Pilotable par tout µC (un picaxe 08M2 suffit pour un thermomètre).
- Pour l'afficheur matricel 8x8 lisez ensuite cette page
Application de test: Un thermomètre simple.
Il faut:
- Un DS18B20
- Un picaxe 08M2
- Un afficheur 5 digits piloté par MAX 7219
- Et ... une résistance, enfin trois si on veut pouvoir programmer sur site.
Les datasheets:
Il y a 6 broches sur l'afficheur:
GRN = 0 Volt
VCC = 5 Volts
SI = DIN (Data In , entrée donnée)
SO = Serial Out (non utilisé)
CS* = DATA (validation du registre. En fait, c'est CS barre)
SCL = CLK (impulsion horloge, valide le bit)
Contrairement aux picaxes de la série X1 ou X2, la série M2 ne dispose pas de la commande SPI (shiftout) gérant ces données en une seule ligne, pas grave, la doc picaxe nous explique comment s'en passer.
La datasheet du MAX7219:
Ce qu'il faut savoir pour commander ces afficheurs (aide aux purs francophones).
Rappel pour les débutants: 15, ou $F, ou %11111 sont trois façons d'écrire la même chose, en décimal, ou en hexadécimal, ou en binaire.
Le format de registre:

Il est composé de 16 bits. L'octet de poids faible (D0-D7) contient des données pures.
L'octet de poids fort "ADRESSE" contient soit le n° du digit concerné (de 1 à 8) soit une commande.
Détail de l'octet de poids fort "ADDRESS"
Les bits D12- D15 ne sont pas utilisés. L'adresse 0 ($0) n'a pas de fonction. Les adresses= 1 à 8 ($1 à $8) désigne le digit concerné par les "données (D0-D7). ATTENTION: Le digit0 a l'adresse n°1 dans cette table ! Source de confusion. Adresse= 9 ($9): mode de décodage pour chaque digit. Adresse= 10 ($A): réglage de l'intensité d'éclairage des digits (16 niveaux dans "données"); Adresse= 11 ($B): nombre de digits (1 à 8 dans "données") Adresse= 12 ($C): activation du digit (en veille si"donnée" =0 ; actif si "donnée"= 1, la valeur par défaut est 0 !) Adresse = 15 ($F): fonction test, tous les segments des digits et les points décimaux allumés, éclairage maximum. |  |
Détail des données associées suivant les cas:
Adressse 12 (ou $C)
Table des données pour Shutdown, activation, $12 |  |
Adresse 9 (ou $9)
Table des données du mode décodage ($9) D0 correspond le digit 0 Ex : si D0=1, le digit 0 sera décodé suivant la table décodage code B si D0=0, le digit 0 sera décrit segment par segment |  |
Avec adresse 9 et donnée 1 : décodage par table Code B
Voici la partie intéressante de la table 5 Code B Font. Rappel: le bit est à 1 dans la commande adressée $9. Il y a 16 caractères enregistrés dans cette table. Les 10 premiers correspondent aux chiffres de 0 à 9 (on envoie un 1 et le digit écrit 1, c'est simple) Ensuite: 10 (ou $A) écrit - 11 (ou $B) écrit E 12 (ou $C) écrit H 13 (ou $D) écrit L 14 (ou $E) écrit P 15 (ou $F) n'écrit rien,"blank"(càd noir) Les caractères non décrits dans cette table doivent être dessinés segment par segment. Pour ajouter le point décimal, il faut mettre D7 à 1, c'est à dire ajouter 128 (ou $80) au nombre "n" envoyé, en écrivant "n |$80" (| = OU logique) |  |
Avec adresse 9 et donnée 0 : description par segments
La table 6 donne la description par segments. Rappel: Le bit est à 0 dans la commande adressée $9 On selectionne dans la partie "données" les segments que l'on veut allumer Ex: Pour écrire un C, il faut allumer les segments A,D,E,F en envoyant: % 01001110 Pour allumer aussi le point décimal, il faut ajouter D7 et envoyer: % 11001110 |  |
Photo:
La sonde du thermomètre en arrière plan est juste à côté du DS18B20
Les chiffres sont issus de la table de caractères (code B) intégrée.
Les deux derniers caractères sont définis par allumage des segments.
Le code:
On y retrouve presque tout.
;Afficheur driver MAX7219
; Programme d'essai
; MM 15/10/13
;Configuration câblage:
' +V 1 v 8 0V
' 2 7 C.0 vers DIN (DATA IN) du 7219
'DS18B20 3 6 C.1 vers LOAD (SC*) du 7219
'TEST/LUM 4 5 C.2 vers CLK du 7219
;Format des registres MAX 7219 sur 16 bits:
;|------------------------------w13------------------------------| |
;|-----------b27-----------------|------------b26 ---------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
#picaxe 08M2
setfreq m16
symbol DIN = C.0 ;Entrée Data 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 TEST = pinC.3
symbol LEN = 1 ;durée impulsion 1ms
symbol temp = b1 ;lecture température
symbol cpt = b2 ;compteur
; b3 unité
; b4 dizaine
; b5 centaine
symbol lum =b6
symbol regis =w13 ;=(b27,b26) chaque bit sera envoyé dans le registre
low DIN
low LOAD
low CLK
pullup %1000 ;activation résistance pullup sur C.3
;******** initialisation 7219 *******
b27=$09 'mode décodage
b26=%11111100 'code B sauf digit 0 et 1 (Bref, les deux derniers)
gosub shiftt
b27=$0b 'limite scanner = Nbre de digits
b26=$04 '$04=5 digits ,$03=4 digits,, etc...
gosub shiftt
b27=$0c 'shutdown mode
b26=$01 '=normal (afficheur actif)
gosub shiftt
b27=$0a 'luminosité
b26=$04 '=croissante de 0 à 15, ici c'est 4
gosub shiftt
;***** Affichage des 2 derniers digits "°C"
; DATA REG D7 D6 D5 D4 D3 D2 D1 D0
; SEG DP A B C D E F G
;
b27=1
b26=%01001110 ;C = seg A,D,E,F on= % 01001110
gosub shiftt
;
b27=2
b26=%001100011 ;°= seg A,B,F,G on = %01100011
gosub shiftt
;****** Boucle de lecture *****************
Do
' b27=position du digit (1 to 8)
' b26=valeur à afficher
' gosub shiftt pour remplir le registre du max7219 bit par bit
' Pour afficher un point décimal: b26=value or $80
if test = 0 then gosub tst ;poussoir test et luminosité
readtemp C.4,temp ;lecture température
;****** simulation temp négative -4°C au début pour démo ********
if time<1 then ;c'est juste pour voir
temp=132 ;le signe - s'allumer une fois
endif
;*************************************************
if temp> 128 then ;temp négative
temp=temp-128 ; valeur absolue
bintoascii temp, b5,b4,b3 ;décomposition en digit
b5=$0a ;signe - (codeB) devant
else ;sinon
bintoascii temp, b5,b4,b3 ;décomposition en digit
b5=b5-48 ;retour numérique
endif
b27=3 ;digit 3
b26=b3-48 ;ascii -> numérique
gosub shiftt ;affichage
b27=4
b26=b4-48
gosub shiftt ;affichage
b27=5
b26=b5 ;déjà traité
gosub shiftt ;affichage
loop
;******** Sous programme affichage *************************
;Format du registre sur 16 bits:
;|------------------------------w13------------------------------|
;|-----------b27-----------------|------------b26 ---------------|
;|-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 |
;La broche DIN va prendre successivementla valeur de chaque bit de w13, scanné de gauche à droire
shiftt:
for cpt=1 to 16 ;test des 16 bits de w13
w12=w13 & $8000 ;w13 = b27,b26 & %1000 0000 0000 0000: on ne garde que le 1er bit à gauche de w12
low DIN ; broche DIN à 0 à priori
if w12=0 then saut ;w12 contient la valeur (0 ou 1) à transmettre
high DIN ;;on ne passe ici que si w12 <> 0, alors DIN =1 (évidemment)
saut: pulsout CLK,LEN ; envoi 1 pulse horloge pour valider DIN
w13=w13*2 ; on décale w13 vers la gauche pour examiner le bit suivant
next cpt
pulsout LOAD,LEN ;chargement du registre terminé, un pulse sur load valide le registre (commande ou affichage)
return
;******* fonction test, tous segments ON et réglage lumière ***********
tst:
;****** test segments (rapide) ****************
b27=$0f 'display test
b26=$01 '=tous les segments de tous les digits allumés
gosub shiftt
pause 1000
b27=$0f 'display test
b26=$00 '=normal
gosub shiftt
;******* suivi d'un réglage de luminosité *************
do while test=0
inc lum
if lum>15 then
lum=0
endif
b27=$0a 'luminosité
b26=lum '=croissante de 0 à 15
gosub shiftt
pause 1000
if lum=0 or lum=15 then
pause 4000
endif
loop
return