Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
08/28/06 06:02
Read: times


 
#123177 - WHOLE code
Responding to: ???'s previous message
>;_________________________________________________________________
;---------------KEY PAD SUBROUTINE STARTS HERE--------------------
;_________________________________________________________________

keypad_reset:
push acc
;------------------------------------------------------------------
mov p0,#0f0h                 ; all columns high n rows low
mov a,p0
anl a,#01110000b             ; consider only columns
cjne a,#01110000b,keypad_reset   ; initially check for all keys released
;------------------------------------------------------------------
pop acc
ret
;-------------------------------------------------------------------                      
keypad_ready:
push acc
;-------------------------------------------------------------------
keypad_ready1:
mov p0,#0f0h                 ; all columns high n rows low
mov a,p0
anl a,#01110000b             ; consider only columns
cjne a,#01110000b,keypad_ready1   ; initially check for all keys released
;-------------------------------------------------------------------                      
ks_loop1:
acall delay_16ms
mov a,p0
anl a,#01110000b             ; scan columns
cjne a,#01110000b,debounce   ; if key pressed, check debounce
sjmp ks_loop1                ; if not, keep checking for key pressed
;-------------------------------------------------------------------
debounce:
acall delay_16ms
mov a,p0
anl a,#01110000b 
cjne a,#01110000b,check_row
sjmp ks_loop1
;--------------------------------------------------------------------
check_row:
clr ROW3
setb ROW2
setb ROW1
setb ROW0

mov a,p0
anl a,#01110111b 			 ;test row zero
cjne a,#01110111b,row_3
;--------------------------------------------------------------------			
setb ROW3
clr ROW2
setb ROW1
setb ROW0
	
mov a,p0
anl a,#01111011b 			 ;test row one
cjne a,#01111011b,row_2
;--------------------------------------------------------------------
setb ROW3
setb ROW2
clr ROW1
setb ROW0
			
mov a,p0
anl a,#01111101b			 ;test row two
cjne a,#01111101b,row_1
;--------------------------------------------------------------------- 			
setb ROW3
setb ROW2
setb ROW1
clr ROW0
			
mov a,p0
anl a,#01111110b  		    ;test row three
cjne a,#01111110b,row_0
;----------------------------------------------------------------------
sjmp ks_loop1
;----------------------------------------------------------------------
row_0:
mov dptr,#disp_kcode0	   ;if row zero is press, point dptr to first digit of row zero 
sjmp find_num

row_1:
mov dptr,#disp_kcode1	   ;if row one is press, point dptr to first digit of row one
sjmp find_num

row_2:
mov dptr,#disp_kcode2	   ;if row two is press, point dptr to first digit of row two
sjmp find_num
			
row_3:
mov dptr,#disp_kcode3	   ;if row three is press, point dptr to first digit of row three
sjmp find_num
;----------------------------------------------------------------------
find_num:   rlc a
find_num1:  rlc a
jnc found_num             ;which column is pressed/grounded
inc dptr
sjmp find_num1
;----------------------------------------------------------------------
found_num:  clr a
movc a,@a+dptr
mov TEMP_DIGIT,a
pop ACC
ret
;-----------------------------------------------------------------------
disp_kcode0:DB' ','a','d' 
disp_kcode1:DB'g','j','m' 
disp_kcode2:DB'p','t','w'
disp_kcode3:DB'*','0','#' 
;-----------------------------------------------------------------------

;_________________________________________________________________
;----------------KEY PAD SUBROUTINE ENDS HERE---------------------
;_________________________________________________________________


;___________________________________________________________________________
;------------------------MKP subroutines start here-------------------------
;___________________________________________________________________________
 
;--------------------------------------------------
;setting no of taps(count) for different buttons starts here
;--------------------------------------------------

SET_COUNT:
PUSH ACC
PUSH 00H
MOV A,FIRST_DIGIT

COUNT4ONE:
CJNE A,#' ',COUNT4ZERO		
MOV COUNT,#10H				;10h => 16characters(' ' to '/')
SJMP SET_COUNT1

COUNT4ZERO:
CJNE A,#'0',COUNT4SEVEN
MOV COUNT,#11H				;11h => 17characters('0' to '@')
SJMP SET_COUNT1

COUNT4SEVEN:
CJNE A,#'7',COUNT4NINE
MOV COUNT,#04H			;04h => 4characters('p' to 's')
SJMP SET_COUNT1

COUNT4NINE:
CJNE A,#'9',COUNT4STAR
MOV COUNT,#04H			;04h => 4characters('w' to 'z')
SJMP SET_COUNT1

COUNT4STAR:
CJNE A,#'*',COUNT4HASH
MOV COUNT,#04H			;04h => 4characters('*' to '-')
SJMP SET_COUNT1

COUNT4HASH:
CJNE A,#'#',COUNT4REST
MOV COUNT,#04H			;04h => 4characters('#' to '&')
SJMP SET_COUNT1

COUNT4REST:
MOV COUNT,#03H			;03h => 3characters(for the rest of the buttons)

SET_COUNT1:
MOV TEMP_COUNT,COUNT
POP 00H
POP ACC
RET

;--------------------------------------------------
;setting no of taps(count) for different buttons ends here
;--------------------------------------------------			 

;--------------------------------------------------
;--scanning no of taps on same button starts here-- 
;--------------------------------------------------

SECOND_KEY_SCAN:
PUSH 00H
PUSH 01H
PUSH 02H
PUSH ACC

WAIT1:
MOV R0,#03H			    ; values of r0,r1 & r2 together provide a delay of 423ms
WAIT2:
MOV R1,#0FFH
WAIT3:
MOV R2,#0FFH

CONFIRM_KEY_PRESS:
MOV A,P0									  ; p0.0 t0 p0.3 => rows, p0.4 to 0.6 => columns
ANL A,#01110000b                          ; scan columns
cjne a,#01110000b,KEY_PRESS_CONFIRMED	  ; if key pressed within 423ms, come out of delay loop		                    
DJNZ R2,CONFIRM_KEY_PRESS
DJNZ R1,WAIT3
DJNZ R0,WAIT2

SJMP SECOND_KEY_SCAN1	                  ; if no key is pressed within 423ms, come out of key checking subroutine

KEY_PRESS_CONFIRMED:
ACALL KEYPAD_READY	                  ; this routine scans the keypad and puts the pressed button's value to TEMP_DIGIT
MOV A,TEMP_DIGIT		
CJNE A,FIRST_DIGIT,SECOND_KEY_SCAN1	  ; if currently pressed key's noy equal to previously pressed, come out of this routine
INC DIGIT                                 ; INCREMENTING DIGIT CONTENTS => NEXT CHARACTER OF CORRESPONDING KEY
DJNZ TEMP_COUNT,WAIT1						  ; decrement the loop around count and jmp back to checking key pressed

MOV  TEMP_COUNT,COUNT						  ; if loop around, reload the count
MOV DIGIT,FIRST_DIGIT						  ; if loop around, reload button's first value
SJMP WAIT1								  

SECOND_KEY_SCAN1:
POP ACC
POP 02H
POP 01H
POP 00H
RET
;--------------------------------------------------
;---scanning no of taps on same button ends here--- 
;--------------------------------------------------
;___________________________________________________________________________
;-------------------------MKP subroutines end here--------------------------
;___________________________________________________________________________

DISP_MOBILE_KPAD: DB " MOBILE  KEYPAD "
;--------------------------------------------------
;--------------------------------------------------
MKP_MAIN:
CLR RS
CLR EN
CLR RW
MOV SP,#65H
MOV IE,#00H
MOV P1,#00H           ; 4BIT LCD
MOV P0,#0FFH          ; INPUT PORT FOR KEYPAD INTERFACE
ACALL LCD4_INITIALISE	;4bit lcd initialisation

ACALL KEYPAD_RESET 	;make sure all keys are released on reset

MKP_MAIN0:
MOV R0,#10H		;bring cursor bck to line2
ACALL LINE2

MKP_MAIN1: 
ACALL KEYPAD_READY ; FINDS OUT THE KEY PRESSED AND PUTS THE FIRST CHARACTER OF CORRESPONDING KEY IN 'DIGIT'(31H) 
MOV FIRST_DIGIT,TEMP_DIGIT ;makes copies of pressed key into first_digit and temp_digit
MOV DIGIT,TEMP_DIGIT	;copies are used in second_key_scan
ACALL	SET_COUNT

MKP_MAIN2:
ACALL SECOND_KEY_SCAN
			  
MOV LCD_DATA,DIGIT      ;display pressed key on lcd
ACALL DATW

DJNZ R0,MKP_MAIN1	         

SJMP MKP_MAIN0
				  

END



List of 20 messages in thread
TopicAuthorDate
problem with delays            01/01/70 00:00      
   Omitted pull-ups at Port 0?            01/01/70 00:00      
      No, it's pulled high            01/01/70 00:00      
         You should see the connection...            01/01/70 00:00      
   could it be your approach?            01/01/70 00:00      
   p0 initialised as input port            01/01/70 00:00      
   post the WHOLE code            01/01/70 00:00      
   WHOLE code            01/01/70 00:00      
      Try this            01/01/70 00:00      
   WHOLE code            01/01/70 00:00      
      Assuming that the external pullups are not working            01/01/70 00:00      
         why is the delay not being excecuted?            01/01/70 00:00      
            HOW DO YOU KNOW            01/01/70 00:00      
               Through debugging            01/01/70 00:00      
                  I know nothing about keil debugger            01/01/70 00:00      
                     make code that resembles the flowchart and you wil            01/01/70 00:00      
      whole?            01/01/70 00:00      
         Ashwins stack handling is totally unsuited!            01/01/70 00:00      
      to generate tone of octave(8keys)with 89c51            01/01/70 00:00      
         sandy please start a new thread            01/01/70 00:00      

Back to Subject List