السلام عليكم و رحمة الله و بركته 
اولا اشكر جميع المهندسين في هذا السرح العظيم على كل الجهود التي يقدمونها لخدمة الاعضاء
كما هو موضح في العنوان اريد عمل télérupteur  اي اني اريد التحكم في مصباح واحد عن طريق عدة ازرار بحيث كلما اضغط زر ينطفيئ اذا كان مشتعل و يشتعل اذا كان منطفيئ
الادوات المستعملة 
pic16f84a
mikroc
 
ارجو ان تكون الصورة واضحة 
كما اني اتمنى ان تكون مساعدة حتى لو كانت تلميحا او تمهيد لاكمال البرنامج
للعلم لديا سورس بالاسمبلي لكيني لم افهمه جيدا
ملف 
protues+HEX
http://www.mediafire.com/download/r3...3e/Desktop.rar
وشكرا مسبقا
	كود:
	; "Télérupteur"
; Fabrice Sincère (C) novembre 2006
; version 1.03
; microcontrôleur PIC 16F84A
; développé avec Microchip MPLAB IDE
    List p=16F84A    ; processeur utilisé 
    #include <p16F84A.inc>
    __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
        ;bits de configuration :
        ;code protect OFF
        ;watchdog timer OFF
        ;power up timer ON
        ;oscillateur HS (quartz à grande fréquence : 20 MHz)
;xxxxxx
; macro
;xxxxxx
bank1    macro        ; passage en banque 1
        bsf STATUS,RP0 
        endm
bank0    macro        ; passage en banque 0
        bcf STATUS,RP0
        endm
;xxxxxxxxxxxxxxxxxxxxxxxxx
; déclaration de variables
;xxxxxxxxxxxxxxxxxxxxxxxxx
    CBLOCK H'00C'    ; début de la zone des registres d'usage général
    mem0 : 1        ; mémorisation de l'état du port B (état antérieur)            
    mem1 : 1        ; mémorisation de l'état du port B (état actuel)
    detection : 1   ; détection d'un front descendant (bouton poussoir appuyé)
    compteur1 : 1    ; variable de le boucle de temporisation
    compteur2 : 1    ; variable de le boucle de temporisation
    compteur3 : 1    ; variable de le boucle de temporisation 
    ENDC
;xxxxxxxxxxxxxxxxxxxx
; demarrage sur reset
;xxxxxxxxxxxxxxxxxxxx
    org H'0000'
    goto initialisation
;xxxxxxxxxxxxxxx
; initialisation
;xxxxxxxxxxxxxxx
initialisation 
    bank0    
    clrf PORTA      ; mise à 0 des sorties du port A
    clrf PORTB         ; mise à 0 des sorties du port B
    
    bank1
    movlw B'00000000'
    movwf OPTION_REG
    ; bit 7 = 0 : activation des résistances de pull-up du port B
    ; (cela permet de faire l'économie de 8 résistances externes)
    ; bits 0 à 6 : ici, options non utilisées (on les met à 0, par exemple)
    movlw B'00011110'
    movwf TRISA
    ; bit 0 du port A (RA0) = 0 : configuration en sortie (commande du relais).
    ; bits 1 à 4 du port A (RA1 à RA4) = 1 : non utilisées
    ; (configuration en entrées, par exemple)
    movlw B'11111111'
    movwf TRISB
    ; bit 0 du port B (RB0) = 1 : configuration en entrée (bouton poussoir 0)
    ; bit 1 du port B (RB1) = 1 : configuration en entrée (bouton poussoir 1)
    ; bit 2 du port B (RB2) = 1 : configuration en entrée (bouton poussoir 2)
    ; bit 3 du port B (RB3) = 1 : configuration en entrée (bouton poussoir 3)
    ; bit 4 du port B (RB4) = 1 : configuration en entrée (bouton poussoir 4)
    ; bit 5 du port B (RB5) = 1 : configuration en entrée (bouton poussoir 5)
    ; bit 6 du port B (RB6) = 1 : configuration en entrée (bouton poussoir 6)
    ; bit 7 du port B (RB7) = 1 : configuration en entrée (bouton poussoir 7)
    bank0
    movlw B'00000000'
    movwf PORTA            ; sortie RA0 au niveau bas
    movlw B'11111111'
    movwf mem1            ; initialisation mem1 
;xxxxxxxxxxxxxxxxxxxxx
; programme principal
;xxxxxxxxxxxxxxxxxxxxx
debut_programme
    movf mem1, W
    movwf mem0            ; copie de (mem1) dans (mem0)
    movf PORTB, W          ; lecture du port B
    movwf mem1           ; mémorisation
    ; test de l'état du port B :
    movf mem1, W 
    subwf mem0, W        ; comparaison de (mem0) et (mem1)
    btfsc STATUS,Z        ; test du bit Z
    goto debut_programme; Z=1 : (mem1) est égale à (mem0) : l'état des boutons poussoirs est inchangé             
    
    ; Z=0 : (mem1) est différent de (mem0):
    comf mem1 , W       ; complément logique de (mem1)
    andwf mem0, W        ; et logique
    movwf detection       ; (detection) = (mem0) et (non(mem1))
    ; (detection) égal à H'00' : aucun bouton poussoir n'a été appuyé
    ; (detection) différent de H'00' : au moins un bouton poussoir a été appuyé
    
    movf detection, f   ; on test si (detection) est nul
    btfsc STATUS, Z      ; test du bit Z
    goto temporisation  ; Z=1 : (detection) est nul
    ; Z=0 : (detection) différent de H'00' :
    comf PORTA, f        ; inversion de l'état de la sortie RA0
    goto temporisation
; xxx temporisation d'environ 400 ms
;(2 millions de cycles avec un quartz de 20 MHz)
; résout le problème des rebonds des boutons poussoirs
temporisation    
                
    
    movlw H'00'            ; initialisation des compteurs
    movwf compteur1
    movwf compteur2    
    movlw H'0A'            ; pour un quartz 20 MHz 
                        ; movlw H'02' pour un quartz 4 MHz            
    movwf compteur3
debut1                    ; 3 boucles imbriquées (256*256*10 boucles *3 cycles)
    decfsz compteur1, f    ; décrémente (compteur1) et compare avec 0
    goto debut1          ; (compteur1) différent de 0
    ;(compteur1) égal à 0 :        
    decfsz compteur2, f    ; décrémente (compteur2) et compare avec 0
    goto debut1
    decfsz compteur3, f    ; décrémente (compteur3) et compare avec 0    
    goto debut1    
; xxx fin de le temporisation
    goto debut_programme
    END