Hi to All Pic Engineers. I am using two 4 bit encoder connected to portb. I am trying to add switch diagnostic mode just to make sure that encoders are working ok. I am using table to subtract if resolute is 0 that is good much. if resolute is 1 checking status,c bit then it is an error. the problem is that when the switch is ok it works ok but when the switch is bad still indicates it is ok. I realized that I should not load portb in w register. my next problem is that how can i do this with higher neebles. what do you think about this method. Andre Abelian thank you for your help. LIST P=16C62A #INCLUDE C:\MPLAB\P16C62A.INC ;------------------------- EQUATIONS ---------------------- RB0 EQU 0 RB1 EQU 1 RB2 EQU 2 RB3 EQU 3 RB7 EQU 7 SWITCHES EQU 0X10 COUNT1 EQU 0X01 COUNT2 EQU 0X11 SENDREG EQU 0X0C A9 EQU 0X0F COUNT EQU 0X0D BIT_COUNT EQU 0XEH ;------------------------------------------------------------ ORG 0X000 ; ORIGIN ;------------------------------------------------------------ CLRF PORTA ; CLEAR PORTA CLRF PORTB ; CLEAR PORTB CLRF PORTC ; CLEAR PORTC BSF STATUS,RP0 ; SWITCH TO BANK 1 MOVLW B'00000100' ; EXSEPT RA3 ALL OUTPUT MOVWF PORTA ; DO IT MOVLW B'11111111' ; INPUTS MOVWF PORTB ; MAKE PORTB INPUT FOR SWITCHES MOVLW B'00000011' ; EXSEPT RC0 AND RC1 ALL OUTPUT MOVWF PORTC ; DO IT BCF STATUS,RP0 ; SWITCH BACK TO BANK 0 CLRF PORTA ; CLEAR PORTA CLRF PORTB ; CLEAR PORTB CLRF PORTC ; CLEAR PORTC ;------------------------------------------------------------ MOVLW .10 ; LOAD DECIMAL 10 IN W MOVWF BIT_COUNT ; SAVE IT THERE ;------------------- DIAGNOSTIC MODE ----------------------- START CLRW ; CLEAR W REGITER MOVF PORTB,W ; LOAD PORTB MOVWF SWITCHES ; SAVE IT THERE CALL SW1 ; CALL SWITCH TABLE SUBWF SWITCHES,W ; SUBTRACK TABLE FROM W BTFSS STATUS,C ; SKIP IF RESOLT IS 0 GOTO BAD ; IF 1 THEN "ERROR" JUMP BCF PORTA,0 ; MAKE RED LED LOW GOTO START ; JUMP TO START OVER BAD BCF PORTA,1 ; TURN OFF GREEN LED BSF PORTA,0 ; TURN ON RED ERROR LED NOTYET DECFSZ BIT_COUNT,F ; COUNT DOWN FOR 10 GOTO NOTYET ; IF NOT BCF PORTA,0 ; TURN OFF RED LED BSF PORTA,1 ; TURN BACK GREEN LED GOTO START ; JUMP TO START ;--------------------- SWITCH1 TABLE ------------------------ SW1 ADDWF PCL,F ; ADD OFFSET TO PCLATH RETLW B'00000000' ; '0' RETLW B'00000001' ; '1' RETLW B'00000010' ; '2' RETLW B'00000011' ; '3' RETLW B'00000100' ; '4' RETLW B'00000101' ; '5' SWITCH 1 RETLW B'00000110' ; '6' RETLW B'00000111' ; '7' RETLW B'00001000' ; '8' RETLW B'00001001' ; '9' RETLW B'00001010' ; 'A' RETLW B'00001011' ; 'B' RETLW B'00001100' ; 'C' RETLW B'00001101' ; 'D' RETLW B'00001110' ; 'E' RETLW B'00001111' ; 'F' ;------------------- DELAY SUBROUTINE ----------------------- DELAY MOVLW .200 ; LOAD DECIMAL 200 TO COUNT MOVWF COUNT1 ; SAVE IT THERE D1 MOVLW .200 ; LOAD AN OTHER 200 MOVWF COUNT2 ; SAVE IT THERE D2 DECFSZ COUNT2,F ; DECRIMENT COUNT2 GOTO D2 ; IF NOT JUMP DECFSZ COUNT1,F ; DECRIMENT COUNT1 GOTO D1 ; IF NOT JUMP RETURN END