' ========================================================================= ' ' File....... Scanner.BS2 ' Purpose.... ' Author..... Jon Williams -- Parallax, Inc. ' E-mail..... jwilliams@parallax.com ' Started.... ' Updated.... 20 SEP 2005 ' ' {$STAMP BS2} ' {$PBASIC 2.5} ' ' ========================================================================= ' -----[ Program Description ]--------------------------------------------- ' -----[ Revision History ]------------------------------------------------ ' -----[ I/O Definitions ]------------------------------------------------- TxD CON 16 ' use programming port ' -----[ Constants ]------------------------------------------------------- #SELECT $STAMP #CASE BS2, BS2E, BS2PE T1200 CON 813 T2400 CON 396 T4800 CON 188 T9600 CON 84 T19K2 CON 32 TMidi CON 12 T38K4 CON 6 #CASE BS2SX, BS2P T1200 CON 2063 T2400 CON 1021 T4800 CON 500 T9600 CON 240 T19K2 CON 110 TMidi CON 60 T38K4 CON 45 #CASE BS2PX T1200 CON 3313 T2400 CON 1646 T4800 CON 813 T9600 CON 396 T19K2 CON 188 TMidi CON 108 T38K4 CON 84 #ENDSELECT SevenBit CON $2000 Inverted CON $4000 Open CON $8000 Baud CON T9600 Pace CON 10 ' -----[ Variables ]------------------------------------------------------- newScan VAR Byte ' new input scan oldScan VAR Byte ' old input scan chgdIns VAR Byte ' changed inputs to1Ins VAR Byte ' inputs changed 0 -> 1 timer VAR Byte ' heartbeat timer idx VAR Nib ' current input status VAR Byte ' "T" or "C" ' -----[ EEPROM Data ]----------------------------------------------------- ' -----[ Initialization ]-------------------------------------------------- Reset: oldScan = INL ' initialize input scan ' -----[ Program Code ]---------------------------------------------------- Main: newScan = INL ' scan inputs chgdIns = newScan ^ oldScan ' look for changes to1Ins = chgdIns & newScan ' mark 0->1 inputs oldScan = newScan ' save current scan Heartbeat: IF (timer = 0) THEN ' timer expired? SEROUT TxD, Baud, Pace, ["H", CR] ' yes, send "H" ENDIF timer = timer + 1 // 250 ' update timer PAUSE 3 ' tuned for ~1 sec Process_Inputs: DO WHILE (chgdIns <> %00000000) ' any changes? idx = (NCD chgdIns) - 1 ' get active input chgdIns.LOWBIT(idx) = 0 ' mark processed status = "T" - (to1Ins.LOWBIT(idx) * 17) ' create status char SEROUT TxD, Baud, Pace, [("1" + idx), status, CR] LOOP GOTO Main ' -----[ Subroutines ]-----------------------------------------------------