| ??? 04/15/10 18:14 Read: times |
#175066 - Problem with succesive memory locations |
I have a problem saving 4 valuew that i get from a keypad.
When i press a button from the keypad, it appears on the second line of the lcd a *. That's happening until i press 4 buttons. After i press the last button and the 4th * appears, the program waits until i press the * button of the keypad. Then it compares the keys i've pressed with 4 values stated at the beginning of the program. If the password is correct it has to appear the string text "ALARM ON". If the password is wrong it has to appear the string text "WRONG PASS". I have declared 40h to 43h with 00h in the beginning of the program. The button of the keypad that has zero 0 for code is button 1. The problem is that i press 4 times the 1 buttonm but i get the "WRONG PASS" message, instead of "ALARM ON". Here is the part of the code
mov R1,#90h
PSIFIO2:
DELAY10: MOV R6,#0C3h ; delay for the keys to be pressed
DELAY11: MOV R7,#0FFh
DELAY21: NOP
NOP
DJNZ R7,DELAY21
DJNZ R6,DELAY11
mov A,#0h
call SCAN2 ; scan2 is the routine that scans the keypad
MOV A,R5
CJNE A,#0FFh,ELEGXOSPSIFIOU2 ; check if any key has been pressed and jump to ELEGXOSPSIFIOU2
JMP PSIFIO2 ; ;if no key has been pressed jump to psifio2 and scan again.
ELEGXOSPSIFIOU2:
MOV 96h,R5 ; Put the code of the key that has benn pressed, at memory location 96h
MOV A,34h ; Put in A 04h (has been declared before). A counter to check if it's the 4th digit of the password
CJNE A,#04h,GRAPSE2 ; Check if it's the 4th key that has been pressed. Go to Grapse 2
TELOS2: JMP ENTER2 ; OR ENTER2
GRAPSE2: INC CURSPOS ;move cursor one position
CALL POSIT_CURSOR ; on the lcd
MOV A,#2Ah
CALL LCDCHAR ; Show * character on the lcd
INC 34h ; increase the pressed key counter
INC R1 ; show the next memory location, in which the code of the next pressed key will be saved
MOV @R1,96h ; put the code of the pressed key in the memory location that is in R1
JMP PSIFIO2 ; Go back to scan again
ENTER2:
CALL SCAN2 ; call the scan keypad routine
mov A, R5 ; put the code of the pressed key to A
CJNE A,#03h,ENTER2 ; wait until * key is pressed
ELEGXOSCODE1:
MOV A,91h ; put in A the code of the first pressed key
CJNE A,40h,WRONGPASS ; if it isn't 0, go to wrongpass routine
MOV A,92h ; if it is 0 continue and compare the next pressed key with 0
CJNE A,41h,WRONGPASS ; if it isn't 0, go to wrongpass routine
MOV A,93h ;if it is 0 continue and compare the next pressed key with 0
CJNE A,42h,WRONGPASS ;if it isn't 0, go to wrongpass routine
MOV A,94h ;if it is 0 continue and compare the next pressed key with 0
CJNE A,43H,WRONGPASS ;if it isn't 0, go to wrongpass routine
CALL LCDCLS ;CLEAR SCREEN
MOV CURSPOS,#4 ;put cursor in the first row of the lcd
CALL POSIT_CURSOR
MOV DPTR,#STRING4 ; show ALARM ON message
CALL LCDSTR
JMP HALT
WRONGPASS:
CALL LCDCLS ;clear screen
MOV CURSPOS,#4 ;put cursor in the first row of the lcd
CALL POSIT_CURSOR ;
MOV DPTR,#STRING5 ;show wrong pass message
CALL LCDSTR
HALT: JMP HALT
STRING1:
DB ' ALARM OFF ' ,0
STRING2:
DB ' GIVE PASS ' ,0
STRING3:
DB ' GIVE OLD PASS ' ,0
STRING4:
DB ' ALARM ON ' ,0
STRING5:
DB ' WRONG PASS ' ,0
END
Can anybody help? |
| Topic | Author | Date |
| Problem with succesive memory locations | 01/01/70 00:00 | |
| Debugging | 01/01/70 00:00 | |
| How can i see the code of pressed key | 01/01/70 00:00 | |
| Turn them into ASCII | 01/01/70 00:00 | |
| Or use 2 characters | 01/01/70 00:00 | |
| direct access to >80h => SFR | 01/01/70 00:00 | |
| incorrect addressing method | 01/01/70 00:00 | |
| (back to) basics - "bible" time | 01/01/70 00:00 | |
| Hal Albach's way | 01/01/70 00:00 | |
| It works | 01/01/70 00:00 | |
| You are not showing enough | 01/01/70 00:00 | |
the danger of uniformity | 01/01/70 00:00 |



