di3149.txt ;************************************************************************ ; ; LISTING 1 - PROGRAM TO READ SIX KEYS AND DISPLAY RESULTS ON SIX LEDs ; ; "Key-reading circuit saves I/O pins," EDN, March 6, 2003, pg 117. ; ;************************************************************************ ; Botones.asm ; This program reads 6 keys and shows their value on six leds. ; v1r0 220802 for D.I. ; Assembler: CASM08W from P&E Microcomputers Systems ; Target: HC908JK3 ;************************************************************************ ;************************************************************************ ; EQUS ;************************************************************************ PTA EQU $0000 ; Ports and data direction PTB EQU $0001 PTD EQU $0003 DDRA EQU $0004 DDRB EQU $0005 DDRD EQU $0007 CONFIG1 EQU $001F ; System configuration register CONFIG2 EQU $001E ; System configuration register ;equs PORT D: k1 equ 2 k2 equ 3 k3 equ 4 ;alias PORT D: PKey equ PTD ;alias DATA DIRECTION PORT D: DPKey equ DDRD ;Keys values Key12 equ 1 Key13 equ 2 Key21 equ 3 Key23 equ 4 Key31 equ 5 Key32 equ 6 FlashBegin equ $EC00 RamBegin equ $0080 ;Reseva de variables ORG RamBegin RamBeg equ $ KeyVal rmb 1 ;key value Last_Var equ $ ORG FlashBegin ;************************************************************************ ; RESET ;************************************************************************ Reset equ $ jsr Init_Hard ;init ports jsr Init_Soft ;init soft cli ;************************************************************************ ; MAIN PROGRAM ;************************************************************************ Main equ $ jsr ReadKeyPad ;read keys tsta beq Main ;no key pressed sta PTB ;view KeyVal - just for debug jmp Main ReadKeyPad equ $ clr KeyVal bset k1,DPKey ;k1 output bclr k2,DPKey ;k2 input bclr k3,DPKey ;k3 input bset k1,PKey ;k1 = 1 brclr k2,PKey,NOK12 ;k2 pressed ? brset k2,PKey,* ;yes, wait for unpressed lda #Key12 ;accA = Key12 bra ENDRKP ;return NOK12 brclr k3,PKey,NOK13 ;k3, pressed ? brset k3,PKey,* ;yes, wait for unpressed lda #Key13 ;accA = Key13 bra ENDRKP ;return NOK13 bclr k1,DPKey ;k1 input bset k2,DPKey ;k2 output bclr k3,DPKey ;k3 input bset k2,PKey ;k2 = 1 brclr k1,PKey,NOK21 ;k1 pressed ? brset k1,PKey,* ;yes, wait for unpressed lda #Key21 ;accA = Key21 bra ENDRKP ;return NOK21 brclr k3,PKey,NOK23 ;k3, pressed ? brset k3,PKey,* ;yes, wait for unpressed lda #Key23 ;accA = Key23 bra ENDRKP ;return NOK23 bclr k1,DPKey ;k1 input bclr k2,DPKey ;k2 input bset k3,DPKey ;k3 output bset k3,PKey ;k3 = 1 brclr k1,PKey,NOK31 ;k1 pressed ? brset k1,PKey,* ;yes, wait for unpressed lda #Key31 ;accA = Key31 bra ENDRKP ;return NOK31 brclr k2,PKey,NOK32 ;k2, pressed ? brset k2,PKey,* ;yes, wait for unpressed lda #Key32 ;accA = Key32 bra ENDRKP ;return NOK32 equ $ ENDRKP rts Init_Hard equ $ ;1 -> output / 0 -> input lda #%11111111 ;as output sta DDRA lda #%11111111 ;as output sta DDRB sta PTB lda #%11100011 ; k1,k2,k3 as imputs sta DDRD rts Init_Soft equ $ lda #%00000001 sta CONFIG1 ;cop disabled rts not_used rti ;************************************************************************ ; VECTORS ;************************************************************************ org $FFDE fdb not_used ;adc conversion complete fdb not_used ;keyboard org $FFF2 fdb not_used ;tim overflow fdb not_used ;tim channel 1 fdb not_used ;tim channel 0 fdb not_used ;not used fdb not_used ;irq fdb not_used ;swi fdb Reset