عامر خديجة
New Member
السلام عليكم
اتمنى ان يساعدكم هذا الموقع على البرمجة بلغة assembleur
اتمنى ان يساعدكم هذا الموقع على البرمجة بلغة assembleur
Vous allez pouvoir trouver sur cette page quelques programmes pour faire vos premiers pas avec les microcontrôleurs PIC.
a-Allumer une led
; programme qui permet d'allumer une LED
; sur la sortie PB3
#include <p16F84.inc> ; initialisation des noms de variables
ORG 0x00 ; début de programme
goto main ; saut au programme principal
main nop ; TRIS est le registre de direction des ports
bsf STATUS,5 ; banque 1 pour accéder au registre TRIS
movlw B'00000000' ; 0 = sortie
movwf TRISB ; le port b est entièrement en sortie
bcf STATUS,5 ; retour à la banque 0
bsf PORTB,0 ; met le bit 0 du port B à 1 (allume la LED)
end ; fin de programme
b-Faire clignoter une led
; programe qui permet de faire clignoter une LED
; sur le port B0
; sans utiliser les interruptions et le TIMER TMR0
#include <p16F84.inc>
compt_1 equ 0C
compt_2 equ 0D
compt_3 equ 0E
compt_4 equ 0F
ORG 0x00 ; processor reset vector
goto main
; * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; sous-programmes d'attente
;
; * * * * * * * * * * * * * * * * * * * * * * * * * *
wait: nop ; 1er temps d'attente
decfsz compt_1,1 ; environ 260 ms
goto wait
movlw 0xff
movwf compt_1
decfsz compt_2,1
goto wait
movlw 0xff
movwf compt_1
movlw 0xff
movwf compt_2
return
wait2: nop ; 2ème temps d'attente
decfsz compt_3,1 ; environ 200ms
goto wait2
movlw 0xAf
movwf compt_3
decfsz compt_4,1
goto wait2
movlw 0xAf
movwf compt_3
movlw 0xAf
movwf compt_4
return
; * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; Programme Principal
;
; * * * * * * * * * * * * * * * * * * * * * * * * * * *
main: nop
movlw 0xff ; initialisation des compteurs
movwf compt_1
movlw 0xff
movwf compt_2
movlw 0xAf
movwf compt_3
movlw 0xAf
movwf compt_4
banksel TRISB
clrf TRISB ; PORTB en sortie
banksel PORTB
movlw B'00000001' ; PORTB0 = 1
movwf PORTB
call wait ; temps d'attente (1)
movlw B'00000000' ; PORTB0 = 0
movwf PORTB
call wait ; temps d'attente (1)
movlw B'00000001' ; PORTB0 = 1
movwf PORTB
call wait ; temps d'attente (1)
movlw B'00000000' ; PORTB0 = 0
movwf PORTB
call wait2 ; temps d'attente (2)
movlw B'00000001' ; PORTB0 = 1
movwf PORTB
call wait ; temps d'attente (1)
movlw B'00000000' ; PORTB0 = 0
movwf PORTB
call wait2 ; temps d'attente (2)
goto main ; retour au début du programme
; (boucle sans fin)
END ; fin de programme
Warning[224] E:\PAGE_NOV2001\PIC\LED2.ASM 66 : Use of this instruction is not recommended.
c-Créer une interruption sur le PORT B pour déclencher le clignotement d'une led
programme autorisant une interuption sur le port B
; déclenchant le clignotement d'une LED
#include <p16F84.inc>
compt_1 equ 0C
compt_2 equ 0D
ORG 0x00 ; processor reset vector
goto main
inter org 0x04 ; interruption du port B
btfsc INTCON,0 ; test si l'interruption
; a été provoquée par PORTB
goto LED
goto fin
LED: movlw B'00000001' ; allume
movwf PORTB
call wait
movlw B'00000000' ; éteint
movwf PORTB
call wait
movlw B'00000001'
movwf PORTB
call wait
movlw B'00000000'
movwf PORTB
goto fin
fin: bcf INTCON,0 ; met à 0 le drapeau d'interruption PORT B
retfie
; programme principal
main: bcf STATUS,5 ; banque 0
clrf PORTB
bsf STATUS,5 ; banque 1
movlw B'00010000' ; met B4 en entrée
movwf TRISB
bcf STATUS,5 ; banque 0
bsf PORTB,1
call wait
clrf INTCON ; raz du registre d'interruption
bsf INTCON,3 ; autorise l'interruption du port B
bsf INTCON,7 ; autorise les interruptions
final: nop ; boucle sans fin d'attente des interruptions
goto final
wait: nop ; sous-programme de tempo
decfsz compt_1,1
goto wait
movlw 0xff
movwf compt_1
decfsz compt_2,1
goto wait
movlw 0xff
movwf compt_1
movlw 0xff
movwf compt_2
return
END
d-Utiliser le TIMER interne du PIC pour faire clignoter une led
; programme permettant de faire clignoter une LED
; toutes les secondes (983,04 ms précisément !)
#include <p16F84.inc> ; processor specific variable definitions
;**********************************************************************
sec equ 0xF
compt_1 equ 0F
;***********************************************************************************
ORG 0x00 ; processor reset vector
goto main ; go to beginning of program
;***********************************************************************************
; *********************************************************************
ORG 0x04 ; routine d'interruption
btfsc INTCON,2 ; test interr de TMR0 ?
goto temps ; si oui -> temps
goto fin
temps: decfsz compt_1,1 ; test si le cpt de tps égale 0
goto fintps ; si non goto fintps
movlw sec ; si oui recharge le cpt
movwf compt_1
comf PORTB,1 ; et inverse les bits du PORTB
fintps: bcf INTCON,2 ; RAZ du drapeau d'interruption TMR0
fin: retfie ; fin d'interruption
; * * * * * * * * * * * * * * * * * *
; Programme principal
; * * * * * * * * * * * * * * * * * *
main: bsf STATUS,5 ; banque 1
clrf TRISB ; portb en sortie
movlw B'11000111' ; mise à jour du registre OPTION
movwf OPTION_REG ; TIMER = 256µs*256 = 65,536ms
bcf STATUS,5 ; banque 0
clrf PORTB ; RAZ PORTB
movlw sec
movwf compt_1
bcf STATUS,0 ; RAZ de carry
bsf INTCON,5 ; autorise le débordement du TMR0
bsf INTCON,7 ; autorise toutes les interruptions
movlw B'00000001' ; envoi un 1 sur B0
movwf PORTB
;***********************************************************************************
boucle: nop ; boucle d'attente d'interruption
goto boucle
END
e- Commander un afficheur LCD 1*16 caract. en mode 4 bits
;*****************************************
; programme de gestion d'un afficheur LCD
; 1*16 caractères en mode 4 bits
; par microcontroleur PIC 16F84
;
; mai / 2002
;*****************************************
include "p16f84.inc"
en equ 0 ; ra0 = enable
rs equ 1 ; ra1 = RS
conf2 equ B'00001110' ; display ON/OFF
conf1a equ B'00110011' ; set interface
conf1b equ B'00110010' ; la 1ere instruction
;est executée 2 fois (mode 8 bits)
clear equ B'00000001' ; clear display
caract1 equ 0x80 ; ligne1 gauche
caract2 equ 0xC0 ; ligne1 droite
compt equ 0x0D
sauv equ 0x0F
org 0x000
nop
goto main
main org 0x100
banksel TRISB ; banc 1
movlw B'01110000'
movwf TRISB ; port B en sortie
movlw B'00111100'
movwf TRISA ; port A en entrée
banksel PORTA ; banc 0
call tempo
call tempo
call tempo
bcf PORTA,en
call init
movlw "b"
call envdata
movlw "o"
call envdata
movlw "n"
call envdata
movlw "j"
call envdata
movlw "o"
call envdata
movlw "u"
call envdata
movlw "r"
call envdata
movlw " "
call envdata
call droit
movlw "m"
call envdata
movlw "a"
call envdata
movlw "i"
call envdata
movlw " "
call envdata
movlw "2"
call envdata
movlw "0"
call envdata
movlw "0"
call envdata
movlw "2"
call envdata
clrf INTCON
fin nop
goto fin
tempo movlw 0xFF
movwf compt
bouct decf compt,1
nop
nop
btfss STATUS,2
goto bouct
return
envinit bsf PORTA,en
movwf sauv
swapf sauv,0 ; echange sauv
andlw 0x0F
movwf PORTB
call tempo
bcf PORTA,en
call tempo
bsf PORTA,en
movf sauv,0 ; echange sauv
andlw 0x0F
movwf PORTB
call tempo
bcf PORTA,en
call tempo
return
envdata movwf sauv
swapf sauv,0 ; echange sauv
andlw 0x0F
movwf PORTB
bsf PORTA,en
call tempo
bcf PORTA,en
call tempo
movf sauv,0 ; echange sauv
andlw 0x0F
movwf PORTB
bsf PORTA,en
call tempo
bcf PORTA,en
call tempo
return
init bcf PORTA,rs ; rs=0 => configuration
movlw conf1a
call envinit
movlw conf1b
call envinit
movlw conf2
call envinit
movlw clear
call envinit
movlw caract1 ; écriture
call envinit ; ligne 1 gauche
bsf PORTA,rs ; rs=1 => fin de config
return
gauch bcf PORTA,rs
movlw caract1 ; écriture
call envinit ; ligne 1 gauche
bsf PORTA,rs ; rs=1 => fin de config
return
droit bcf PORTA,rs
movlw caract2 ; écriture
call envinit ; ligne 1 droite
bsf PORTA,rs ; rs=1 => fin de config
return
cls bcf PORTA,rs
movlw clear
call envinit
bsf PORTA,rs
return
end
Message[302] E:\MONTAGES\PIC\LCD1.ASM 25 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] E:\MONTAGES\PIC\LCD1.ASM 27 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[305] E:\MONTAGES\PIC\LCD1.ASM 80 : Using default destination of 1 (file).
Message[302] E:\MONTAGES\PIC\LCD3.ASM 48 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] E:\MONTAGES\PIC\LCD3.ASM 50 : Register in operand not in bank 0. Ensure that bank bits are correct .
c'est bien d'utilisé ce lien pour debuter avec l'Assembleur