Hi,
Below is a simple keyboard program, where i need to lock in 3 numeric digits only. The user will exit the program by pressing a non-numeric key. Until then, he can press any no. of keys. the program also displays each key properly as each one is pressed.
Problem: the program is unable to lock in the 3 digits from the key board. A similar program minus the keyboard, but using internal stored data works fine. Where is the problem ? I am using 89s52 an uvision ide. Can somebody reply please ?
ENDATA EQU #70H KEYBOARD: MOV R0, #03H ; PICK UP 3 DIGITS ONLY MOV R1, #ENDATA ;WRITE THE DATA IN TO MEMORY KEYBOARDDET: ; ONLY FOR NUMERIC. PRESSING 'D' RETURNS TO MAIN MOV P1, #11111111B ; INPUT FOR KB ;1ST ROW CLR P1.7 // makes row 1 low JB P1.3,NEXT1 // checks whether column 1 is low and jumps to NEXT1 if not low MOV A,#01H // loads a with 0D if column is low (that means key 1 is pressed) LCALL DISPLAYKB LJMP STORE ; STORE DATA IN MEMORY. NEXT1:JB P1.2, NEXT2 // checks whether column 2 is low and so on... MOV A,#02H LCALL DISPLAYKB ; DISPLAYKB IS USED TO DISPLAY THE DIGIT PRESSED LJMP STORE NEXT2:JB P1.1, NEXT3 MOV A,#03H LCALL DISPLAYKB LJMP STORE ;2ND ROW NEXT3:SETB P1.7 CLR P1.6 JB P1.3,NEXT4 MOV A,#04H LCALL DISPLAYKB LJMP STORE NEXT4:JB P1.2,NEXT5 MOV A,#05H LCALL DISPLAYKB LJMP STORE NEXT5:JB P1.1,NEXT6 MOV A,#06H LCALL DISPLAYKB LJMP STORE ;3RD ROW NEXT6:SETB P1.6 CLR P1.5 JB P1.3,NEXT7 MOV A,#07H LCALL DISPLAYKB LJMP STORE NEXT7:JB P1.2,NEXT8 MOV A,#08H LCALL DISPLAYKB LJMP STORE NEXT8:JB P1.1,NEXT9 MOV A,#09H LCALL DISPLAYKB LJMP STORE ;4TH ROW NEXT9: SETB P1.5 CLR P1.4 JB P1.2,NEXT10 MOV A,#00H LCALL DISPLAYKB LJMP STORE NEXT10:JB P1.0, GOBACK LJMP DISPLAY ; press 'D'to exit the program and display 3 digits GOBACK: LJMP KEYBOARDDET STORE: ; STORE 3 numeric digits IN ENDATA MOV @R1, A DEC R1 DJNZ R0, CALLDET LJMP KEYBOARD CALLDET: LJMP KEYBOARDDET
.
Thank you for your comments. Below is the indented code. I hope this helps.
MOVX doesn't help. I have tried so many permutations and combinations, including logic, but doesn't work. FYI.. I am able to write and read predefined data to external memory chip (serial). I am able to read data from ADC chip connected to 89S52 without any issues. I am baffled as to where the problem lies in this particular case ? 'STORE IS THE MAIN FUNCTION FOR STORING KEY STROKES IN BUFFER'
The program reads each key press properly. The program is storing the last key press in all the 3 locations of the buffer 'Endata' when it exits the keyboard functionality. I tried changing the address of 'endata', but it also did not help. Are there any specific changes required in the address of 'endata' and 'startup.a51'
Can anyone hint at where the problem could be ? Thanks for your advice.
KEYBOARD: MOV R0, #03H ; PICK UP 3 DIGITS ONLY OR OVERWRITE. MOV R1, #ENDATA ; BUFFER FOR STORING 3 DIGITS FROM KEYBOARD KEYBOARDDET: ; ALLOW USER TO PRESS AS MANY TIMES, UNTIL HE PRESSES "D" MOV P1, #11111111B ; MAKE P1 AS INPUT PORT ;1ST ROW CLR P1.7 ; DETECT KEY PRESS IN 1ST ROW JB P1.3,NEXT1 ; DETECT KEY IN ROW 1 AND COLUMN 1 I.E. DIGIT 1 MOV A,#01H ; DIGIT VALUE IS USED TO PICK UP 7 SEG. CODE FROM LOOK UP TABLE LCALL DISPLAYKB ; DISPLAYKB IS FUNCTION FOR DISPLAYING EACH KEYPRESS LJMP STORE ; STORE FUNCTION IS FOR STORING 3 KEY STROKES IN BUFFER 'ENDATA' NEXT1:JB P1.2, NEXT2 ; FIND WHETHER KEY IS PRESSED IN COLUMN 2 I.E. DIGIT 2 AND SO ON MOV A,#02H LCALL DISPLAYKB LJMP STORE NEXT2:JB P1.1, NEXT3 ; DETECT DIGIT 3 MOV A,#03H LCALL DISPLAYKB LJMP STORE ;2ND ROW NEXT3:SETB P1.7 ; DETECT DIGIT 4 CLR P1.6 JB P1.3,NEXT4 MOV A,#04H LCALL DISPLAYKB LJMP STORE NEXT4:JB P1.2,NEXT5 ; DETECT DIGIT 5 MOV A,#05H LCALL DISPLAYKB LJMP STORE NEXT5:JB P1.1,NEXT6 ; DETECT DIGIT 6 MOV A,#06H LCALL DISPLAYKB LJMP STORE ;3RD ROW NEXT6:SETB P1.6 ; DETECT DIGIT 7 CLR P1.5 JB P1.3,NEXT7 MOV A,#07H LCALL DISPLAYKB LJMP STORE NEXT7:JB P1.2,NEXT8 ; DETECT DIGIT 8 MOV A,#08H LCALL DISPLAYKB LJMP STORE NEXT8:JB P1.1,NEXT9 ; DETECT DIGIT 9 MOV A,#09H LCALL DISPLAYKB LJMP STORE ;4TH ROW NEXT9: SETB P1.5 ; DETECT DIGIT 0 CLR P1.4 JB P1.2,NEXT10 MOV A,#00H LCALL DISPLAYKB LJMP STORE NEXT10:JB P1.0, GOBACK ; IF USER PRESSES 'D' HE WILL EXIT THE KEYBOARD PROGRAM LJMP DDSPLY ; ANOTHER DISPLAY FUNCTION TO DISPLAY THE 3 DIGITS GOBACK: LJMP KEYBOARDDET ;KEEP DETECTING KEY STROKES UNTIL USER PRESSES 'D' STORE: ; STORE 3 DIGITS IN BUFFER ENDATA MOV @R1, A DEC R1 DJNZ R0, CALLDET LJMP KEYBOARD ; LIMIT TO ONLY 3 DIGITS, HENCE RESET R0 TO 3 & R1 'ENDATA' CALLDET: LJMP KEYBOARDDET ; GO BACK TO DETECTING KEY STROKES ;---------------------------------------------------------- DISPLAYKB: MOV R2, A ; SAVE KEY DECIMAL VALUE TEMPORARILY MOVC A,@A+DPTR ; GETS 7 SEG CODE FROM LOOK UP TABLE MOV P3, #00011000B ; DISPLAY EACH KEY PRESS MOV P2,A ; SEND 7 SEG CODE LCALL DELAY ; DELAY FUNCTION MOV A, R2 ; RETRIEVE DECIMAL VALUE BACK FOR STORING IN BUFFER RET
Below is the indented code.
Nope. You've added some comments, but code is NOT indented.
MOVX doesn't help. I have tried so many permutations and combinations, including logic, but doesn't work
Random changes are rarely helpful.
I am able to write and read predefined data to external memory chip (serial).
You missed out the fact that it was an external SERIAL device before! That is a very important point. If you don't have external a parallel access device, then the MOVX is not likely to do anything useful.
The listing is still a mess and I for one will not spend much time looking at it.
But, i did notice this line:
MOVC A,@A+DPTR ; GETS 7 SEG CODE FROM LOOK UP TABLE
That line requires DPTR to point to your lookup table. Where do you initialise DPTR?
"but doesn't work"
When something doesn't work, you don't start by changing the code. You start by making sure you understand what the code is _actually_ doing. First then will you have the knowledge of _what_ you need to change. And _how_ to change.
The whole idea here is that _you_ must undertand your code. If the program doesn't work, then there is a difference between what you think you understand and what the code is actually doing. So you must figure out where you thought wrong.
You start by making sure you understand what the code is _actually_ doing. when 'looking' at a mess (my name for your posted stuff is 'scribbles', not 'code') you do not see what the code is doing you are too busy figuring out the messy stuff.
I guess most (for one I) have had a period early in their career where did more or less messy stuff till they realized that what time you save by "just whacking out some code" is definitely not a time saver, the time lost in trying to debug it is far more than the time 'saved' by making scribbles instead of code