Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
chart-export-handler
/
Projet
/
Example
/
HC12
/
BC32
:
key12b.asm
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
; ; KEY12B32.ASM ; --------- ; KEYPAD routines for Axiom HC12 development boards. ; ; Variables - calling program must reserve these: ; ----------- ; Global variables ; OLDKEY 1 byte, stores the previous key value for debouncing ; ; Local variables ; CNT1 1 byte, temporary debounce counter ; TMP1 1 byte, temporary storage variable ; ; Subroutines: ; ----------- ; INITKEY: Initialize KEYPAD ; GETKEY: Wait for key released then wait for key pressed. Return it in A ; KEYWAIT: Wait for key to be released ; KEYSCAN: Do a quick scan of the KEYPAD. Return A=key if pressed, 0 if not ; KEYDLY: Delay, wait for lines to settle ; Define Key Character Table _KEY_TBL: FCC 'A321B654C987D#0*' ;------- GETKEY: jsr KEYWAIT ; wait for any keys to be released GETKEY2: jsr KEYSCAN ; scan keypad for new key tsta ; key pressed? beq GETKEY2 ; loop if no rts ;------- ; loop until no key is pressed KEYWAIT: jsr KEYSCAN ; scan keypad tsta ; key pressed? bne KEYWAIT ; loop if yes ; Scan KEYPAD for input. return A=0 no input else A=key ; columns are active low, rows are then read active low KEYSCAN: bclr PORTS,#$0F0 ; clear all KEYPAD columns jsr KEYSCAN2 ; get KEYPAD row status beq KEYRESET ; branch if NO key pressed ;------- ; here if a key is pressed, determine which one KEYSCAN1: clrb ; clear row counter bclr PORTS,#$10 ; clear column 1 jsr KEYSCAN2 ; get KEYPAD row status bne KEYROW ; branch if a key pressed, find row ldab #$04 ; next row count bclr PORTS,#$20 ; clear column 2 jsr KEYSCAN2 ; get KEYPAD row status bne KEYROW ; branch if a key pressed, find row ldab #$08 ; next row count bclr PORTS,#$40 ; clear column 3 jsr KEYSCAN2 ; get KEYPAD row status bne KEYROW ; branch if a key pressed, find row ldab #$0C ; next row count bclr PORTS,#$80 ; clear column 4 jsr KEYSCAN2 ; get KEYPAD row status bne KEYROW ; branch if a key pressed, find row bra KEYRESET ; NO key pressed, reset KEYSCAN2: jsr KEYDLY ; wait for lines to settle ldaa PORTP ; get KEYPAD port bset PORTS,#$0F0 ; set all KEYPAD columns HIGH anda #$F0 ; key mask eora #$F0 ; test for any low rts ; here if a key is pressed, B=row count, A=row value KEYROW: clr TMP1 ; clear offset count KEYROW1: lsla ; shift row value to low nibble bcs KEYROW2 ; column found, go compute offset inc TMP1 ; incriment offset counter bra KEYROW1 ; loop KEYROW2: addb TMP1 ; add column offset to row value ldx #_KEY_TBL ; get start of key table ldaa B,X ; load offset key value in a ; key pressed in A, debounce cmpa OLDKEY ; same key pressed as last time? bne KEYNEW ; no, debounce new key ldab #$20 ; see if we already debounced this key cmpb CNT1 ; beq KEYNO ; branch if no KEYCOUNT: inc CNT1 ; incriment debounce counter ldab #$20 ; finished debouncing? cmpb CNT1 ; beq KEYYES ; branch if yes KEYNO: clra ; return no key pressed yet KEYYES: rts KEYNEW: clr CNT1 ; start new key debounce staa OLDKEY ; save new key for debouncing clra ; return no key pressed yet rts ;------- KEYRESET: bset PORTS,#$0F0 ; set all KEYPAD columns HIGH clr CNT1 ; clear debounce counter clr OLDKEY ; clear any old key clra ; return no key pressed yet rts ;------- KEYDLY: clr TMP1 ; clear offset count KEYDLY1: inc TMP1 ; incriment counter brclr TMP1,#$10,KEYDLY1 ; loop if time not yet up rts ;------- ; Initialize KEYPAD ; Port S 4-7 must be output ; Port P 4-7 must be input INITKEY: ldaa #$0F0 ; set Port S direction (0=input, 1=output) oraa DDRS ; Only modify keypad pins staa DDRS ; ldaa #$0F ; set port P direction anda DDRP ; only modify keypad pins staa DDRP ldaa PWCTL ; enable port P pull-ups oraa #$02 ; staa PWCTL ; rts