File "KEYLCD-D.ASM"

Full Path: /home/analogde/www/private/Projet/Example/HC11/KEYLCD-D.ASM
File size: 5.03 KB
MIME-type: text/plain
Charset: utf-8

**************************************************************************
* KEYLCD-D
*	Simple program to read the Axiom CMD11A8 keypad and echo the keys
*	to the LCD screen.
*
**************************************************************************
       OPT  l
       ORG $2000		* start code at 2000h
       JMP  MAIN		* jump over data to start of program

LCDBAS EQU  $B5F0		* LCD port address
KEYBAS EQU  $B5F4		* keypad port address
IO     EQU  $93			* Keypad port control register value
BUF1   RMB  1			* temporary storage data variables
BUF2   RMB  1
BUF3   RMB  1
BUF4   RMB  1
BUF5   RMB  1

TABLE  FCB  $31,$32,$33,$41	* keypad scan lookup table
       FCB  $34,$35,$36,$42
       FCB  $37,$38,$39,$43
       FCB  $2A,$30,$23,$44

* Start of program
MAIN   SEI			* Disable enable interrupts
       JSR  LCDSET            	* Setup LCD
       JSR  KEYSET            	* Setup Keypad

* Main Loop
M1     JSR  KEYIN             	* Get a character from the keypad
       JSR  LCDOUT            	* Display it on LCD
       JMP  M1                  * go wait for another key

* Keypad input subroutine
KEYIN  LDY  #KEYBAS		* get keypad port address
       CLR  BUF4              	* clear Counter
       LDAA #$10              	* start with First Row

LOP    CLR  $02,Y             	* Clear Scan lines
       LDAB $00,Y             	* Read Keypad
       ANDB #$F0		* mask all but data
       STAB BUF1              	* Save result

       STAA $02,Y             	* send row scan
       LDAB $00,Y             	* Read Keypad
       ANDB #$F0                * mask result
       CMPB BUF1              	* is there activity on this row?
       BNE  DONE		* branch if yes

       LSLA                   	* no key here, shift for next Row
       ANDA #$F0                * mask row counter for test
       BEQ  KEYIN             	* if all rows scanned, start over

       INC  BUF4		* incriment index counter
       INC  BUF4
       INC  BUF4
       INC  BUF4
       BRA  LOP			* go scann next row

* here if something is pressed, find the column
DONE   CLR  BUF3              	* clear column counter
       STAB BUF2		* save row data
LL     ANDB #$10              	* get row number
       LDA  BUF1		* get colum number
       ANDA #$10
       CBA                    	* match found?
       BNE  FOUND		* branch if yes
       INC  BUF3              	* Increment counter
       LSR  BUF1                * shift for next column
       LSR  BUF2		* shift for next row
       LDAB BUF2		* get row data
       BNE  LL                	* go check next
*
FOUND  CMPA BUF5		* same key as pressed last time?
       BEQ  DD			* branch if no
       STAA BUF5		* save key for debounce
       JMP  KEYIN		* go wait for another key

DD     LDD  #TABLE            	* Load look up table
       ADDB BUF3		* add column index
       ADDB BUF4		* add row index
       XGDY                     * prepare for table read
       LDAA 0,Y			* get the table data at this location

* now the key pressed data is in A
       CMPA #$2A              	* is key pressed '*' ?
       BNE  NEXT		* branch if not
       JSR  LCDSET		* yes, clear lcd screen
       JMP  KEYIN		* go wait for another key
NEXT   LDAB #$02		* delay count
TT     JSR  DELAY		* wait for lines to settle
       DECB			* next count
       BNE  TT			* wait some more
       RTS

* This version adjusts for 4x20 keypad row addressing if you're expecting
* continuous rows 1,2,3,4
LCDOUT
	ldab	LCDBAS		* get current address

	CMPB 	#$13		* at end of first row
	beq     lcd_ad1		* jif yes
	CMPB 	#$53		* at end of 2nd row
	beq     lcd_ad2		* jif yes
	CMPB 	#$27		* at end of 3rd row
	beq     lcd_ad3		* jif yes

	STAA	LCDBAS+1	* write data to lcd output port
	RTS

lcd_ad1
	ldab	#$28+#$80	* set correct address
	bra	lcd_fix		* continue fix
lcd_ad2
	ldab	#$14+#$80	* set correct address
	bra	lcd_fix		* continue fix
lcd_ad3
	ldab	#$54+#$80	* set correct address
lcd_fix
	STAA	LCDBAS+1	* write data to lcd output port
	JSR	DELAY
	STAB	LCDBAS		* make address fix
	RTS

* configure LCD screen
LCDSET LDAA  #$3C             	* set 4x20 Display
       STAA  LCDBAS
       JSR   DELAY
       LDAA  #$01             	* Clear display & Home cursor
       STAA  LCDBAS
       JSR   DELAY
       LDAA  #$0F             	* turn on Display
       STAA  LCDBAS
       JSR   DELAY
       LDAA  #$06             	* Cursor shift on
       STAA  LCDBAS
       LDAA  #$14             	* cursor Shift right
       STAA  LCDBAS
       LDAA  #$02             	* move Cursor to Home
       STAA  LCDBAS
       JSR   DELAY
       RTS

* delay loop
DELAY  PSHB 		* save registers
       PSHA
       LDAB  #$F0	* set loop count 1
DEL1   LDAA  #$F0	* set loop count 2
DEL2   DECA             * decriment counter 2
       BNE   DEL2       * branch if not 0
       DECB		* decriment counter 1
       BNE   DEL1	* branch if not 0
       PULA		* restore registers
       PULB
       RTS

* configure Keypad
KEYSET LDAA  #IO	* get configuration value
       STAA  KEYBAS+3	* set it
       RTS