;******************************************************************************** ; @module keypad4x4 ; @type driver ; @device 4x4 Matrix Keypad ; @details ; The LCD must be connected to a W65C22N Interface Chip: ; - IO.RB0-7 -> ; @requires KP_IO: Base Address of IO Chip ; @depends IO-W65C22N ;******************************************************************************** .ifndef INCLUDE_KEYPAD INCLUDE_KEYPAD = 1 .ifndef KP_IO .fatal "KP_IO is not defined: set it to the base address of the IO chip of the Keypad" .endif .zeropage _KP_COLUMN: .res 1 ; for storing stuff .bss ; reserve space or ringbuffer KP_BUF_SIZE = 10 RBUF_MEM_START: .res KP_BUF_SIZE RBUF_MEM_END = RBUF_MEM_START + KP_BUF_SIZE - 1 .define RBUF_NAME "keypad" .include "buffer.s65" .code .proc kp_init ; todo remove later and test lda #$ff sta KP_IO+IO::DDRB stz KP_IO+IO::RB ; INIT KEYPAD ; todo: use masks lda #%00001111; KP_IO+IO::RB 0-3 output sta KP_IO+IO::DDRB stz KP_IO+IO::RB ; KP_IO+IO::RB 4-7 1 so keypad press can be detected stz KP_IO+IO::ACR ; lda #%00010000 ; set CB1 to interrupt on pos. edge ; todo: use masks lda #IO::PCR::CB1_IP_AE sta KP_IO+IO::PCR jsr rb_keypad_init ; init keybuffer lda #(IO::IRQ::IRQ | IO::IRQ::CB1) ; enable interrupt for CB1 on KP_IO sta KP_IO+IO::IER rts .endproc ;******************************************************************************** ; @function Read which key is pressed on the keypad ; @details ; Checks which key is pressed and stores it in the keybuffer ; The value stored in the keybuffer is the offset which must be added to ; kp_VALUES to retrieve the key that was pressed ;******************************************************************************** .proc kp_read_on_irq ; test each "row" and check which column is 1 ; todo dont check every column if the value has been found lda #%00001110 ldx #$00 jsr @kp_read_column lda #%00001101 ldx #$08 jsr @kp_read_column lda #%00001011 ldx #$04 jsr @kp_read_column lda #%00000111 ldx #$0c jsr @kp_read_column stz KP_IO+IO::RB ; todo why all zero? rts @kp_read_column: sta KP_IO+IO::RB lda KP_IO+IO::RB sta _KP_COLUMN ; store result in zeropage so that bbr can be used bbr4 _KP_COLUMN,@kp_write inx bbr5 _KP_COLUMN,@kp_write inx bbr6 _KP_COLUMN,@kp_write inx bbr7 _KP_COLUMN,@kp_write rts @kp_write: lda _KP_VALUES,x jsr rb_keypad_write rts .endproc .rodata _KP_VALUES: ; TODO change to literal .byte "123A", "456B", "789C", "*0#D" .endif