This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

keyboard

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

.

Parents
  • Hi,

    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
    
    

Reply
  • Hi,

    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
    
    

Children