| The Datasheet Archive - 100 Million Datasheets from 7500 Manufacturers. |
AN1803 Freescale Semiconductor, Inc. Coding Keypad Module MM
Top Searches for this datasheetOrder this document AN1803/D AN1803 Freescale Semiconductor, Inc. Coding Keypad Module MMC2001 Glenn Jackson Austin, Texas Introduction This application note assists microcontroller developer quickly functionality keypad module MMC2001. MMC2001 first publicly available general-purpose offering product line. overview keypad design issues explained software modular structure described. Suggestions concerning future enhancements current software made detailed software keypad decoding listed described. order topics this application note Keypad design issues Software structure Steps decode keypad Additional enhancements this keypad structure Program listings trademark Motorola, Inc. Motorola, Inc., 2000 AN1803 More Information This Product, www.freescale.com Freescale Semiconductor, Inc. Application Note Keypad Design Issues Overview Keypad operations produce several issues. These include: Debounce Capturing depress real time Unique keypad outputs Differing configurations, matching various columns rows pseudo-code Rising above assembler code register control with type variables Polling versus interrupt methods Freescale Semiconductor, Inc. These topics cover concerns which immediately apparent anyone dealt previously with keypad issues. Debounce attempt press physical keypad have this press detected fail result several sources. These sources include: high speed sampling part, relative real time Contacts which prove intermittent ability hardware detect attempt press versus random spike circuitry These various causes what called debounce problems. keypad port MMC2001 handles this problem hardware requiring that press detection occur four consecutive timing cycles. When hardware successful detecting press, information held until cleared software. This eliminates noises (glitches, spikes, etc.) less than duration. existing hardware simplifies software writing task detecting debounce. Unique Keypad Outputs Keypads cross-connection columns rows identify which pressed. These columns rows already hard-wired output cable. This would produce unique encoding output lines cable. example this application note uses (four columns four rows) matrix keys with eight-line output cable. Figure shows output cable which decoded Table AN1803 More Information This Product, www.freescale.com MOTOROLA Application Note Introduction Wire Column: Row: Wires 1234 Columns 0123 Wires 5678 Rows 0123 Keypad Freescale Semiconductor, Inc. Figure Keypad Output Cable Table Correlation Keys Wires Columns/Rows Wires Keypad Column AN1803 MOTOROLA More Information This Product, www.freescale.com Freescale Semiconductor, Inc. Application Note Pseudo-Code Register Variable Names Manipulation registers keypad block involves assembler level assignment. KEY.H file defines variables which represent registers their respective bits. These variables treated character (char) integer (int) variables KEY.C portion program. This makes KEY.C program look like standard address registers keypad port start location $10003000. individual bytes were assigned specific names ease access when coding These names described Table Freescale Semiconductor, Inc. Table Register Addresses Name Designations Address $10003000 $10003002 $10003004 $10003006 Name (Upper Byte) KPCR KPSR KDDR KPDR** Name (Lower Byte) KPRE* KPKR* KRDD* *Names found reference manual. These used code access. **KPDR register specific designations. Columns assigned bits KPDR 8-11, respectively. Rows assigned bits KPDR 0-3, respectively. Polling Interrupt Methods program KEY.C runs continuous loop until cancelled. This loop waits stroke, acts stroke, returns wait next key. This method, called polling, used when entire program from keys. interrupt method processor servicing activities beyond control keypad program. When pressed, interrupt called, stroke processed. After interrupt, processor released return service routines. AN1803 More Information This Product, www.freescale.com MOTOROLA Application Note Software Structure Software Structure main program (KEY.C) several supporting files. file KEY.H defines variables which help main program address registers bits keypad module MMC2001. file KEY.LNK sets address locations program into memory. KEY.C Freescale Semiconductor, Inc. KEY.C program written stand alone example keypad programming. This program will yield single "keynum" value which used other software application. KEY.H addresses KEY.H program adjusted different locations MMC2001 address map. "#pragma" block defines function which superset ANSII This function first defined "#pragma" section block. function activated "#pragma use_section" block. IOASECT IOBSECT names defined functions keypad registers. structure name REGISTER defined. REGISTER sets name each 16-bit register. register address KPDR structure REGISTER applied register KPDR register address location. column bits specifically assigned here. After this assignment, value connected register value using address KPDR.rowx (where 0.3) main KEY.C program. same holds true columns. KEY.LNK KEY.LNK program sets starting points memory memory size (read-only memory), (random-access memory), stack pointer. Uninitialized data space assigned along with compiler memory allocations identifiers. AN1803 MOTOROLA More Information This Product, www.freescale.com Freescale Semiconductor, Inc. Application Note Steps Decoding Keypad combination hardware software procedures performed convert mechanical press operation software data value. polling process used this application note involves main loop which: Sets registers Waits pressed Scans columns rows active Decodes results scan Clears registers another entry Converts decoded data software function Repeats loop another stroke Freescale Semiconductor, Inc. Registers Keypad Input This code module sets registers receiving keypad input. void set_registers(void) KPCR 0x00; Column Open-Drain KPRE 0x0F; Active Scan Write Data Register KPDR.LCD_E KPDR[15] KPDR.LCD_RW KPDR[14] KPDR.LCD_RS KPDR[13] KPDR.bit12 KPDR[12] KPDR.col3 KPDR[11] KPDR.col2 KPDR[10] KPDR.col1 KPDR[9] KPDR.col0 KPDR[8] KPDR.bit7 KPDR[7] KPDR.bit6 KPDR[6] KPDR.bit5 KPDR[5] KPDR.bit4 KPDR[4] KPDR.row3 KPDR[3] KPDR.row2 KPDR[2] KPDR.row1 KPDR[1] KPDR.row0 KPDR[0] KDDR KRDD KPKR KPSR KPSR 0xFF; 0x70; 0x0F; 0x01; 0xFD; Cols outputs, Rows inputs Rows inputs, controls Clear KPKD bit, write KDIE Clear KRIE AN1803 More Information This Product, www.freescale.com MOTOROLA Application Note Steps Decoding Keypad specific manipulations described KPCR sets column bits totem-pole driven. column bits reset open-drain desired. term "open-drain" defined having p-channel pullup disabled. KPRE register enables four rows zero three [0:3] into active scan. Each KPDR register initialized zero [0]. KDDR register written columns output configuration. KRDD register (lower byte KDDR) sets data bits inputs. status bits (KDSC, KRSS, KPKR, KPKD) cleared enable (KDIE) set. logic written status bits clear their active states. setting interrupt enable (KDIE), software provided with mechanism detect depress. Freescale Semiconductor, Inc. Have Program Wait Keypad Input wait module aligns hardware software. After registers have been receive press, this program waits press before proceeding. This accomplished entering while loop which checks changes KPKR register. With KDIE along with press, KPKR byte register changes reflect state KPKD bit. This causes exit from while loop returns control main calling program. software needs delay alignment with hardware. Otherwise, software would ahead hardware would fail wait press. count 60,000 cycles found sufficient shorter delay cycle might work just well. This method waiting change KPKR register also provides programming hook future interrupt version this program. line that feeds KPKD driven interrupt block MMC2001. Therefore, future interrupt handling module would located here program would same signal line. AN1803 MOTOROLA More Information This Product, www.freescale.com Freescale Semiconductor, Inc. Application Note Both delay wait_key submodules included Program Listings. <<<<<<<<<<>>>>>>>>>> void delay(void) time_pass; for(time_pass=0; time_pass<60000; time_pass++ continue;} <<<<<<<<<<>>>>>>>>>>*/ void wait_key() first; Initial value KPKR delay(); delay align hardware with software first KPKR; Original value KPKR Check consistent KPKR value while(first KPKR) continue; return; wait_key Freescale Semiconductor, Inc. Scan Columns Rows Active modules column scan perform function converting hardware data software data. scan active key, columns first prepared outputs, charged high state, then open drain. Next, columns tested consecutively along with associated four rows each column. successful test will have column zero then read each four rows produces value. Saving values specific column completes functionality these modules. setting column values appear redundant from previous register setup. However, these essential local functions which make scan modules independent other software program. active_row variable scan_key module serves control data function. While active_row equal zero [0], active been found. This will continue scan into remaining columns. When active been found, active_row will value through four [1-4]. final active_row value will translated back value, zero through three [0-3], return value. AN1803 More Information This Product, www.freescale.com MOTOROLA Application Note Steps Decoding Keypad Prepare Registers Next Input Since data retained memory, registers will immediately reset another press. column values zero permit clearing status bits. Next, status bits KPKD KPKR cleared finally interrupt enable bit, KDIE, reset. interrupt method incorporated into this program, then this reset required stop interrupt request core. Therefore, module reg_set good housekeeping polling method also intended provide essential hook future interrupt version. Freescale Semiconductor, Inc. Decode Input This part program converts input hardware data into usable software variable. line, which commented out, combination three tasks line. First, column data entered address location variable key. column data cast character which will stored four bits data. Second, stored column data character format) shifted left character bits). Third, data input character into lower four bits "key" variable. NOTE: data OR-functioned into "key" variable. char key; (char)kcol; Enter Column Data into 'key' (key<<4); Shift Column data left character 'key' ((char)krow); data right character 'key' column data translated into single keypad data. This done with case statement. input values translated into single case input value ('key'). This gives bitwise translation from input bits keypad port case statement. case statement creates output result keynum. This method example represent hardware bits software format. AN1803 MOTOROLA More Information This Product, www.freescale.com Freescale Semiconductor, Inc. Application Note Main Program Loop main program provides loop repeat number inputs. This module sequence module calls which repeated. Generally, global variables have been used which modified module calls. set_registers call prepares registers input. wait_key call will delay program until pressed. scan_key call scans each column four associated rows determine data value active column row. key_decode call inputs values active column active into decryption routine. This routine yields software value that independent hardware. software value available software application. main loop returned wait next key. main module could used interrupt-handling module interrupt format. press would call interrupt which would call this routine when acknowledged. Freescale Semiconductor, Inc. Program Enhancements Other Functions basic level programming example keypad port MMC2001 presented here, leaving room several enhancements alterations. Interrupt Format With interrupt format, processor permitted process independent keypad. When pressed, interrupt sent interrupt block handled according priority outstanding interrupts. After stroke handled, control returns processor. hooks exist current program conversion interrupt format. They are: First, polling method used here alert same signal that would sent interrupt block. This found wait section program could replaced interrupt call module. AN1803 More Information This Product, www.freescale.com MOTOROLA Application Note Program Enhancements Second, main module could converted into interrupt handling module receiving stroke input. Dual Detection Freescale Semiconductor, Inc. circuitry port module MMC2001 designed detect simultaneous presses. variable (which local variable get_row submodule) designed used test which checks second active (ar2). global variables would also have expanded handle second active column second active row. course, same decode submodule could called second time with second variables passed final meaning double stroke interpretation calling application. Different Keypad Size port module MMC2001 designed handle keypads size, maximum eight columns maximum eight rows. Additional columns would added checked zero value scan_key module. Additional rows would added tested zero value get_row module. this manner, adjustment combination columns rows implemented. AN1803 MOTOROLA More Information This Product, www.freescale.com Freescale Semiconductor, Inc. Application Note Program Listings KEY.C Listing KEY.C listing provides main keypad program. This part represents transportable code. other listings introduce specific hardware compiler structures. Freescale Semiconductor, Inc. This program M.CORE MMC2001 keypad entry. Program Name: key.c Written Glenn Jackson Date: 9/14/98 Description: Part registers Keypad input Part Enter delay wait keypad input Part Prepare registers next input Part Scan columns rows active Part Decode input Part Main Loop: Cycle from Part Part include section #include "key.h" Declare functions Subroutines Define addresses act_col; act_row; key_col; key_row; char keynum; Part registers Modules PART Registers <<<<<<<<<<>>>>>>>>>> void set_registers(void) KPCR 0x00; Column Open-Drain KPRE 0x0F; Active Scan Write Data Register KPDR.LCD_E KPDR[15] KPDR.LCD_RW KPDR[14] KPDR.LCD_RS KPDR[13] KPDR.bit12 KPDR[12] KPDR.col3 KPDR[11] KPDR.col2 KPDR[10] KPDR.col1 KPDR[9] KPDR.col0 KPDR[8] KPDR.bit7 KPDR[7] KPDR.bit6 KPDR[6] KPDR.bit5 KPDR[5] KPDR.bit4 KPDR[4] AN1803 More Information This Product, www.freescale.com MOTOROLA Application Note Program Listings KPDR.row3 KPDR.row2 KPDR.row1 KPDR.row0 KDDR KRDD KPKR KPSR KPSR KPDR[3] KPDR[2] KPDR[1] KPDR[0] <<<<- 0xFF; 0x70; 0x0F; 0x01; 0xFD; Cols outputs, Rows inputs Rows inputs, controls Clear KPKD bit, write KDIE Clear KRIE Freescale Semiconductor, Inc. Modules PART Wait <<<<<<<<<<>>>>>>>>>> void delay(void) time_pass; for(time_pass=0; time_pass<60000; time_pass++ continue; <<<<<<<<<<>>>>>>>>>>*/ void wait_key() first; Initial value KPKR delay(); delay align hardware with software first KPKR; Original value KPKR Check consistent KPKR value while(first KPKR) continue; return; wait_key Modules PART Register Preset void reg_set() Return columns KPDR.col3 KPDR[4] KPDR.col2 KPDR[5] KPDR.col1 KPDR[6] KPDR.col0 KPDR[7] KPKR 0x0F; Clear KPKD KPKR KPSR 0x01; Re-enable KDIE, press reg_set Modules PART Scan <<<<<<<<<<<>>>>>>>>>>>> get_row(void) Return active status Check rows AN1803 MOTOROLA More Information This Product, www.freescale.com Freescale Semiconductor, Inc. Application Note ar1; Active get_row module (KPDR.row0==0) return(ar1); (KPDR.row1==0) return(ar1); (KPDR.row2==0) return(ar1); (KPDR.row3==0) return(ar1); return(ar1); get_row <<<<<<<<<<>>>>>>>>>> Scan active void scan_key(int *acol, *arow) acol; arow; extern char KPCR; active_row; *acol unique here (for debug) *arow unique here (for debug) active_row Disable keypad interrupts KPSR 0x00; disable KRIE,KDIE Write Column data scan KPDR.col0 KPDR[8] KPDR.col1 KPDR[9] KPDR.col2 KPDR[10] KPDR.col3 KPDR[11] KDDR 0xFF; Columns Outputs KPCR 0x00; Columns totem-pole outputs, charge KPCR 0x0F; Columns [3:0] Open Drain Column-Row Scan Freescale Semiconductor, Inc. ***** COLUMN ***** Walk zero columns Zero Column Only KPDR.col0 KPDR[8] KPDR.col1 KPDR[9] AN1803 More Information This Product, www.freescale.com MOTOROLA Application Note Program Listings KPDR.col2 KPDR[10] KPDR.col3 KPDR[11] active_row get_row(); (active_row *acol *arow active_row '-1' alignment Column check (active_row==0) previous column Zero Column Only KPDR.col0 KPDR[8] KPDR.col1 KPDR[9] KPDR.col2 KPDR[10] KPDR.col3 KPDR[11] active_row get_row(); (active_row *acol *arow active_row '-1' alignment column check (active_row==0) previous column Zero Column Only KPDR.col0 KPDR[8] KPDR.col1 KPDR[9] KPDR.col2 KPDR[10] KPDR.col3 KPDR[11] active_row get_row(); (active_row *acol *arow active_row '-1' alignment column check (active_row==0) previous column Zero Column KPDR.col0 KPDR.col1 KPDR.col2 KPDR.col3 Only KPDR[8] KPDR[9] KPDR[10] KPDR[11] Freescale Semiconductor, Inc. active_row get_row(); (active_row *acol *arow active_row '-1' alignment column check default return no-key Scan_Key AN1803 MOTOROLA More Information This Product, www.freescale.com Freescale Semiconductor, Inc. Application Note Modules PART Column Decode <<<<<<<<<<>>>>>>>>>> char key_decode (int kcol, krow) *kcol Active keyed column *krow Active keyed extern char keynum; Returns decoded keystroke char key; (char)kcol; Enter Column Data into 'key' (key<<4); Shift Column data left character 'key' ((char)krow); data right character 'key' switch This decode specific keypad YMMV Your milage vary. case 0x00: keynum 'F'; break; case 0x01: keynum 'E'; break; case 0x02: keynum 'D'; break; case 0x03: keynum 'C'; break; case 0x10: keynum 'B'; break; case 0x11: keynum '9'; break; case 0x12: keynum '6'; break; case 0x13: keynum '3'; break; case 0x20: keynum '0'; break; case 0x21: keynum '8'; break; case 0x22: keynum '5'; break; case 0x23: keynum '2'; break; case 0x30: keynum 'A'; break; case 0x31: keynum '7'; break; case 0x32: keynum '4'; break; case 0x33: keynum '1'; break; default: keynum '*'; Switch return(keynum); key_decode modules Freescale Semiconductor, Inc. AN1803 More Information This Product, www.freescale.com MOTOROLA Application Note Program Listings <<<<<<<<<<>>>>>>>>>> void main(void) condition; extern char KPCR; for( condition=0; condition< 200; Start Run-Loop set_registers(); registers accept input wait_key(); wait input scan_key(&act_col, &act_row); col, reg_set(); registers next stroke decode column produce keynum key_decode( act_col, act_row); Return register wait next input. Run-Loop MAIN Freescale Semiconductor, Inc. Key.h listing key.h listing provides exact memory designations variables used key.c. Program Name: key.h Data assigned control lines MMC2001 GPIO/Keypad column[7-5] PORTB Data MMC2001 GPIO/INT PORTA Data Diab's setting ports #pragma section IOASECT far-absolute address=0x10003000 #pragma use_section IOASECT KPCR, KPRE, KPSR, KPKR, KDDR, KRDD order definition goes incrementally from 3000 bytes*/ char KPCR; byte KPCR Column Output char KPRE; byte KPCR Enable char KPSR; byte KPSR Interrupt enables char KPKR; byte KPSR Keypress control char KDDR; byte KDDR Column char KRDD; byte KDDR char KPDR; KPDR defined bits below #pragma section IOBSECT far-absolute address=0x10007002 #pragma use_section IOBSECT EMPTA, DDRA, EMPTAD, PORTA order definition goes incrementally from char EMPTA; char DDRA; char EMPTAD; char PORTA; Configure Data register typedef struct unsigned short unsigned short unsigned short unsigned short unsigned short unsigned short unsigned short unsigned short unsigned short unsigned short LCD_E LCD_RW LCD_RS bit12 col3 col2 col1 col0 bit7 bit6 AN1803 MOTOROLA More Information This Product, www.freescale.com Freescale Semiconductor, Inc. Application Note unsigned short unsigned short unsigned short unsigned short unsigned short unsigned short }REGISTER; bit5 bit4 row3 row2 row1 row0 #define KPDR_DEF (unsigned long) 0x10003006 PORTB data GPIO/INT #define KPDR (*(volatile REGISTER*) (KPDR_DEF+0)) Freescale Semiconductor, Inc. KEY.LNK Listing KEY.LNK listing specific Diab Data compiler. KEY.LNK allocates memory program RAM, ROM, stack. Program control variables also defined into memory KEY.LNK. Program File Name: key.lnk MEMORY rom: 0x30000000, 0x1000 ram: 0x30001000, 0x5900 stack: 0x30006900, 0x1000 SECTIONS first group contains code constant data GROUP First take code from objects libraries .text (TEXT) *(.text) *(.rodata) *(.init) *(.fini) *(.eini) (.+15) ~15; Next take small CONST data .sdata2 (TEXT) second group will allocate space initialized data (.data/.sdata) uninitialized data (.bss/.sbss) "ram" section. GROUP .data (DATA) .sdata contains small address data .sdata (DATA) This will allocate .bss symbols .sbss (BSS) .bss (BSS) .debug .debug_sfnames .debug_srcinfo .line AN1803 More Information This Product, www.freescale.com MOTOROLA Application Note Program Listings space left over will used heap >ram Definitions identifiers used key.c, key.h different crt0.s files. Their purpose control initialization memory allocation. _HEAP_START Used sbrk.c. Start memory used malloc() etc. _HEAP_END Used sbrk.c. heap memory _HEAP_END Used sbrk.c. heap memory _SP_INIT Used crt0.s. Initial address stack pointer _SP_END Used sbrk.c. Only used when stack probing _DATA_ROM Used init.c. Address initialized data _DATA_RAM Used init.c. Address initialized data _DATA_END Used init.c. allocated initialized data _BSS_START Used init.c. Start uninitialized data _BSS_END Used init.c. data cleared ADDR(.line) SIZEOF(.line); ADDR(stack)+SIZEOF(stack); ADDR(ram)+SIZEOF(ram); ADDR(stack); ADDR(.sdata2)+SIZEOF(.sdata2); ADDR(.data); ADDR(.sdata)+SIZEOF(.sdata); ADDR(.sbss); ADDR(.bss)+SIZEOF(.bss); Freescale Semiconductor, Inc. _HEAP_START _SP_INIT _HEAP_END _SP_END _DATA_ROM _DATA_RAM _DATA_END _BSS_START _BSS_END Some targets extra underscore front identifiers _HEAP_START _HEAP_START; _HEAP_END _HEAP_END; _SP_INIT _SP_INIT; _SP_END _SP_END; _DATA_ROM _DATA_ROM; _DATA_RAM _DATA_RAM; _DATA_END _DATA_END; _BSS_START _BSS_START; _BSS_END _BSS_END; AN1803 MOTOROLA More Information This Product, www.freescale.com Freescale Semiconductor, Inc. Application Note Freescale Semiconductor, Inc. Motorola reserves right make changes without further notice products herein. Motorola makes warranty, representation guarantee regarding suitability products particular purpose, does Motorola assume liability arising application product circuit, specifically disclaims liability, including without limitation consequential incidental damages. "Typical" parameters which provided Motorola data sheets and/or specifications vary different applications actual performance vary over time. operating parameters, including "Typicals" must validated each customer application customer's technical experts. Motorola does convey license under patent rights rights others. Motorola products designed, intended, authorized components systems intended surgical implant into body, other applications intended support sustain life, other application which failure Motorola product could create situation where personal injury death occur. Should Buyer purchase Motorola products such unintended unauthorized application, Buyer shall indemnify hold Motorola officers, employees, subsidiaries, affiliates, distributors harmless against claims, costs, damages, expenses, reasonable attorney fees arising directly indirectly, claim personal injury death associated with such unintended unauthorized use, even such claim alleges that Motorola negligent regarding design manufacture part. Motorola registered trademarks Motorola, Inc. Motorola, Inc. Equal Opportunity/Affirmative Action Employer. reach USA/EUROPE/Locations Listed: Motorola Literature Distribution; P.O. 5405, Denver, Colorado 80217. 1-303-675-2140 1-800-441-2447 JAPAN: Motorola Japan Ltd.; SPS, Technical Information Center, 3-20-1, Minami-Azabu, Minato-ku, Tokyo 106-8573 Japan. 81-3-3440-3569 ASIA/PACIFIC: Motorola Semiconductors H.K. Ltd.; Silicon Harbour Centre, King Street, Industrial Estate, N.T., Hong Kong. 852-26668334 Technical Information Center: 1-800-521-6274 HOME PAGE: Motorola, Inc., 2000 AN1803/D More Information This Product, www.freescale.com Other recent searchesTVP5150PBS - TVP5150PBS TVP5150PBS Datasheet PM75CLB060 - PM75CLB060 PM75CLB060 Datasheet LL2410 - LL2410 LL2410 Datasheet IE-789842-NS-EM1 - IE-789842-NS-EM1 IE-789842-NS-EM1 Datasheet Emulation - Emulation Emulation Datasheet Board - Board Board Datasheet HM62W8512BI - HM62W8512BI HM62W8512BI Datasheet CPT20230 - CPT20230 CPT20230 Datasheet 2938714 - 2938714 2938714 Datasheet
Privacy Policy | Disclaimer |