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.¶
Note: Any required file(s) are available in the attachments tab (top right).
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