http://micropic.free.fr
Quelques astuces de programmation
Nous allons voir quelques astuces sur la programmation en assembleur :

  1. tester un bit d'un port
  2. mettre à 1 le bit d'un port
  3. mettre à 0 tous les bits d'un port
  4. une temporisation de 10µs ( avec un quart à 4 MHz )
  5. transferer un registre dans w ( w=fx )
  6. transferer w dans un registre ( fx=w )
  7. mettre une valeur immediate dans w ( w=8 )
  8. mettre une valeur immediate dans un registre ( fx=8 )
  9. complément à 1 de w
  10. complément à 2 de w ( w= - w)
  11. incrémenter w
  12. décrémenter w
  13. Echanger la valeur d'un registre avec celle de W sans utiliser un autre registre
  14. Comparer un registre avec une constante
  15. Savoir si la valeur de W est comprise dans un intervale de valeurs
  16. Comparer un registre avec plusieurs valeurs














  1. tester un bit d'un port :
    btfss PORTA,0 ( teste le bit 0 du port B et saute l'instruction suivante si le bit est à 1 )

  2. mettre à 1 le bit d'un port :
    bsf PORTB,2 ( met le bit 2 du port B à 1 )

  3. mettre à 0 tous les bits d'un port :
    CLRF PORTA

  4. une temporisation de 10µs ( avec un quart à 4 MHz ) :
    T10µsGOTO TL10
    TL10GOTO TL11
    TL11GOTO TL12
    TL12RETURN

  5. transferer un registre dans w ( w=fx ) :
    movf fx,w

  6. transferer w dans un registre ( fx=w ) :
    movwf fx

  7. mettre une valeur immediate dans w ( w=8 ) :
    molw 8

  8. mettre une valeur immediate dans un registre ( fx=8 ) :
    molw 8
    mowf fx

  9. complément à 1 de w :
    xorlw 0xff

  10. complément à 2 de w ( w= - w) :
    xorlw 0xff
    addlw 0x01

  11. incrémenter w :
    addlw 0x01

  12. décrémenter w :
    addlw 0xff

  13. Echanger la valeur d'un registre avec celle de W sans utiliser un autre registre
    xorwf reg,f
    xorwf reg,w
    xorwf reg,f

  14. Comparer un registre avec une constante :
    	movf   registre,w		; on place le registre dans W
    	xorlw  .60			; on compare à 60 
    	btfss  STATUS,Z			; egal ?
    	goto   non			; non , --> goto à la routine adéquate
    suite					; oui , on continue sur cette ligne
    

  15. Savoir si la valeur de W est comprise dans un intervale de valeurs
    (l'exemple suivant vérifie que W est compris entre $80 et $D0)
    	addlw  H'FF'-H'D0'		; valeur maxi=$D0
    	addlw  H'01'+H'D0'-H'80'	; valeur mini=$80
    	btfsc  STATUS, C
    	goto   oui			; w est compris entre $80 et $D0
    suite	 				; on continue ici si on n'est pas dans la limite

  16. Comparer un registre avec plusieurs valeurs
    movf registre,w         ; on met le registre a tester dans w
    xorlw 'A'               ; on compare a 'A'
    btfsc STATUS,Z          ; on teste
    goto  egala             ; si = on va a cette adresse
    xorlw 'A'^'B'           ; on compare a 'B'
    btfsc STATUS,Z          ; on teste
    goto  egalb             ; si = on va a cette adresse
    xorlw 'B'^'C'           ; on compare a 'C'
    btfsc STATUS,Z          ; on teste
    goto  egalc             ; si = on va a cette adresse
    xorlw 'C'^'D'           ; on compare a 'D'
    btfsc STATUS,Z          ; on teste
    goto  egald             ; si = on va a cette adresse
    xorlw 'D'^'E'           ; on compare a 'E'
    btfsc STATUS,Z          ; on teste
    goto  egale             ; si = on va a cette adresse
    goto  autre             ; sinon on va a cette adresse
    

© 1999-2004 Philippe Brégea