basic pour duinomite (mmbasic)

basic pour duinomite (mmbasic) - Langages fonctionnels - Programmation

Marsh Posté le 26-02-2014 à 18:05:52    

bonjour a tous  
j'ai un petit problème de compréhension sur un programme Basic fonctionnant avec une carte DUINOMITE.
j'ai trouvé un exemple de programme avec une boucle comme celle-ci:
 
     for i= 1 to 10
       if(LCDBUT(i,0)=0) then Exit For
     next i
       if i > 10 then Error
 
je tombe toujours sur le message error la dernière ligne je ne comprend pas pourquoi i peut avoir une valeur supérieur a 10  
la boucle est de 1 a 10 pourquoi continuerai-t-elle après 10
 
merci par avance pour vos reponses
thierry

Reply

Marsh Posté le 26-02-2014 à 18:05:52   

Reply

Marsh Posté le 26-02-2014 à 19:35:31    

Quand i atteint sa dernière valeur de boucle, 10, le Next i le fait passer a 11, le programme retourne en début de boucle, compare i avec la valeur de boucle maximale (10), voit que i est plus grand que 10, et donc sort de la boucle et exécute l'instruction qui suit la boucle.
Tu arrives donc a l'instruction qui suit la fin de boucle,  if i > 10 then Error , avec un i qui vaut 11...
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-02-2014 à 19:44:18    

salut gilou
c'est ce que je pensais j'ai donc essayer le 11 il a mis une erreur a la ligne suivante .
je ne suis pas fort en tableau je pense que le i est le pointeur du tableau
 l faudrait que je te donne la suite du code pour que tu comprennes .
mais le pire c'est que c'est un programme de demo mis en ligne par un internaute qui ne répond pas aux demandes!!!!  
merci pour l'explication  
a+

Reply

Marsh Posté le 27-02-2014 à 07:33:04    

pour ceux que cela intéresse.
 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' demo of the graphics library for the 4D-Systems PICASSO range of touch LCDs
' this has been tested on the 4.3 inch and 3.2 inch serial displays
' models: uLCD43(SGC)  and  uLCD-32PT(SGC)
'
' the demo displays the time and some other graphics (see the photo)
' buttons are not used but can easily be added
'
' Geoff Graham, March 2012
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 
' open the display
LCDOpen 2
 
''''''''''''''''''''''''''''''''''''''''''''''''''''
MainScreen:
 
LCDCLS                    ' clear the screen and any buttons
 
TCol = RGB(0,1,1)         ' time display colour and position
TVPos = 0
 
WCol = RGB(0,.8,0)        ' water display colour and position
WVpos = 120
 
BCol = RGB(1,0,0)        ' battery display colour and position
BVpos = 156
 
ICol = RGB(0.9,0.9,0)     ' inside temperatures display colour and position
IVpos = 198 : IHpos = 45
 
OCol = RGB(0.9,0.9,0)     ' outside temperatures display colour and position
OVpos = 198 : OHpos = 196
 
' this demo does not have any butons but this is how you would set them up
'LCDBSetup 250, 50, "Msg1"  ' button labeled Msg1
'LCDBSetup 250, 100, "Msg2"  ' similar
'LCDBSetup 0, 0, "", 240, 100 ' button not labeled (area of the screen)
 
 
LCDPrint 0, WVpos+2, "Water", WCol, 13
LCDLine 96, WVpos, 319, WVpos+20, WCol, 1
LCDLine 100, WVpos + 4, 300, WVpos+16, WCol, 2
 
LCDPrint 0, BVpos+2, "Battery", BCol, 13
LCDLine 96, BVpos, 319, BVpos+20, BCol, 1
LCDLine 100, BVpos + 4, 150, BVpos+16, BCol, 2
 
LCDPrint IHPos, IVpos, "27", ICol, 33
LCDPrint IHPos-30, IVPos + 8, "I", ICol, 12
LCDPrint IHPos-30, IVPos + 24, "N", ICol, 12
LCDPrint IHPos+80, IVPos, "C", ICol, 13
 
LCDPrint OHPos, OVpos, "32", OCol, 33
LCDPrint OHPos+110, OVPos + 2, "O", OCol, 12
LCDPrint OHPos+110, OVPos + 16, "U", OCol, 12
LCDPrint OHPos+110, OVPos + 30, "T", OCol, 12
LCDPrint OHPos+80, OVPos, "C", OCol, 13
 
Do      ' this loop never ends
  If tlast$ <> Left$(Time$, 5) Then
    tlast$ = Left$(Time$, 5)
    hrs = Val(Left$(Time$, 2)) : min = Val(Mid$(Time$, 4, 2))
    If hrs > 12 Then hrs = hrs - 12
    If hrs >= 10 Then oset = 0 Else oset = 6 * 5
    LCDPrint 10 + oset, TVPos, Format$(hrs, "%g" ) + ":" + Format$(min, "%02g" ), TCol, 53
    LCDPrint 26, TVPos+80, "Saturday 5th April 2012", TCol, 13
    ' this demo does not have any butons but this is how you would detect a  
    ' button press and run the appropiate subrouting to handle the press
    'On LCDTouch() GoSub msg1, msg2, msg3
  EndIf
Loop
 
 ' this demo does not have any butons but this is an example of how you would
 ' handle a button press.  Note that these are the target of GOSUB's
'msg1: Print "MSG1 pressed"
'      Pause 250
'      Return
'
'msg2: Print "MSG2 pressed"
'      Pause 250
'      Return
'
'msg3: Print "Screen press"
'      Pause 250
'      Return
 
 
 
 
 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' graphics library for the 4D-Systems PICASSO range of touch LCDs
' this has been tested on the 4.3 inch and 3.2 inch serial displays
' models: uLCD43(SGC)  and  uLCD-32PT(SGC)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 
' open the LCD display for access
' this resets the display and opens comms at 9600 baud
' com is the communication channel.  ie, 3 for COM3:
' pin 17 is used to reset the display and should be connected to the RES  
' pin on the LCD.  This must be called once at the start of the program
Sub LCDOpen com
  Dim LCDBut(10, 5) : Dim LCDBMsg$(10) ' these are used to record the buttons
  Open "COM" + Chr$(com + 48) + ":9600" As #10
  SetPin 17, 9
  Pin(17) = 1
  Pause 2000
  Print #10, "U";
  LCDGetAck
  Print #10, "Y" Chr$(5) Chr$(0);   ' enable the touchscreen
  LCDGetAck
  ' the following is only needed if the display is in portrait mode
  'Print #10, "Y" Chr$(4) Chr$(1);   ' rotate a portrait screen to landscape
  'LCDGetAck
End Sub
 
 
' clear the LCD screen and any buttons that have been setup on it
Sub LCDCLS
  Local i
  For i = 1 To 10
    LCDBut(i, 0) = 0
  Next i
  Print #10, "E";
  LCDGetAck
End Sub
 
 
 
' print a string on the LCD
' z and y are the coordinates, msg$ is the text
' c is the colour and f is the font (both are optional)
' f is two digits, the first is the scale and the second is the PICASO font
Sub LCDPrint x, y, msg$, c, f
  Local scale, opaque
  If f = 0 Then f = 13
  scale = (f\10) Mod 10
  opaque = ((f\100) = 0)
  If scale = 0 Then scale = 1
  f = f Mod 10
  If c = -1 Or c = 0 Then c = RGB(1,1,1)
  Print #10, "O" Chr$(opaque);
  LCDGetAck
  If f > 3 Then f = f - 3
  Print #10, "S" LCDWords$(2, x, y);
  Print #10, Chr$(f) LCDWords$(1, c);
  Print #10, Chr$(scale) Chr$(scale) msg$ Chr$(0);
  LCDGetAck
End Sub
 
 
 
' draw a line or a box
' x1, y1, x2, y2 are the start and end coordinates, c is the colour
' b = 0 will draw a line, b = 1 will draw a box and b = 2 a filled box
' c and b are optional and will default to a white line
Sub LCDLine x1, y1, x2, y2, c, b
  Local cmd$, pen
  If c = -1 Or (c = 0 And b = 0) Then c = RGB(1,1,1)
  If b = 0 Then
    cmd$ = "L"
  Else
    cmd$ = "r"
    Print #10, "p" Chr$(b = 1);
    LCDGetAck
  EndIf
  Print #10, cmd$ LCDWords$(5, x1, y1, x2, y2, c);
  LCDGetAck
End Sub
 
 
 
' generate a colour index for the LCD
' r = red, g = green and b = blue
' the values can range from zero (full off) to 1 (fully on)
Function RGB(r, g, b)
  RGB = Int(r * 31) * 2048 + Int(g * 63) * 32 + Int(b * 31)
End Function
 
 
 
' draw a button on the screen and initialise it
' x and y are the top left coordinates of the button
' msg$ is the caption for the button.  This can be a zero length string
' (ie, "" ) and in that case the button is not drawn and x1 and y1 are
' used to define an area on the screen which, if touched will return a
' button press.  A maximum of 10 buttons can be defined.
' x1 and y1 are optional
Sub LCDBSetup x, y, msg$, x1, y1
  Local i
 
  For i = 1 To 10
    If(LCDBut(i, 0) = 0) Then Exit For
  Next i
  If i > 10 Then Error
  LCDBut(i, 0) = 2: LCDBut(i, 1) = x: LCDBut(i, 2) = y
  LCDBMsg$(i) = msg$
  If msg$ <> "" Then
    LCDBut(i, 3) = x + Len(msg$) * 24 + 12: LCDBut(i, 4) = y + 44
    LCDButton 1, x, y, msg$
  Else
    LCDBut(i, 3) = x1 : LCDBut(i, 4) = y1
  EndIf
End Sub
 
 
 
' returns the button number that has been pressed or zero if no buton pressed
' normally this is used like this:   On LCDTouch() GoSub msg1, msg2, msg3
' the button number is the order in which they were set up
Function LCDTouch
  Local i, j, k, x, y
  Print #10, "o" Chr$(4);
  For k = 1 To 8000
    If Loc(10) = 4 Then
      If Input$(4, #10) = Chr$(0)+Chr$(3)+Chr$(0)+Chr$(0) Then
        Print #10, "o" Chr$(5);
        For j = 1 To 8000
          If Loc(10) = 4 Then
            x = Asc(Input$(1, #10)) * 256 + Asc(Input$(1, #10))
            y = Asc(Input$(1, #10)) * 256 + Asc(Input$(1, #10))
            For i = 1 To 10
              If x > LCDBut(i,1) And x < LCDBut(i,3) And y > LCDBut(i,2) And y < LCDBut(i,4) Then
                If LCDBut(i, 0) = 2 Then
                  LCDBut(i, 0) = 1
                  If LCDBMsg$(i) <> "" Then LCDButton 0, LCDBut(i, 1), LCDBut(i, 2), LCDBMsg$(i)
                  LCDTouch = i
                  Exit Function
                EndIf
              EndIf
            Next i
            LCDTouch = 0
            Exit Function
          EndIf
        Next j
        Error
      Else
        For i = 1 To 10
          If LCDBut(i, 0) = 1 Then
            LCDBut(i, 0) = 2
            If LCDBMsg$(i) <> "" Then LCDButton 1, LCDBut(i, 1), LCDBut(i, 2), LCDBMsg$(i)
          EndIf
        Next i
        LCDTouch = 0
        Exit Function
      EndIf
    EndIf
  Next k
  Error "LCD is not responding"
End Function
 
 
 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' internal routines - user code should not call these routines
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 
' used internally to draw a button
' user code should not call this sub
Sub LCDButton state, x, y, msg$, f, ct, cb
  Local scale
  If f = 0 Then f = 23
  scale = f\10
  If scale = 0 Then scale = 1
  f = f Mod 10
  If ct = 0 Then ct = RGB(1,1,1)
  If cb = 0 Then cb = RGB(0,0.5,0.5)
  Print #10, "O" Chr$(0); : LCDGetAck
  Print #10, "b" Chr$(state) LCDWords$(3, x, y, cb);
  Print #10, Chr$(f) LCDWords$(1, ct) Chr$(scale) Chr$(scale);
  Print #10, msg$ Chr$(0);
  LCDGetAck
End Sub
 
 
' used to get an acknowledgement from the LCD
' user code should not call this sub
Sub LCDGetAck
  Local i
  For i = 1 To 8000
    x$ = Input$(1, #10)
    If x$ = Chr$(6) Then Exit Sub
    If x$ = Chr$(15) Then Error "LCD reported an error"
  Next i
  Error "LCD is not responding"
End Sub
 
 
' send a series of bytes to the screen
' user code should not call this sub
Function LCDWords$(nbr, w1, w2, w3, w4, w5)
  LCDWords$ = Chr$(w1\256) + Chr$(w1 And 255)
  If nbr > 1 Then LCDWords$ = LCDWords$ + Chr$(w2\256) + Chr$(w2 And 255)
  If nbr > 2 Then LCDWords$ = LCDWords$ + Chr$(w3\256) + Chr$(w3 And 255)
  If nbr > 3 Then LCDWords$ = LCDWords$ + Chr$(w4\256) + Chr$(w4 And 255)
  If nbr > 4 Then LCDWords$ = LCDWords$ + Chr$(w5\256) + Chr$(w5 And 255)
End Function

Reply

Marsh Posté le 04-03-2014 à 16:00:44    

boujour
demo  
CLS : COLOR 15, 0
 
DIM LCDBUT(10, 0)
 
LCDBUT(10, 0) = 0: 'la valeur = 0
 
FOR a = 1 TO 9
LCDBUT(a, 0) = a
NEXT a
a = 0
 
FOR i = 1 TO 10
PRINT i; " ";
IF (LCDBUT(i, 0) = 0) THEN EXIT FOR: ' si la valeur = 0 :fin 10
NEXT i
IF i > 10 THEN PRINT "Error"
PRINT
PRINT
PRINT i
i = 0
 
PRINT : PRINT
FOR a = 1 TO 10
LCDBUT(a, 0) = a 'la valeur = 1,2,3,4,5,6,7,8,9,10
NEXT a
a = 0
 
FOR i = 1 TO 10
PRINT i; " ";
IF (LCDBUT(i, 0) = 0) THEN EXIT FOR 'si la valeur > 0 :fin 11
NEXT i
IF i > 10 THEN PRINT "Error"
PRINT
PRINT
PRINT i
i = 0

Reply

Marsh Posté le 09-03-2014 à 08:31:15    

bonjour a tous  
 
j'ai résolu mon petit soucis de fonctionnement de dalle tactile .
 
en fait il s'agit de la boucle de lecture des touches qu'il faut dimensionner .
 
c'est pourquoi je posais la question a l'auteur , la demo dans cette etat fonctionne t elle.
 
pas de réponse alors j'ai cherché ....
 
merci a tous ceux qui ont pris le temps de lire et de s'interroger.
 
Thierry

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed