DECLARE SUB getlpt (lpt1!, lpt2!, lpt3!, lpt4!) DECLARE FUNCTION bpse! (baseaddress!, channel!) FACTOR = 4.096 / 4096 DIM dout(1000) CALL getlpt(lpt1, lpt2, lpt3, lpt4) 'Get printer port address baseaddress = lpt1 'Set baseaddress to printer port address offset = 0 channel = 0 average = 20 CLS LOCATE 1, 1 PRINT "SAMPLE# VOLTS" LOCATE 10, 40 PRINT "EAS-12M CALIBRATION" LOCATE 2, 40 PRINT "S - Stop" LOCATE 3, 40 PRINT "ESC - Start" LOCATE 4, 40 PRINT "C - Change Channel" LOCATE 5, 40 PRINT "O - Change zero offset " LOCATE 6, 40 PRINT "P - Change printer port" LOCATE 7, 40 PRINT "Q - quit" LOCATE 14, 40 PRINT "Printer port 1" FOR i = 1 TO average LOCATE i + 2, 3 PRINT i NEXT i DO TEMP = 0 dout(0) = bpse(baseaddress, channel) FOR i = 1 TO average dout(i) = bpse(baseaddress, channel) NEXT i FOR i = 1 TO average LOCATE i + 2, 8 dout(i) = dout(i) + offset PRINT USING "####.###"; FACTOR * dout(i) TEMP = TEMP + dout(i) NEXT i TEMP = INT(TEMP / average) LOCATE 16, 40 PRINT "AVERAGE"; PRINT USING "####.###"; FACTOR * TEMP LOCATE 12, 40 PRINT "A/D Channel ="; channel LOCATE 13, 40 PRINT "Zero offset ="; offset A$ = INKEY$ IF (A$ = "q" OR A$ = "Q") THEN END IF (A$ = "s" OR A$ = "S") THEN DO A$ = INKEY$ LOOP UNTIL (A$ = CHR$(27)) END IF IF (A$ = "c" OR A$ = "C") THEN LOCATE 20, 40 INPUT "Channel = "; channel channel = INT(channel) IF (channel < 0 OR channel > 7) THEN channel = 0 END IF LOCATE 20, 40 PRINT " " END IF IF (A$ = "o" OR A$ = "O") THEN LOCATE 20, 40 INPUT "Offset = "; offset offset = INT(offset) LOCATE 20, 40 PRINT " " END IF IF (A$ = "p" OR A$ = "P") THEN LOCATE 20, 40 INPUT "LPT port = "; port SELECT CASE port CASE 1 baseaddress = lpt1 LOCATE 14, 40 PRINT "Printer port 1" CASE 2 baseaddress = lpt2 LOCATE 14, 40 PRINT "Printer port 2" CASE 3 baseaddress = lpt3 LOCATE 14, 40 PRINT "Printer port 3" CASE 4 baseaddress = lpt4 LOCATE 14, 40 PRINT "Printer port 4" END SELECT LOCATE 20, 40 PRINT " " END IF LOOP FUNCTION bpse (baseaddress, channel) ' MAX186 to Parallel port IBM TRANSFER PROGRAM ' port1 IS THE ADDRESS OF THE PARALLEL OUTPUT REGISTER ' port3 IS THE ADDRESS OF THE PARALLEL INPUT REGISTER port1 = baseaddress port2 = baseaddress + 1 port3 = baseaddress + 2 SELECT CASE channel CASE 0 din$ = "01100001" CASE 1 din$ = "01100011" CASE 2 din$ = "01101001" CASE 3 din$ = "01101011" CASE 4 din$ = "01100101" CASE 5 din$ = "01100111" CASE 6 din$ = "01101101" CASE 7 din$ = "01101111" END SELECT 'LSB SENT FIRST B = 2048 'B IS SCALE FACTOR FOR DOUT. vout = 0 'VOUT IS DECIMAL REP OF DOUT OUT port1, (&HC0 OR INP(port1)) 'Set bit 6&7 high to power on MAX186 FOR i = 1 TO 8 OUT port3, (&H3 OR INP(port3)) 'SCLK AND CS GOES LOW IF MID$(din$, 9 - i, 1) = "0" THEN 'SHIFT OUT DIN OUT port3, (&HFB AND INP(port3)) ELSE OUT port3, (&H4 OR INP(port3)) END IF OUT port3, (&HFD AND INP(port3)) 'SCLK GOES HIGH NEXT i OUT port3, (&H3 OR INP(port3)) 'SCLK AND CS GOES LOW OUT port3, (&HFD AND INP(port3)) 'SCLK GOES HIGH FOR i = 1 TO 12 OUT port3, (&H3 OR INP(port3)) 'SCLK AND CS GOES LOW IF (INP(port2) AND 128) = 128 THEN D = 0 ELSE D = 1 'READ DOUT vout = vout + (D * B): B = B / 2 'SCALE EACH BIT AND SUM 'BITS OUT port3, (&HFD AND INP(port3)) 'SCLK GOES HIGH NEXT i OUT port3, (&HFE AND INP(port3)) 'CS GO HIGH IF vout >= 2048 THEN vout = vout - 4096 'Scale for negative values bpse = vout 'SET BPSE TO VOUT END FUNCTION SUB getlpt (lpt1, lpt2, lpt3, lpt4) ' program will find the base address of available printers ports DIM portlocation(8) DEF SEG = 64 j = 1 FOR i = 0 TO 7 STEP 2 portlocation(j) = PEEK(8 + i) + (256 * PEEK(8 + i + 1)) j = j + 1 NEXT i DEF SEG lpt1 = portlocation(1) lpt2 = portlocation(2) lpt3 = portlocation(3) lpt4 = portlocation(4) END SUB