Examples Index

           

' =========================================================================
'
'   File...... KEYPAD.SXB
'   Purpose... Scanning a 4x4 Matrix Keypad
'   Author.... (c) Parallax, Inc. -- All Rights Reserved
'   E-mail.... support@parallax.com
'   Started...
'   Updated... 05 JUL 2006
'
' =========================================================================

' -------------------------------------------------------------------------
' Program Description
' -------------------------------------------------------------------------
'
' This program demonstrates the scanning of a 4x4 matrix keypad. If no
' key is pressed the GET_KEY routine will return a value of 16.
'
' Key values (hex):
'
'      C1    C2    C3    C4
'
' R1  [ 0 ] [ 1 ] [ 2 ] [ 3 ]
'
' R2  [ 4 ] [ 5 ] [ 6 ] [ 7 ]
'
' R3  [ 8 ] [ 9 ] [ A ] [ B ]
'
' R4  [ C ] [ D ] [ E ] [ F ]

' -------------------------------------------------------------------------
' Device Settings
' -------------------------------------------------------------------------

DEVICE          SX28, OSC4MHZ, TURBO, STACKX, OPTIONX
FREQ            4_000_000
ID              "KEYPAD"

' -------------------------------------------------------------------------
' IO Pins
' -------------------------------------------------------------------------

Keys            VAR     RC                      ' keyboard scan port
TRIS_Keys       VAR     TRIS_C
PLP_Keys        VAR     PLP_C

Col1            VAR     Keys.7                  ' column inputs
Col2            VAR     Keys.6
Col3            VAR     Keys.5
Col4            VAR     Keys.4

LEDs            VAR     RB
TRIS_LEDs       VAR     TRIS_B

' -------------------------------------------------------------------------
' Constants
' -------------------------------------------------------------------------

Yes             CON     0                       ' active low input
No              CON     1

Dash            CON     %01000000               ' segment G only

' -------------------------------------------------------------------------
' Variables
' -------------------------------------------------------------------------

theKey          VAR     Byte                    ' from keypad, 0 - 16
row             VAR     Byte                    ' keyboard scan row

tmpB1           VAR     Byte                    ' subroutine work vars
tmpB2           VAR     Byte
tmpW1           VAR     Word

' =========================================================================
  PROGRAM Start
' =========================================================================

' -------------------------------------------------------------------------
' Subroutine Declarations
' -------------------------------------------------------------------------

GET_KEY         SUB     0                       ' get key from pad
DELAY           SUB     1, 2                    ' delay in milliseconds

' -------------------------------------------------------------------------
' Program Code
' -------------------------------------------------------------------------

Start:
  LEDs = Dash                                   ' dash in display
  TRIS_LEDs = %00000000                         ' LED pins are outputs

Main:
  theKey = GET_KEY                              ' get a key
  IF theKey < 16 THEN                           ' was a key pressed?
    READ ReMap + theKey, theKey                 ' yes, remap keypad
    READ Digits + theKey, LEDs                  ' output to display
    DELAY 100
  ELSE
    LEDs = Dash
  ENDIF
  GOTO Main

' -------------------------------------------------------------------------
' Subroutine Code
' -------------------------------------------------------------------------

' This routine works by activating each row, then scanning each column.
' If a particular row/column junction is not active (pressed), the key
' value is incremented and the scan continues.  As soon as a key is found,
' the routine exits.  If no key is pressed the routine will exit with a key
' value of 16.
'
' Use: aByte = GET_KEY
' -- scans keyboard and places key value into 'aByte'

GET_KEY:
  tmpB1 = 0                                     ' reset keyboard value
  Keys = %0000_0111                             ' activate first row
  TRIS_Keys = %1111_0000                        ' refresh IO state
  PLP_Keys = %0000_1111                         ' pull-up input pins

  FOR tmpB2 = 1 TO 4                            ' scan four rows
    IF Col1 = Yes THEN EXIT                     ' check buttons on column
    INC tmpB1                                   ' update key value
    IF Col2 = Yes THEN EXIT
    INC tmpB1
    IF Col3 = Yes THEN EXIT
    INC tmpB1
    IF Col4 = Yes THEN EXIT
    INC tmpB1
    Keys = Keys >> 1                            ' select next row
    Keys = Keys | %0000_1000                    ' clear previous row
  NEXT
  RETURN tmpB1

' -------------------------------------------------------------------------

' Use: DELAY ms
' -- 'ms' is delay in milliseconds, 1 - 65535

DELAY:
  IF __PARAMCNT = 1 THEN
    tmpW1 = __PARAM1                            ' save byte value
  ELSE
    tmpW1 = __WPARAM12                          ' save word value
  ENDIF
  PAUSE tmpW1
  RETURN

' =========================================================================
' User Data
' =========================================================================

' Matrix to remap keypad values

ReMap:
  DATA   1,  2,  3, $A
  DATA   4,  5,  6, $B
  DATA   7,  8,  9, $C
  DATA  $E,  0, $F, $D

' Seven-segment digit maps

Digits:
'        .gfedcba
  DATA  %00111111                               ' 0
  DATA  %00000110                               ' 1
  DATA  %01011011                               ' 2
  DATA  %01001111                               ' 3
  DATA  %01100110                               ' 4
  DATA  %01101101                               ' 5
  DATA  %01111101                               ' 6
  DATA  %00000111                               ' 7
  DATA  %01111111                               ' 8
  DATA  %01100111                               ' 9
  DATA  %01110111                               ' A
  DATA  %01111100                               ' B
  DATA  %00111001                               ' C
  DATA  %01011110                               ' D
  DATA  %01111001                               ' E
  DATA  %01110001                               ' F