Keycode datatable

Discussion in 'Embedded Systems and Microcontrollers' started by daredavel, Mar 11, 2010.

  1. daredavel

    Thread Starter Member

    Feb 22, 2010
    32
    0
    good day sir! i'm kinda confuse and i need help in understanding how this datatable works.. How can it be determine if that certain key is press? and it is arrange in an usual manner.. although i know that its stand for RETLW 1, RETLW 2, etc.. and what is the purpose of keymask sir? and BNZ? I really need to understand how this works(specially the * and # part).. Thank you sir!!


    Code ( (Unknown Language)):
    1. movf keycode,  W                           addwf PCL, F
    2.                            dt 0x60
    3.                            dt "123a"
    4.                            dt "456b"
    5.                            dt "789c"
    6.                            dt "*0#d"
    7.  
    actual sample code:
    Code ( (Unknown Language)):
    1.                          
    2.   ram                                       EQU 0x0c
    3.   dcnt0                                   EQU ram1                                                 ; delay counter 0
    4.   dcnt1                                   EQU ram2                          ; delay counter 1
    5.   dcnt2                                   EQU ram3                                                 ; delay counter 2
    6.   beepcnt                             EQU ram4                                                 ; beep cycle counter
    7.   keycode                             EQU ram5
    8.   rowcnt                                EQU ram6
    9.   colcnt                                  EQU ram7
    10.   colstatus                            EQU ram8
    11.    
    12.    
    13.   cod                                        EQU ram9                                                 ; actual code
    14.   cod_end                            EQU cod+loc
    15.    
    16.   readlen                              EQU cod_end
    17.   readbuf                              EQU cod_end+1
    18.   readbuf_end                  EQU readbuf+loc
    19.    
    20.   tmptr                                   EQU readbuf_end                                ; pointer for comparing and copying readbuf
    21.   tmbyte                               EQU readbuf_end+1                         ; temp storage for comparing and copying
    22.    
    23.   ;--------------------------------------------------------------------------------------------------------------
    24.  keytable                                                    ;determine pressed key's real code from scancode
    25.                           movf keycode, W
    26.                           addwf PCL, F
    27.                           dt 0x60
    28.                           dt "123a"
    29.                           dt "456b"
    30.                           dt "789c"
    31.                           dt "*0#d"
    32.    
    33.   keyscan                                                      ; scan the keyboard
    34.                           clrf keycode
    35.                           movlw 4
    36.                           movwf rowcnt
    37.   movlw 0xfe
    38.                           tris PORTA                                                 ; select row 0
    39.    
    40.   rowscan                            
    41.   movlw 0xa0
    42.                           call udelay
    43.                           swapf PORTB, W
    44.                           movwf colstatus
    45.                           movlw 4
    46.                           movwf colcnt
    47.    
    48.   colscan      
    49.                           incf keycode, F
    50.                           rrf colstatus, F
    51.                           btfss STATUS, C
    52.                           goto keytable                ; a key was found
    53.   decfsz colcnt, F
    54.                           goto colscan
    55.   bsf STATUS, C
    56.   bsf STATUS, RP0
    57.                           rlf TRISA, F                                                 ; select next row
    58.                           bcf STATUS, RP0
    59.   decfsz rowcnt, F
    60.                           goto rowscan
    61.                           retlw 0                                ; no key was found
    62.    
    63.   main                                                                                     ; program starts here
    64.                           clrf PORTA
    65.                           clrw
    66.                           tris PORTA                                                ; porta all output
    67.                           clrf PORTB
    68.                           movlw 0xf0                                             ; pb4-7 inputs
    69.                           tris PORTB
    70.                           bcf STATUS, RP0                                    ;bank 0
    71.  
    72.    
    73.   loop                                      
    74.   clrf PORTB                        ; clear output
    75.   call read                            ; read code from keyboard into readbuf
    76.                           movlw cod
    77.                           call compbuf                  ; compare code in readbuf with code at cod
    78.                           bnz loop                             ; the code is different
    79.                                                                           ; the code matches, check which enter (#*) was pressed
    80.                           movlw '*'
    81.                           subwf keycode, W                             ; * changes code
    82.                           bz codechange
    83.    
    84.   pulseout                                                                            ; # operates output
    85.                           movlw 0x04                                           ; RB2 is output
    86.                           movwf PORTB
    87.   movlw pulsewidth
    88.                           movwf dcnt2
    89.   out0                                    
    90.   movlw d'200'
    91.                           call udelay
    92.                           decfsz dcnt2, F
    93.                           goto out0
    94.   goto loop
    95.    
    96.   codechange                    
    97.   movlw 2                                                                           ; * changes code
    98.                           movwf PORTB                                        ; indicate changing the code
    99.                           call read                                                      ; read new code into readbuf
    100.   movlw cod
    101.                           call copybuf                                            ; copy new code into cod
    102.                           call read                                                    ; read new code twice
    103.                           movlw cod                                              ; and check if the new code is confirmed
    104.                           call compbuf                                          ; wrong code entry, restart with the original code
    105.                           bnz warm
    106.                                                                                                   ; new code is comfirmed twice, store into eeprom
    107.                           call eep_write
    108.                           goto loop
    109.    
    110.   read                                      
    111.   clrf readlen
    112.    
    113.   readloop                                                                           ; wait until no key is pressed
    114.                           clrw
    115.                           tris PORTA                                                ; porta all LOW
    116.                           movf PORTB, W
    117.                           andlw 0xf0                                                                        ; keymask
    118.                           xorlw 0xf0
    119.                           btfss STATUS, Z
    120.                           goto readloop
    121.   movlw  0xf0                                            ; wait 24 ms
    122.                           call udelay                                                                         ; (debounce)
    123.    
    124.   key_pressed
    125.                           call keyscan
    126.                           andlw 0xff
    127.                           movwf keycode
    128.                           bz readloop
    129.                           movlw 0xf0                                               ; wait 24 ms
    130.                           call udelay                                                ; (debounce)
    131.                                                                                                   ; check if the buffer is full
    132.                           movlw clen
    133.                           subwf readlen, W
    134.                           bnz read_notfull                                  
    135.                           ; buffer is full, can return if an enter key (*#) is pressed
    136.                           ; check for ENTER
    137.                           call read_chkenter
    138.                                                                                                   ; enter is pressed, return
    139.                           movlw 0x40
    140.                           call beep
    141.                           movf keycode, W
    142.                           return
    143.    
    144.   read_notenter
    145.                                                                                                   ; buffer is full, but more characters entered
    146.                                                                                                   ; shift the buffer
    147.                           movlw readbuf+1
    148.                           movwf FSR
    149.    
    150.   read_shift                         movf INDF, W
    151.                           decf FSR, F
    152.                           movwf INDF
    153.                           incf FSR, F
    154.                           incf FSR, F
    155.                           movlw readbuf_end
    156.                           subwf FSR, W
    157.                           bnz read_shift
    158.                           decf readlen, F
    159.    
    160.   read_notfull                  
    161.          [FONT=&quot]call read_chkenter[/FONT]       [FONT=&quot]                               ; if the buffer is not full [/FONT]                                                                                                                      ; enter key (*#) is pressed, clear buffer
    162.                           movlw 0x40
    163.                           call beep
    164.                           movlw readbuf
    165.                           addwf readlen, W
    166.                           movwf FSR
    167.                           movf keycode, W
    168.                           movwf INDF
    169.                           incf readlen, F
    170.                           goto readloop
    171.  
    172.  
     
  2. hgmjr

    Moderator

    Jan 28, 2005
    9,030
    214
    Are you working with a standard IBM PC keyboard?

    hgmjr
     
Loading...