;Initilization $ NOMOD51 $ INCLUDE (REG515.inc) PUBLIC DISPLAY_FORWARD EXTRN DATA(KEYCOUNT, TURN_1, TURN_180, KEYPAD_FLAG, DISPFLAG, CONTSIG1, CONTSIG2, COUNT, ADDSAVE1, ADDSAVE2, GO_MOVE_HIGH, GO_MOVE_LOW) EXTRN CODE(DLAYA, TURN_LEFT, TURN_RIGHT, FORWARD, BACKWARD,DLAYZ,ADCIN, LCDOUT, HEXTOA, RPMINCREASE1, RPMINCREASE2, RPMDECREASE1, RPMDECREASE2) ;EXTRN BIT() DISPFORWARD SEGMENT CODE RSEG DISPFORWARD USING 0 DISPLAY_FORWARD: MOV A,#0 MOV KEYCOUNT,A ;CLEAR KEY COUNT MOV A,#0FFH MOV KEYPAD_FLAG,A ;CLEAR KEYPAD FLAG MOV A,#1AH ;CLEAR LCD LCALL LCDOUT MOV DPTR, #LCDDATA MOV R0,#0 DISPLOOP: ;OUT PUT TEXT TO SCREEN ;"MOVE FORWARD (CM)?" MOV A,R0 MOVC A,@A+DPTR CALL LCDOUT INC R0 CJNE R0,#19,DISPLOOP MOV A,#0DH ;NEXT LINE CODE LCALL LCDOUT LCALL DLAYZ MOV A,#0AH LCALL LCDOUT INPUTWAIT: ;WAIT FOR PRESSED KEYS MOV A,KEYPAD_FLAG CJNE A,#0FFH,KEY0 ;FIND PRESSED KEY IF KEYPAD_FLAG IS NOT #0FFH LJMP INPUTWAIT KEY0: CJNE A,#0,KEY1 MOV A,KEYCOUNT ;INCREMENT KEY COUNT ADD A,#1 MOV KEYCOUNT,A MOV A,#0FFH ;CLEAR KEYPAD FLAG MOV KEYPAD_FLAG,A MOV A,#0 MOV B,#0 PUSH ACC LCALL HEXTOA LCALL LCDOUT ;OUTPUT CURRENT CHARACTER LJMP INPUTWAIT KEY1: CJNE A,#1,KEY2 MOV A,KEYCOUNT ;INCREMENT KEY COUNT ADD A,#1 MOV KEYCOUNT,A MOV A,#0FFH ;CLEAR KEYPAD FLAG MOV KEYPAD_FLAG,A MOV A,#1 MOV B,#1 PUSH ACC LCALL HEXTOA LCALL LCDOUT ;OUTPUT CURRENT CHARACTER LJMP INPUTWAIT KEY2: CJNE A,#2,KEY3 MOV A,KEYCOUNT ADD A,#1 MOV KEYCOUNT,A MOV A,#0FFH MOV KEYPAD_FLAG,A MOV A,#2 MOV B,#2 PUSH ACC LCALL HEXTOA LCALL LCDOUT LJMP INPUTWAIT KEY3: CJNE A,#3,KEY4 MOV A,KEYCOUNT ADD A,#1 MOV KEYCOUNT,A MOV A,#0FFH MOV KEYPAD_FLAG,A MOV A,#3 MOV B,#3 PUSH ACC LCALL HEXTOA LCALL LCDOUT LJMP INPUTWAIT KEY4: CJNE A,#4,KEY5 MOV A,KEYCOUNT ADD A,#1 MOV KEYCOUNT,A MOV A,#0FFH MOV KEYPAD_FLAG,A MOV A,#4 MOV B,#4 PUSH ACC LCALL HEXTOA LCALL LCDOUT LJMP INPUTWAIT KEY5: CJNE A,#5,KEY6 MOV A,KEYCOUNT ADD A,#1 MOV KEYCOUNT,A MOV A,#0FFH MOV KEYPAD_FLAG,A MOV A,#5 MOV B,#5 PUSH ACC LCALL HEXTOA LCALL LCDOUT LJMP INPUTWAIT KEY6: CJNE A,#6,KEY7 MOV A,KEYCOUNT ADD A,#1 MOV KEYCOUNT,A MOV A,#0FFH MOV KEYPAD_FLAG,A MOV A,#6 MOV B,#6 PUSH ACC LCALL HEXTOA LCALL LCDOUT LJMP INPUTWAIT KEY7: CJNE A,#7,KEY8 MOV A,KEYCOUNT ADD A,#1 MOV KEYCOUNT,A MOV A,#0FFH MOV KEYPAD_FLAG,A MOV A,#7 MOV B,#7 PUSH ACC LCALL HEXTOA LCALL LCDOUT LJMP INPUTWAIT KEY8: CJNE A,#8,KEY9 MOV A,KEYCOUNT ADD A,#1 MOV KEYCOUNT,A MOV A,#0FFH MOV KEYPAD_FLAG,A MOV A,#8 MOV B,#8 PUSH ACC LCALL HEXTOA LCALL LCDOUT LJMP INPUTWAIT KEY9: CJNE A,#9,KEYA MOV A,KEYCOUNT ADD A,#1 MOV KEYCOUNT,A MOV A,#0FFH MOV KEYPAD_FLAG,A MOV A,#9 MOV B,#9 PUSH ACC LCALL HEXTOA LCALL LCDOUT LJMP INPUTWAIT KEYA: CJNE A,#0AH,KEYB MOV A,#0FFH MOV KEYPAD_FLAG,A LJMP INPUTWAIT KEYB: CJNE A,#0BH,KEYC MOV A,#0FFH MOV KEYPAD_FLAG,A LJMP INPUTWAIT KEYC: CJNE A,#0CH,KEYD MOV A,#0FFH MOV KEYPAD_FLAG,A LJMP INPUTWAIT KEYD: CJNE A,#0DH,KEYE MOV A,#0FFH MOV KEYPAD_FLAG,A LJMP INPUTWAIT KEYE: CJNE A,#0EH,KEYF MOV A,#0FFH MOV KEYPAD_FLAG,A ;************************** ;THE FUNCTION CONVERT CONVERTS THE PRESSED KEYS INTO AN ACTUAL NUMBER. ;EACH TIME A KEY IS PRESSED, IT IS PUSHED ONTO THE STACK. CONVERT, POPS THE STACK ;ONE TIME FOR EACH KEY PRESSED. SO, IF THE KEYPAD IS PRESSED 5 TIMES, 5 VALUSE ARE PUSHED ;ONTO THE STACK. THE FUNCTION CONVERT, POPS THE STACK 5 TIMES, AND CONVERTS THE 5 ;SEPERATE NUMBERS INTO ONE NUMBER. THE FINAL VALUES ARE STORED INTO GO_MOVE_LOW AND GO_MOVE_HIGH ;************************** CONVERT1: MOV A,#0 MOV GO_MOVE_LOW,A MOV GO_MOVE_HIGH,A MOV A,KEYCOUNT ;NO KEYS HAVE BEEN PRESSED JZ CONTINUE POP ACC ;GET VALUE FROM STACK MOV GO_MOVE_LOW,A ;PUT VALUE INTO GO_MOVE_LOW MOV A,KEYCOUNT ;CHECK NUMBER OF PRESSED KEYS CJNE A,#1,CONVERT10 LJMP CONTINUE CONVERT10: POP ACC MOV B,#10 MUL AB ADDC A,GO_MOVE_LOW MOV GO_MOVE_LOW,A MOV A,KEYCOUNT CJNE A,#2,CONVERT100 LJMP CONTINUE CONVERT100: POP ACC MOV GO_MOVE_HIGH,A MOV A,KEYCOUNT CJNE A,#3,CONVERT1000 LJMP CONTINUE CONVERT1000: POP ACC MOV B,#10 MUL AB ADDC A,GO_MOVE_HIGH MOV GO_MOVE_HIGH,A MOV A,KEYCOUNT CJNE A,#48,CONVERT10000 LJMP CONTINUE CONVERT10000: POP ACC MOV B,#100 MUL AB ADDC A,GO_MOVE_HIGH MOV GO_MOVE_HIGH,A CONTINUE: LCALL FORWARD RET KEYF: CJNE A,#0FH,NOKEY ;KEY F IS THE "EXIT MENU" KEY THE STACK MUST BE POPED "KEYCOUNT" TIMES BEFORE EXITING MOV A,#0FFH MOV KEYPAD_FLAG,A MOV A,KEYCOUNT CJNE A,#0,EXIT1 RET EXIT1: CJNE A,#1,EXIT2 POP ACC RET EXIT2: CJNE A,#2,EXIT3 POP ACC POP ACC RET EXIT3: CJNE A,#3,EXIT4 POP ACC POP ACC POP ACC RET EXIT4: CJNE A,#48,EXIT5 POP ACC POP ACC POP ACC POP ACC RET EXIT5: POP ACC POP ACC POP ACC POP ACC POP ACC RET NOKEY: MOV A,#0FFH MOV KEYPAD_FLAG,A LJMP INPUTWAIT LCDDATA: DB "Move Forward (cm.)?" END