.INCLUDE "M32DEF.INC" .EQU KEY_PORT = PORTC .EQU KEY_PIN = PINC .EQU KEY_DDR = DDRC LDI R20,HIGH(RAMEND) OUT SPH,R20 LDI R20,LOW(RAMEND) OUT SPL,R20 LDI R21,0xFF OUT DDRD,R21 LDI R20,0xF0 OUT KEY_DDR,R20 GROUND_ALL_ROWS: LDI R20,0x0F OUT KEY_PORT,R20 WAIT_FOR_RELEASE: NOP IN R21,KEY_PIN ;Read Key Pins ANDI R21,0x0F ;Mask unused bits CPI R21,0x0F ;(equal if no key) BRNE WAIT_FOR_RELEASE ;Do again till keys released WAIT_FOR_KEY: NOP IN R21,KEY_PIN ;Read Key Pins ANDI R21,0x0F ;Mask unused bits CPI R21,0x0F ;(equal if no key) BREQ WAIT_FOR_KEY ;Do again till a key pressed CALL WAIT15MS ;Wait 15ms NOP IN R21,KEY_PIN ;Read Key Pins ANDI R21,0x0F ;Mask unused bits CPI R21,0x0F ;(equal if no key) BREQ WAIT_FOR_KEY ;Do again till a key pressed LDI R21,0b01111111 ;Ground row 0 OUT KEY_PORT,R21 ; NOP IN R21,KEY_PIN ;Read all columns ANDI R21,0x0F ;Mask unused bits CPI R21,0x0F ;(equal if no key) BRNE COL1 ;row 0, find the colum LDI R21,0b10111111 ;Ground row 1 OUT KEY_PORT,R21 NOP IN R21,KEY_PIN ;Read all columns ANDI R21,0x0F ;Mask unused bits CPI R21,0x0F ;(equal if no key) BRNE COL2 ;row 1, find the colum LDI R21,0b11011111 ;Ground row 2 OUT KEY_PORT,R21 NOP IN R21,KEY_PIN ;Read all columns ANDI R21,0x0F ;Mask unused bits CPI R21,0x0F ;(equal if no key) BRNE COL3 ;row 0, find the colum LDI R21,0b11101111 ;Ground row 3 OUT KEY_PORT,R21 NOP IN R21,KEY_PIN ;Read all columns ANDI R21,0x0F ;Mask unused bits CPI R21,0x0F ;(equal if no key) BRNE COL4 ;row 0, find the colum COL1: LDI R30,LOW(KCODE0<<1) LDI R31,HIGH(KCODE0<<1) RJMP FIND COL2: LDI R30,LOW(KCODE1<<1) LDI R31,HIGH(KCODE1<<1) RJMP FIND COL3: LDI R30,LOW(KCODE2<<1) LDI R31,HIGH(KCODE2<<1) RJMP FIND COL4: LDI R30,LOW(KCODE3<<1) LDI R31,HIGH(KCODE3<<1) RJMP FIND FIND: LSR R21 BRCC MATCH ;if Carry is low goto match LPM R20,Z+ ;INC Z RJMP FIND MATCH: LPM R20,Z OUT PORTD,R20 RJMP GROUND_ALL_ROWS WAIT15MS: RET .ORG 0x300 KCODE0: .DB '0','1','2','3' ;ROW 0 KCODE1: .DB '4','5','6','3' ;ROW 1 KCODE2: .DB '8','9','A','B' ;ROW 2 KCODE3: .DB 'C','D','E','F' ;ROW 3