' ========================================================================= ' ' File.......black_key_board_v2.bs2 ' Purpose.... Interface bs2 with numeric key pad ' Author..... Mike Stephens ' E-mail..... ' Started.... 12/08/05 ' Updated.... ' ' {$STAMP BS2} ' {$PBASIC 2.5} ' ' ========================================================================= ' -----[ Program Description ]--------------------------------------------- 'check for valid entry of 5 digit code ' -----[ Revision History ]------------------------------------------------ ' -----[ I/O Definitions ]------------------------------------------------- keypad PIN 1 ' -----[ 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 #ENDSELECT SevenBit CON $2000 Inverted CON $4000 Open CON $8000 Baud CON T9600 ' -----[ Variables ]------------------------------------------------------- keycode VAR Byte(5) 'code returned from keypad dat VAR Byte (5) 'alpha or numeric data indx VAR Nib 'counter char VAR Byte 'EEProm data variable ok_num VAR Nib ' holds numer of correct keypresses ' -----[ EEPROM Data ]----------------------------------------------------- DATA "4321#" 'entry code ' -----[ Initialization ]-------------------------------------------------- Reset: ' -----[ Program Code ]---------------------------------------------------- Main: ok_num=0 'set correct # of keypresses to zero DEBUG CLS FOR indx = 1 TO 5 'check for 5 digits of pass code DEBUG CRSRXY,0,0,"Enter your 5 digit code"',DEC indx GOSUB scan 'get keycode from keypad IF keycode(indx)=<%111001 THEN GOSUB numberdigit 'check to see if ASCII num IF keycode(indx)=>%1000001 THEN GOSUB alphadigit 'check to see if ASCII letter DEBUG CRSRXY,25+(indx),0,"*",dat(indx) 'place * for every digit entered READ indx -1, char 'read characters stored in EEPROM IF char=dat(indx) THEN ok_num = ok_num+1 'if digits match add one to ok_num variable IF char<>dat(indx) THEN ok_num = ok_num+0 NEXT IF ok_num = 5 THEN ok 'check for 5 correct matches IF ok_num <> 0 THEN notok GOTO main END '------[subroutines]--------------------------------------- scan: SERIN keypad,t2400,[KEYCODE(indx)] ' GET KEY PRESS ON PORT #1 RETURN numberdigit: '0123456789 keycode(indx) = keycode(indx) & %001111 'strip off high bits dat = 0 'set data to zero if data is out of range 'look up corresponding number value LOOKUP keycode(indx),[$31,$32,$33,$41,$34,$35,$36,$42,$37,$38],dat(indx) RETURN alphadigit: 'ABCD#* KEY DETECT keycode(indx) = keycode(indx) & %0111111 'strip off high bits dat=0 'look up corresponding alpha value LOOKUP keycode(indx),[$00,$39,$43,$2A,$30,$23,$44],dat(indx) RETURN ok: DEBUG CLS,"Welcome" PAUSE 500 RETURN notok: DEBUG CLS,"Invalid code" PAUSE 500 RETURN