User Tools

Site Tools


mmbasic_original:graph_bas

GRAPH.BAS

This module is part of the original MMBasic library. It is reproduced here with kind permission of Hugh Buckle and Geoff Graham. Be aware it may reference functionality which has changed or is deprecated in the latest versions of MMBasic.

GRAPH.BAS

100 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
110 ' GRAPH.BAS
120 ' Demonstration program showing the ability to graph data
130 ' It will graph the voltage on pins 1 to 10 using both line and
140 ' bar graphs.  This will run on either VGA or composite displays.
150 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
160 '
170 DIM barval(10)
180 CLS
190 ' general drawing parameters, the same for both graphs
200 height = mm.vres/2 - mm.vres/17 : margin = 45 : width = mm.hres - margin
210 '
220 ' parameters for the bar graphs
230 bx = margin : by = mm.vres-10
240 dx = bx : dy = by : GOSUB 640      ' draw the axies for the bar graph
250 '
260 ' parameters for the analog line graph
270 ax = margin : ay = height
280 dx = ax : dy = ay : GOSUB 640      ' draw the axies for the line graph
290 '
300 average = 20                       ' averaging for the line graph
310 printx = Width/2 - 45 : printy = ay + 8
320 '
330 FOR i = 1 TO 10 : SETPIN i, 1  : NEXT i   ' Initialise the I/O pins
340 TIME$ = "0:0:0"                     ' Zero the clock
350 '
360 '
370 FOR i  = ax + 1 TO ax + width - 1
380 ''''''''''''''''''''' draw the line graph '''''''''''''''''''''''''
390    volt = 0
400    FOR j = 1 TO average
410        volt = volt + PIN(1)       ' Take multiple readings
420    NEXT j
430    volt = volt/average
440    LINE (i,ay - Height)-(i + 10, ay - 1), 0, bf ' Blank previous
450    h = ay - (height / 3.3) * volt    ' Calculate the vertical coordinate
460    IF i = ax + 1 THEN h_last = h  ' Setup a start point
470    LINE (i - 1, h_last)-(i, h), 1 ' Graph the voltage level
480    h_last = h                     ' remember for the next time around
490    LOCATE printx, printy          ' Position for printing the voltage
500    PRINT TIME$; "   CHANNEL 1 = ";
510    PRINT FORMAT$(volt, "%5.3fV")  ' And print the voltage
520    '
530    '
540    ''''''''''''''''''''' draw the bar graphs ''''''''''''''''''''''
550    FOR j = 1 TO 10
560      barval(j) = (barval(j) * 9 + (height / 3.3) * PIN(j)) / 10
570      st = (width/10)*(j - 1) + bx + 10
580      LINE (st, by)-(st + 20, by-barval(j)),1,bf
590      LINE (st, by-barval(j))-(st + 20, by-height),0,bf
600    NEXT j
610 NEXT i
620 GOTO 370                          ' Loop forever
630 '
640 ''''''''''''' Subroutine to draw the graph axies '''''''''''''
650 'CLS
660 LINE (dx,dy)-(dx, dy - height), 1 ' Draw the vert line
670 LINE (dx,dy)-(dx + Width ,dy), 1  ' Draw the horiz line
680 FOR i = 0 TO 33                   ' This loop draws the tick marks
690     h = dy - (height / 33) * i
700     t = dx - 5
710     IF i MOD 5 = 0 THEN t = dx-8  ' Longer tick mark if unit of 0.5V
720     IF i MOD 10 = 0 THEN          ' Special mark for a unit of 1V
730         LOCATE dx - 42, h - 3
740         PRINT LEFT$(FORMAT$(i/10,"%f"),3);"V"; ' Label the tick mark
750         t = dx - 15
760     ENDIF
770     LINE (dx, h)-(t, h), 1        ' Draw the tick mark
780 NEXT i
790 RETURN
mmbasic_original/graph_bas.txt · Last modified: 2024/01/19 09:39 by 127.0.0.1