===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