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

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
07/21/06 21:12
Read: times


 
#120817 - Problem with switches.
The code is supposed to monitor port1 for changes and if the same happens, corresponding port0 pin is to be complemented. eg. Consider switches connected to port1 and leds to port0, initially all LEDs are switched on(inversion logic) p1.0 is pressed, p0.0 is switched off and if p1.0 is pressed again, p0.0 is switched on.

But i'm having problems with it, if button is pressed the LED flickers until it's released and the button has to be pressed for more than 5secons to change it's state. sometimes it doesn't even change the state.




              FLAG   equ   20h	;temporary storage of p1 values(switch array values)


org 0000h

     ljmp sa_main

org 0030h

;------------------------------20ms delay----------------------------------

delay_20ms:         push 00
                    push 01
                    mov r0,#36
delay_20ms_loop1:   mov r1,#255
delay_20ms_loop2:   djnz r1,delay_20ms_loop2
                    djnz r0,delay_20ms_loop1 
                    pop 01
                    pop 00
                    ret
;------------------------------main code------------------------------------

sa_main:         mov p0,#00h             ;output port/devices
                 mov p1,#0ffh             ;input port/switches   
                 mov FLAG,#0ffh		 ;device status reset
                 mov sp,#64h
                 mov IE,#00h										               

sa_main1:        mov p1,#0ffh                    
                 mov a,p1
                 cjne a,#0ffh,sa_main1 		 ;check if all keys are released initially

sa_loop:		 acall delay_20ms
                 mov a,p1
                 cjne a,#0ffh,debounce         ;if key pressed, check debounce
                 sjmp sa_loop
				 
debounce:   	 acall delay_20ms
                 mov a,p1
                 cjne a,#0ffh,sa_check         ;if key pressed, check switches
                 sjmp sa_loop     

sa_check:        jnb acc.0, flg0	  ;check if p1.0 is grounded
                 jnb acc.1, flg1	  ;check if p1.1 is grounded
                 jnb acc.2, flg2	  ;check if p1.2 is grounded
                 jnb acc.3, flg3	  ;check if p1.3 is grounded
                 jnb acc.4, flg4	  ;check if p1.4 is grounded
                 jnb acc.5, flg5	  ;check if p1.5 is grounded
                 jnb acc.6, flg6	  ;check if p1.6 is grounded
                 jnb acc.7, flg7	  ;check if p1.7 is grounded							
                 
flg0:           cpl FLAG.0			  ;if p1.0 is pulled low,compliment FLAG.0
                  sjmp sa_on
flg1:           cpl FLAG.1			  ;if p1.1 is pulled low,compliment FLAG.1
                  sjmp sa_on
flg2:           cpl FLAG.2			  ;if p1.2 is pulled low,compliment FLAG.2
                  sjmp sa_on
flg3:           cpl FLAG.3			  ;if p1.3 is pulled low,compliment FLAG.3
                  sjmp sa_on
flg4:           cpl FLAG.4			  ;if p1.4 is pulled low,compliment FLAG.4
                  sjmp sa_on
flg5:           cpl FLAG.5			  ;if p1.5 is pulled low,compliment FLAG.5
                  sjmp sa_on
flg6:           cpl FLAG.6			  ;if p1.6 is pulled low,compliment FLAG.6
                  sjmp sa_on
flg7:           cpl FLAG.7

sa_on:          mov p0,FLAG			  ;FLAG holds temporary status of p1, move the temporaryly stored status to p0
                  sjmp sa_loop


end



List of 9 messages in thread
TopicAuthorDate
Problem with switches.            01/01/70 00:00      
   well, what is FLAG            01/01/70 00:00      
      simple logic            01/01/70 00:00      
         what is the difference            01/01/70 00:00      
            It is application specific            01/01/70 00:00      
   Good at checking if key IS pressed/            01/01/70 00:00      
   Schmidt triggers            01/01/70 00:00      
      you are very kind            01/01/70 00:00      
   change detect needed            01/01/70 00:00      

Back to Subject List