Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Calculatrice code de Gray Mar 15 Mar 2022 - 20:06 | |
| Bonjour à tous ! Utilisé en électronique, le code de Gray est un code binaire que l’on retrouve dans des capteurs de position, des contacteurs, des roues codeuses… Il est appelé également code binaire réfléchi. Sa particularité est qu’il n’y a qu’un seul et unique bit qui change quand un nombre est incrémenté ou décrémenté d’une unité. Cette calculatrice est prévue pour une longueur binaire maximum de 8 bits. Vous pouvez convertir un code binaire naturel, une valeur décimale ou hexadécimale en code de Gray ou inversement. Pour changer l’état d’un bit, cliquez dessus. Pour changer la valeur décimale ou hexadécimale, cliquez sur « + » ou « - » situé au-dessus et en dessous du chiffre à modifier. A chaque changement, tous les champs sont recalculés. - Code:
-
' Calculatrice code Gray ' Marc - Mars 2022 ' Ecrit en langage Panoramic
dim n_hex$, n_bin$, n_dec$, gray$ dim bin_n%, dec_n%, dim bit%, valeur%, valeurDecimale%, valeurHexa%, opt%, wFenetre%
label binModif, decModifPlus, decModifMoins, hexModifPlus, hexModifMoins, optionTable, redim
interfaceUtilisateur()
end
sub interfaceUtilisateur() wFenetre% = 900 width 0,width(0) - width_client(0) + wFenetre% height 0,height(0) - height_client(0) + 345 left 0,(screen_x - width(0)) / 2 top 0,(screen_y - height(0)) / 2 color 0,240,240,240 caption 0,"PANORAMIC" font_name 0,"Arial" font_size 0,10 on_resize 0,redim
container 1 top 1,15 left 1,20 width 1,530 height 1,310 color 1,240,240,240 command_target_is 1 caption 1," Calculatrice code de Gray " ' créer zone de saisie binaire creerZoneBinaire(10,132,108) ' créer zone de saisie décimale creerZoneDecimale(40,357,108)
' créer zone de saisie hexadécimale creerZoneHexadecimale(70,457,108)
' créer zone de saisie binaire Gray creerZoneBinaire(20,132,200)
' légendes alpha 200 top 200,57 left 200,204 font_size 200,13 caption 200,"Binaire" alpha 201 top 201,57 left 201,366 font_size 201,13 caption 201,"Décimal" alpha 202 top 202,57 left 202,464 font_size 202,13 caption 202,"Hexa." alpha 203 top 203,112 left 203,23 font_size 203,11 caption 203,"Binaire naturel :"
alpha 204 top 204,204 left 204,18 font_size 204,11 caption 204,"Code de GRAY :"
logoPanoramic(435,220)
creerTableGray() boutonOption(550,160)
opt% = 1 end_sub
sub creerTableGray() dim_local a%, b%, c%, dec$, hexa$, binaire$, codeGray$, ligne$ list 2 parent 2,0 top 2,22 left 2,570 height 2,303 width 2,310 font_name 2,"Courier New" font_size 2,12 ' bandeau légende sur fond noir en haut du LIST panel 3 parent 3,0 left 3,570 top 3,22 height 3,30 width 3,292 color 3,0,0,0 ' légende "DEC" alpha 4 parent 4,3 top 4,5 left 4,13 font_name 4,"Courier New" font_size 4,13 font_bold 4 font_color 4,255,255,255 caption 4,"DEC" ' Légende "HEX" alpha 5 parent 5,3 top 5,5 left 5,58 font_name 5,"Courier New" font_size 5,13 font_bold 5 font_color 5,255,255,255 caption 5,"HEX" ' Légende "BINAIRE" alpha 6 parent 6,3 top 6,5 left 6,109 font_name 6,"Courier New" font_size 6,13 font_bold 6 font_color 6,255,255,255 caption 6,"BINAIRE" ' Légende "GRAY" alpha 7 parent 7,3 top 7,5 left 7,223 font_name 7,"Courier New" font_size 7,13 font_bold 7 font_color 7,255,255,255 caption 7,"GRAY" ' remplir objet LIST item_add 2,"" item_add 2,"" for a% = 0 to 255
' colonne décimale dec$ = str$(a%) while len(dec$) < 4 dec$ = " " + dec$ end_while ' colonne hexadécimale hexa$ = hex$(a%) while len(hexa$) < 2 hexa$ = "0" + hexa$ end_while ' colonne binaire pur b% = a% binaire$ = "" while b% > 0 if frac(b% / 2) = 0 binaire$ = "0" + binaire$ else binaire$ = "1" + binaire$ end_if b% = int(b% / 2) end_while while len(binaire$) < 8 binaire$ = "0" + binaire$ end_while
' colonne code Gray b% = a% * 2 c% = bin_xor(a%,b%) c% = int (c% / 2) codeGray$ = "" while c% > 0 if frac(c% / 2) = 0 codeGray$ = "0" + codeGray$ else codeGray$ = "1" + codeGray$ end_if c% = int(c% / 2) end_while while len(codeGray$) < 8 codeGray$ = "0" + codeGray$ end_while
ligne$ = dec$ + " " + hexa$ + " " + binaire$ + " " + codeGray$ item_add 2,ligne$ next a% end_sub
sub boutonOption(x%,y%) picture 9 parent 9,0 width 9,20 height 9,30 left 9,x% top 9,y% color 9,240,240,240 cursor_point 9 on_click 9,optionTable 2d_target_is 9 2d_pen_color 0,0,0 2d_line 4,15,9,5 2d_line 4,15,9,25 2d_line 8,15,13,5 2d_line 8,15,13,25 end_sub
sub creerZoneBinaire(n%,x%,y%) dim_local i%, e%, b% b% = 7 for i% = 0 to 7 button n% left n%, x% + e% top n%, y% width n%, 25 height n%, 25 font_name n%,"Courier" font_size n%,13 font_bold n% caption n%,"0" cursor_point n% on_click n%,binModif alpha n%+100 left n%+100, x% + e% + 8 top n%+100, y% - 17 width n%+100, 25 height n%+100, 25 font_name n%+100,"Courier" font_size n%+100,10 caption n%+100,b% n% = n% + 1 b% = b% - 1 e% = e% + 25 next i% end_sub
sub creerZoneDecimale(n%,x%,y%) dim_local i%, e% for i% = 0 to 2 button n% left n%, x% + e% top n%, y% width n%, 25 height n%, 25 font_name n%,"Courier" font_size n%,13 font_bold n% caption n%,"0"
picture n%+100 left n%+100, x% + e% top n%+100, y% - 20 width n%+100, 25 height n%+100, 25 2d_target_is n%+100 2d_fill_color 240,240,240 color n%+100,240,240,240 font_name n%+100,"Courier" font_size n%+100,12 print_target_is n%+100 print_locate 8,3 print "+" cursor_point n%+100 on_click n%+100,decModifPlus picture n%+105 left n%+105, x% + e% top n%+105, y% + 20 width n%+105, 25 height n%+105, 25 2d_target_is n%+105 2d_fill_color 240,240,240 color n%+105,240,240,240 font_name n%+105,"Courier" font_size n%+105,12 print_target_is n%+105 print_locate 8,5 print "-" cursor_point n%+105 on_click n%+105,decModifMoins n% = n% + 1 e% = e% + 25 next i% end_sub
sub creerZoneHexadecimale(n%,x%,y%) dim_local i%, e% for i% = 0 to 1 button n% left n%, x% + e% top n%, y% width n%, 25 height n%, 25 font_name n%,"Courier" font_size n%,13 font_bold n% caption n%,"0"
picture n%+100 left n%+100, x% + e% top n%+100, y% - 20 width n%+100, 25 height n%+100, 25 2d_target_is n%+100 2d_fill_color 240,240,240 color n%+100,240,240,240 font_name n%+100,"Courier" font_size n%+100,12 print_target_is n%+100 print_locate 8,3 print "+" cursor_point n%+100 on_click n%+100,hexModifPlus picture n%+105 left n%+105, x% + e% top n%+105, y% + 20 width n%+105, 25 height n%+105, 25 2d_target_is n%+105 2d_fill_color 240,240,240 color n%+105,240,240,240 font_name n%+105,"Courier" font_size n%+105,12 print_target_is n%+105 print_locate 8,5 print "-" cursor_point n%+105 on_click n%+105,hexModifMoins n% = n% + 1 e% = e% + 25 next i% end_sub
sub logoPanoramic(x%,y%) ' Logo Panoramic picture 220 parent 220,1 height 220,60 width 220,60 top 220,y% left 220,x% color 220,255,255,255 2d_target_is 220 ' dessin des cercles rouges 2d_fill_color 255,255,255 2d_pen_color 255,0,0 2d_pen_width 2 2d_circle 30,30,26 2d_circle 30,30,20 ' dessin du "P" en bleu 2d_pen_width 1 2d_pen_color 51,52,153 2d_fill_color 51,52,153 2d_rectangle 23,20,27,42 2d_line 19,20,37,20 2d_line 21,21,39,21 2d_line 32,22,40,22 2d_line 34,23,41,23 2d_rectangle 35,24,41,28 2d_line 34,28,41,28 2d_line 32,29,40,29 2d_line 27,30,39,30 2d_line 27,31,37,31 2d_line 21,40,29,40 2d_line 19,41,32,41 end_sub
binModif: if caption$(number_click) = "0" caption number_click,"1" else caption number_click,"0" end_if if number_click > 9 and number_click < 18 :' la valeur binaire naturelle a été modifée modif_bin_a() calculAffichageGray() end_if if number_click > 19 and number_click < 28 :' la valeur binaire Gray a été modifiée modif_gray() end_if return
decModifPlus: select number_click case 140 valeur% = val(caption$(40)) valeur% = valeur% + 1 valeurDecimale% = (valeur% * 100) + (val(caption$(41))*10) + val(caption$(42)) if valeurDecimale% > 255 return end_if caption 40,str$(valeur%) modif_dec_a()
case 141 valeur% = val(caption$(41)) valeur% = valeur% + 1 if valeur% > 9 valeur% = 9 end_if valeurDecimale% = (val(caption$(40))*100) + (valeur% * 10) + val(caption$(42)) if valeurDecimale% > 255 return end_if caption 41,str$(valeur%) modif_dec_a()
case 142 valeur% = val(caption$(42)) valeur% = valeur% + 1 if valeur% > 9 valeur% = 9 end_if valeurDecimale% = (val(caption$(40))*100) + (val(caption$(41))*10) + valeur% if valeurDecimale% > 255 return end_if caption 42,str$(valeur%) modif_dec_a() end_select calculAffichageGray() return
decModifMoins: select number_click case 145 valeur% = val(caption$(40)) valeur% = valeur% - 1 if valeur% < 0 valeur% = 0 end_if caption 40,str$(valeur%) modif_dec_a()
case 146 valeur% = val(caption$(41)) valeur% = valeur% - 1 if valeur% < 0 valeur% = 0 end_if caption 41,str$(valeur%) modif_dec_a()
case 147 valeur% = val(caption$(42)) valeur% = valeur% - 1 if valeur% < 0 valeur% = 0 end_if caption 42,str$(valeur%) modif_dec_a() end_select calculAffichageGray() return
hexModifPlus: select number_click case 170 valeurHexa% = hex(caption$(70)) valeurHexa% = valeurHexa% + 1 if valeurHexa% > 15 valeurHexa% = 15 end_if caption 70,hex$(valeurHexa%) modif_hex_a() case 171 valeurHexa% = hex(caption$(71)) valeurHexa% = valeurHexa% + 1 if valeurHexa% > 15 valeurHexa% = 15 end_if caption 71,hex$(valeurHexa%) modif_hex_a() end_select calculAffichageGray() return
hexModifMoins: select number_click case 175 valeurHexa% = hex(caption$(70)) valeurHexa% = valeurHexa% - 1 if valeurHexa% < 0 valeurHexa% = 0 end_if caption 70,hex$(valeurHexa%) modif_hex_a() case 176 valeurHexa% = hex(caption$(71)) valeurHexa% = valeurHexa% - 1 if valeurHexa% < 0 valeurHexa% = 0 end_if caption 71,hex$(valeurHexa%) modif_hex_a() end_select calculAffichageGray() return
sub modif_bin_a() ' conversion valeur binaire en format décimal dec_n% = 0 for bit% = 0 to 7 if val(caption$(bit% + 10)) = 1 dec_n% = dec_n% + POWER(2,7-Bit%) end_if next bit%
' conversion valeur décimale en chaine avec complément de "0" en tête pour avoir 3 chiffres n_dec$ = str$(dec_n%) while len(n_dec$) < 3 n_dec$ = "0" + n_dec$ end_while
' affiche la nouvelle valeur décimale caption 40,left$(n_dec$,1) caption 41,mid$(n_dec$,2,1) caption 42,right$(n_dec$,1)
' conversion valeur décimale en hexa avec complement de "0" en tête pour avoir 2 chiffres n_hex$ = hex$(dec_n%) while len(n_hex$) < 2 n_hex$ = "0" + n_hex$ end_while
' affiche la valeur décimale caption 70,left$(n_hex$,1) caption 71,right$(n_hex$,1) end_sub
sub modif_dec_a() ' lecture de la nouvelle valeur decimale dec_n% = val(caption$(40)+caption$(41)+caption$(42))
' conversion valeur décimale en hexa avec ajout de "0" en tête pour obtenir 2 chiffres n_hex$ = hex$(dec_n%) while len(n_hex$) < 2 n_hex$ = "0" + n_hex$ end_while ' affichage de la valeur hexadécimale caption 70,left$(n_hex$,1) caption 71,right$(n_hex$,1)
' conversion de la valeur decimale en binaire n_bin$ = "" while dec_n% > 0 if frac(dec_n% / 2) = 0 n_bin$ = "0" + n_bin$ else n_bin$ = "1" + n_bin$ end_if dec_n% = int(dec_n% / 2) end_while
while len(n_bin$) < 8 n_bin$ = "0" + n_bin$ end_while ' affiche la valeur binaire for bit% = 0 to 7 caption 10+bit%,mid$(n_bin$,bit%+1,1) next bit% end_sub
sub modif_hex_a() ' lecture nouvelle valeur hexadécimale n_hex$ = caption$(70)+caption$(71) ' conversion de la valeur hexa en décimal dec_n% = hex(n_hex$) ' conversion valeur décimale en chaine avec complement de "0" en tête pour avoir 3 chiffres n_dec$ = str$(dec_n%) while len(n_dec$) < 3 n_dec$ = "0" + n_dec$ end_while ' affiche de la valeur décimale de A caption 40,left$(n_dec$,1) caption 41,mid$(n_dec$,2,1) caption 42,right$(n_dec$,1)
' conversion de la valeur decimale en binaire n_bin$ = "" while dec_n% > 0 if frac(dec_n% / 2) = 0 n_bin$ = "0" + n_bin$ else n_bin$ = "1" + n_bin$ end_if dec_n% = int(dec_n% / 2) end_while
while len(n_bin$) < 8 n_bin$ = "0" + n_bin$ end_while ' affiche la nouvelle valeur binaire for bit% = 0 to 7 caption 10+bit%,mid$(n_bin$,bit%+1,1) next bit% end_sub
sub calculAffichageGray() dim_local c% dec_n% = val(caption$(40)+caption$(41)+caption$(42)) c% = dec_n% * 2 c% = bin_xor(dec_n%,c%) c% = int (c% / 2) gray$ = "" while c% > 0 if frac(c% / 2) = 0 gray$ = "0" + gray$ else gray$ = "1" + gray$ end_if c% = int(c% / 2) end_while while len(gray$) < 8 gray$ = "0" + gray$ end_while ' affiche la nouvelle valeur code Gray for bit% = 0 to 7 caption 20+bit%,mid$(gray$,bit%+1,1) next bit% end_sub
sub modif_gray() dim_local g%(7), pos%, a%, b% ' lecture des 8 bits de Gray bit% = 7 for pos% = 20 to 27 g%(bit%) = caption$(pos%) bit% = bit% - 1 next pos%
' recherche emplacement du premier bit à 1 en partant du bit de poids fort for bit% = 7 to 0 step -1 if g%(bit%) = 1 exit_for end_if next bit%
if bit% > 0 ' conversion vers binaire naturel n_bin$ = "1" a% = 1 bit% = bit% - 1 for pos% = bit% to 0 step -1 b% = bin_xor(a%,g%(pos%)) n_bin$ = n_bin$ + str$(b%) a% = b% next pos% ' ajout de "0" en tête pour obtenir une longueur de 8 bits while len(n_bin$) < 8 n_bin$ = "0" + n_bin$ end_while else if bit% = 0 n_bin$ = "00000001" else n_bin$ = "00000000" end_if end_if ' affichage de la valeur binaire obtenue for bit% = 0 to 7 caption 10+bit%,mid$(n_bin$,bit%+1,1) next bit% ' conversion du binaire en format décimal dec_n% = 0 for bit% = 0 to 7 if val(caption$(bit% + 10)) = 1 dec_n% = dec_n% + POWER(2,7-Bit%) end_if next bit%
' conversion valeur décimale en chaine avec complement de "0" en tête pour avoir 3 chiffres n_dec$ = str$(dec_n%) while len(n_dec$) < 3 n_dec$ = "0" + n_dec$ end_while
' affiche la nouvelle valeur décimale caption 40,left$(n_dec$,1) caption 41,mid$(n_dec$,2,1) caption 42,right$(n_dec$,1)
' conversion valeur décimale en hexa avec complement de "0" en tête pour avoir 2 chiffres n_hex$ = hex$(dec_n%) while len(n_hex$) < 2 n_hex$ = "0" + n_hex$ end_while
' affiche la valeur décimale caption 70,left$(n_hex$,1) caption 71,right$(n_hex$,1) end_sub
optionTable: if opt% = 1 opt% = 0 wFenetre% = 570 width 0,width(0) - width_client(0) + wFenetre% color 9,240,240,240 2d_line 11,15,6,5 2d_line 11,15,6,25 2d_line 15,15,10,5 2d_line 15,15,10,25 else opt% = 1 wFenetre% = 900 width 0,width(0) - width_client(0) + wFenetre% color 9,240,240,240 2d_line 4,15,9,5 2d_line 4,15,9,25 2d_line 8,15,13,5 2d_line 8,15,13,25 end_if return
redim: width 0,width(0) - width_client(0) + wFenetre% height 0,height(0) - height_client(0) + 345 return
| |
|