Conversion DEC en HEXA ?

Patrice68

New Member
Bonjour à tous,

J'ai besoin d'afficher sur un LCD le n° de série d'un 1-wire (ici un Ds18b20) en hexa.
J'arrive à lire l'adresse mais elle est affichée en décimal, comment l'afficher en hexa ?
Voici mon code :
READOWSN Ds18b20 'note b6 - b13 est utilisé par la commande READOWSN
serout Sortie_LCD,baud,(254,192,"Famille : ",#b6)
serout Sortie_LCD,baud,(254,148,"N",223," : ",#b7,#b8,#b9,#b10,#b11,#b12)
serout Sortie_LCD,baud,(254,212,"Controle : ",#b13)

Merci à tous de votre contribution
 

BESQUEUT

Senior Member
D'après Hippy :
b0 = $AB
b1 = b0 / $10 + "0"
If b1 > "9" Then : b1 = b1 + 7 : End If
b2 = b0 & $0F + "0"
If b2 > "9" Then : b2 = b2 + 7 : End If
SerTxd( "b0 = $",b1,b2, " = ",#b0, CR, LF )
 

PieM

Senior Member
D'après Hippy :
b0 = $AB
b1 = b0 / $10 + "0"
If b1 > "9" Then : b1 = b1 + 7 : End If
b2 = b0 & $0F + "0"
If b2 > "9" Then : b2 = b2 + 7 : End If
SerTxd( "b0 = $",b1,b2, " = ",#b0, CR, LF )
A priori, ça fait l'inverse !

ça serait plutôt ça:
Code:
[COLOR=Purple]b7 [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Navy][B]215 [/B][/COLOR][COLOR=Black]:[/COLOR][COLOR=Purple]b8 [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Navy][B]120[/B][/COLOR][COLOR=Black]: [/COLOR][COLOR=Purple]b9 [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Navy][B]35[/B][/COLOR][COLOR=Black]: [/COLOR][COLOR=Purple]b10 [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Navy][B]46[/B][/COLOR][COLOR=Black]: [/COLOR][COLOR=Purple]b11 [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Navy][B]189[/B][/COLOR][COLOR=Black]: [/COLOR][COLOR=Purple]b12 [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Navy][B]145 [/B][/COLOR][COLOR=Green]'par exemple[/COLOR]

[COLOR=Purple]bptr [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Navy][B]7 [/B][/COLOR][COLOR=Green]' si premiére variable = b7[/COLOR]

[COLOR=Blue]do
   [/COLOR][COLOR=Purple]b1 [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Purple]@bptr[/COLOR][COLOR=DarkCyan]/[/COLOR][COLOR=Navy][B]16
      [/B][/COLOR][COLOR=Blue]gosub [/COLOR][COLOR=Black]dectohexa
   [/COLOR][COLOR=Purple]b1[/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Purple]@bptrinc[/COLOR][COLOR=DarkCyan]//[/COLOR][COLOR=Navy][B]16
      [/B][/COLOR][COLOR=Blue]gosub [/COLOR][COLOR=Black]dectohexa[/COLOR]
[COLOR=Blue]loop until [/COLOR][COLOR=Purple]bptr [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Navy][B]13[/B][/COLOR]

[COLOR=Blue]end[/COLOR]
[COLOR=Black]dectohexa:
      [/COLOR][COLOR=Blue]lookup [/COLOR][COLOR=Purple]b1[/COLOR][COLOR=Black],[/COLOR][COLOR=Blue]([/COLOR][COLOR=Navy][B]48[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]49[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]50[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]51[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]52[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]53[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]54[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]55[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]56[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]57[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]65[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]66[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]67[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]68[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]69[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]70[/B][/COLOR][COLOR=Blue])[/COLOR][COLOR=Black], [/COLOR][COLOR=Purple]b2
      [/COLOR][COLOR=Blue]sertxd ([/COLOR][COLOR=Purple]b2[/COLOR][COLOR=Blue])
return      [/COLOR]
 

westaust55

Moderator
Avec un peu plus de mise en forme:

Code:
b7 = 215 :b8 = 120: b9 = 35: b10 = 46: b11 = 189: b12 = 145 'par exemple

bptr = 7 ' si premiére variable = b7

do
   b1 = @bptr/16
      gosub dectohexa
   b1= @bptrinc//16
      gosub dectohexa
      [COLOR="#FF0000"]sertxd (",")[/COLOR]
loop until bptr = 13
      [COLOR="#FF0000"]sertxd (cr,lf)[/COLOR]

end
dectohexa:
      lookup b1,(48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70), b2
      sertxd (b2)
return
 

Patrice68

New Member
Oouahhh! superbe! J'ai compris le sens général du code mais il faut que j'approfondisse (mes connaissances du langage dans tous les cas)
Merci à tous de votre contribution.
Je débute en basic Picaxe et ayant l'habitude d'outils de programmations plus évolués, je suis assez dérouté par la gestion des variables. Il faut que je trouve un toto la dessus c'est la base.

Et donc pour reboucler avec mon exemple initial, le code complet:

Col=b3
Main:
READOWSN Ds18b20 'b6 - b13 est utilisé par la commande READOWSN
bptr = 6 ' car premiére variable = b6
Col=192 (afficheur LCD => 192 = n° de la 1ère colonne de la ligne 2, 193 sera le n° de la colonne 2 ligne 2 ...)
do
b1 = @bptr/16
gosub dectohexa
b1= @bptrinc//16
gosub dectohexa
if bptr <= 13 then 'inutile d'avoir une virgule avec rien derrière
sertxd (",")
end if
loop until bptr > 13
sertxd (cr,lf)

serout Sortie_LCD,baud,(254,Col,b2)

goto main

dectohexa:
lookup b1,(48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70), b2
sertxd (b2)
serout Sortie_LCD,baud,(254,Col,b2)
inc Col
return
 

PieM

Senior Member
je suis assez dérouté par la gestion des variables. Il faut que je trouve un toto la dessus c'est la base.
Il est vrai que l'adressage indirect des variables utilisé ici n'est pas forcément très lisible...
peut être jeter un oeil sur :

http://www.picaxeforum.co.uk/showthread.php?29759-frequence-ou-vitesse&p=310877&viewfull=1#post310877

Si c'est un afficheur 1602, alors tout peut rentrer sur une ligne si on ne met pas de séparateur "," .
pourquoi utiliser le byte de la famille (b6) puisqu'elle est connue ?

inutile d'incrémenter le N° de colonne, ça se fait tout seul en envoyant des serout Sortie_LCD,baud,(b2)

Code:
[COLOR=Black]Col[/COLOR][COLOR=DarkCyan]=[/COLOR][COLOR=Purple]b3 [/COLOR][COLOR=Green]'  [/COLOR][COLOR=#ff0000]????? si c'est un symbole il faut symbol Col= b3, mais ça ne sert à rien ici.[/COLOR]
[COLOR=Black]Main:[/COLOR]
[COLOR=Blue]READOWSN [/COLOR][COLOR=Black]Ds18b20 [/COLOR][COLOR=Green]'b6 - b13 est utilisé par la commande READOWSN[/COLOR]
[COLOR=Purple]bptr [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Navy][B]6 [/B][/COLOR][COLOR=Green]' car premiére variable = b6
'Col=192 (afficheur LCD => 192 = n° de la 1ère colonne de la ligne 2, 193 sera le n° de la colonne 2 ligne 2 ...)[/COLOR]
[COLOR=Blue]serout [/COLOR][COLOR=Black]Sortie_LCD,baud,[/COLOR][COLOR=Blue]([/COLOR][COLOR=Navy][B]254[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]192[/B][/COLOR][COLOR=Blue]) [/COLOR][COLOR=Green]' [/COLOR][COLOR=#ff0000]on positionne sur 0 de la seconde ligne[/COLOR]
[COLOR=Blue]do[/COLOR]
[COLOR=Purple]b1 [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Purple]@bptr[/COLOR][COLOR=DarkCyan]/[/COLOR][COLOR=Navy][B]16[/B][/COLOR]
[COLOR=Blue]gosub [/COLOR][COLOR=Black]dectohexa[/COLOR]
[COLOR=Purple]b1[/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Purple]@bptrinc[/COLOR][COLOR=DarkCyan]//[/COLOR][COLOR=Navy][B]16[/B][/COLOR]
[COLOR=Blue]gosub [/COLOR][COLOR=Black]dectohexa[/COLOR]
[COLOR=Green]'if bptr <= 13 then 'inutile d'avoir une virgule avec rien derrière
'sertxd (",")
'end if[/COLOR]
[COLOR=Blue]loop until [/COLOR][COLOR=Purple]bptr [/COLOR][COLOR=DarkCyan]> [/COLOR][COLOR=Navy][B]13[/B][/COLOR]
[COLOR=Green]'sertxd (cr,lf)

'serout Sortie_LCD,baud,(254,Col,b2)[/COLOR]

[COLOR=Blue]goto [/COLOR][COLOR=Black]main

dectohexa:[/COLOR]
[COLOR=Blue]lookup [/COLOR][COLOR=Purple]b1[/COLOR][COLOR=Black],[/COLOR][COLOR=Blue]([/COLOR][COLOR=Navy][B]48[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]49[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]50[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]51[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]52[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]53[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]54[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]55[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]56[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]57[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]65[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]66[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]67[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]68[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]69[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]7 0[/B][/COLOR][COLOR=Blue])[/COLOR][COLOR=Black], [/COLOR][COLOR=Purple]b2[/COLOR]
[COLOR=#008000]'sertxd (b2)[/COLOR][COLOR=Blue]
serout [/COLOR][COLOR=Black]Sortie_LCD,baud,[/COLOR][COLOR=Blue]([/COLOR][COLOR=Purple]b2[/COLOR][COLOR=Blue])[/COLOR]
[COLOR=Green]'inc Col[/COLOR]
[COLOR=Blue]return [/COLOR]
 
Last edited:

Patrice68

New Member
Bonsoir PieM et BESQUEUT
Bon, voilà des pistes de travail. Merci pour les liens.

Tiens, je ne sais pas reprendre une partie de la discutions,bon,copier/coller...

"pourquoi utiliser le byte de la famille (b6) puisqu'elle est connue ?"
Ah, je ne vois pas mon b6 dans le code (sauf celui venant du READOWSN). Qu'ai je fais de pas bien ?

"inutile d'incrémenter le N° de colonne, ça se fait tout seul en envoyant des serout Sortie_LCD,baud,(b2)"
Donc, si je comprends bien, une fois qu'on a placé le départ sur l'afficheur, la commande serout avancera de 1 caractère l'affichage automatiquement ?

Et béh ... j'ai du boulot! et j'ai le manuel n°2 avec moi ...
Dans tous les cas, merci de vos réponses qui me font progresser dans ce nouveau monde.
 

PieM

Senior Member
Ah, je ne vois pas mon b6 dans le code (sauf celui venant du READOWSN). Qu'ai je fais de pas bien ?
Code:
[COLOR=Blue]READOWSN [/COLOR][COLOR=Black]Ds18b20 [/COLOR][COLOR=Green]'b6 - b13 est utilisé par la commande READOWSN[/COLOR]
[COLOR=Purple]bptr [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Navy][B]6 [/B][/COLOR][COLOR=Green]' [/COLOR][COLOR=#ff0000]car premiére variable = b6[/COLOR][COLOR=Green]
[/COLOR]
[COLOR=Blue]serout [/COLOR][COLOR=Black]Sortie_LCD,baud,[/COLOR][COLOR=Blue]([/COLOR][COLOR=Navy][B]254[/B][/COLOR][COLOR=Black],[/COLOR][COLOR=Navy][B]192[/B][/COLOR][COLOR=Blue]) [/COLOR]
[COLOR=Blue]do[/COLOR]
[COLOR=Purple]b1 [/COLOR][COLOR=DarkCyan]= [/COLOR][COLOR=Purple]@bptr[/COLOR][COLOR=DarkCyan]/[/COLOR][COLOR=Navy][B]16[/B][/COLOR]  [COLOR=#ff0000]donc @bptr = b6[/COLOR]
si le pointeur est à 6, la première valeur décodée sera b6 donc la famille ! pour lire uniquement l'adresse il faut mettre bptr= b7 (voir mon 1er programme)
de plus b13 est la checksum, inutile si vous ne la vérifiez pas.
donc le test est à faire jusqu'à b12 donc loop until bptr > 12

Donc, si je comprends bien, une fois qu'on a placé le départ sur l'afficheur, la commande serout avancera de 1 caractère l'affichage automatiquement ?
Oui.

Aller sur affichage mode avancé en bas à doite. dans la nouvelle fenêtre il y a les balises pour les citations et le code
Merci de lire le post de bienvenue en haut !
 
Top