Vous êtes sur la page 1sur 12

16f84

; "Commande d'un afficheur 7 segments via RS232"


; 9600 bauds/s 8 bits de données Pas de bit de parité
; 1 bit de STOP Pas de contrôle de flux

; (C) Fabrice Sincère, mars 2007


; IUT Nancy-Brabois
; version 1.01
; 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 4 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 0x000C ; début de la zone des registres d'usage général du


16F84A

compteur_tempo52 : 1
compteur_tempo104 : 1
compteur_bit : 1
donnee : 1 ; 8 bits de données

ENDC

;xxxxxxxxxxxxxxxxxxxx
; démarrage sur reset
;xxxxxxxxxxxxxxxxxxxx

org 0x0000
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'00011111'
movwf TRISA
; bit 0 du port A (RA0) = 1 : configuration en entrée (RX)
; bits 1 à 4 du port A (RA1 à RA4) = 1 : configuration en entrée,
par exemple

movlw B'00000001'
movwf TRISB
; bit 0 du port B (RB0) = 1 : configuration en entrée, par exemple
; bit 1 du port B (RB1) = 0 : configuration en sortie (LED segment
g de l'afficheur)
; bit 2 du port B (RB2) = 0 : configuration en sortie (LED segment
f)
; bit 3 du port B (RB3) = 0 : configuration en sortie (LED segment
e)
; bit 4 du port B (RB4) = 0 : configuration en sortie (LED segment
d)
; bit 5 du port B (RB5) = 0 : configuration en sortie (LED segment
c)
; bit 6 du port B (RB6) = 0 : configuration en sortie (LED segment
b)
; bit 7 du port B (RB7) = 0 : configuration en sortie (LED segment
a)

bank0
movlw B'11111100'
movwf PORTB ; RB1 au niveau bas (le segment g est allumé)

clrf donnee
movlw D'9'
movwf compteur_bit
movlw D'9'
movwf compteur_tempo52
movlw D'17'
movwf compteur_tempo104
goto debut_programme

;xxxxxxxxxxxxxxxxxxxxx
; programme principal
;xxxxxxxxxxxxxxxxxxxxx

debut_programme

; on attend un front descendant sur RX (-> bit de START)


btfsc PORTA , 0
goto debut_programme ; RX = 1
; RX = 0
; on attend 1/2 période (1 période = 1/9600 = 104,17 µs)
call tempo52 ; tempo 52 µs

reception
; on attend 1 période (1 période = 1/9600 = 104,17 µs)
call tempo104 ; tempo 104 µs
decf compteur_bit , f
movf compteur_bit , f
btfsc STATUS , Z
goto affichage ; compteur_bit = 0
btfsc PORTA , 0
goto RX1 ; RX = 1
; RX = 0
bcf STATUS , C ; bit Carry mis à 0
rrf donnee , f ; décalage à droite
goto reception
RX1
bsf STATUS , C ; bit Carry mis à 1
rrf donnee , f ; décalage à droite
goto reception

; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
affichage

movlw '0' ; (code ASCII de 0 = 0x30 =


B'00110000')
subwf donnee,W
btfsc STATUS,Z
goto affiche0 ; donnee = '1'

movlw '1' ; (code ASCII de 1)


subwf donnee,W
btfsc STATUS,Z
goto affiche1 ; donnee = '1'

movlw '2' ; (code ASCII de 2)


subwf donnee,W
btfsc STATUS,Z
goto affiche2 ; donnee = '2'

movlw '3' ; (code ASCII de 3)


subwf donnee,W
btfsc STATUS,Z
goto affiche3 ; donnee = '3'

movlw '4' ; (code ASCII de 4)


subwf donnee,W
btfsc STATUS,Z
goto affiche4 ; donnee = '4'

movlw '5' ; (code ASCII de 5)


subwf donnee,W
btfsc STATUS,Z
goto affiche5 ; donnee = '5'

movlw '6' ; (code ASCII de 6)


subwf donnee,W
btfsc STATUS,Z
goto affiche6 ; donnee = '6'

movlw '7' ; (code ASCII de 7)


subwf donnee,W
btfsc STATUS,Z
goto affiche7 ; donnee = '7'

movlw '8' ; (code ASCII de 8)


subwf donnee,W
btfsc STATUS,Z
goto affiche8 ; donnee = '8'
movlw '9' ; (code ASCII de 9)
subwf donnee,W
btfsc STATUS,Z
goto affiche9 ; donnee = '9'

movlw ' ' ; (code ASCII de l'espace =


0x20)
subwf donnee,W
btfsc STATUS,Z
goto afficherien ; donnee = ' '

; autre caractère

movlw B'01111110'
movwf PORTB ; RB7 au niveau bas (le segment a est allumé)
goto finaffichage

affiche0
movlw B'00000010' ; on affiche '0'
movwf PORTB ; afficheur 7 segments
(abcdefg) = (0000001)
goto finaffichage

affiche1
movlw B'10011110' ; on affiche '1'
movwf PORTB ; afficheur 7 segments
(abcdefg) = (1001111)
goto finaffichage

affiche2
movlw B'00100100' ; on affiche '2'
movwf PORTB ; afficheur 7 segments
(abcdefg) = (0010010)
goto finaffichage

affiche3
movlw B'00001100' ; on affiche '3'
movwf PORTB ; afficheur 7 segments
(abcdefg) = (0000110)
goto finaffichage

affiche4
movlw B'10011000' ; on affiche '4'
movwf PORTB ; afficheur 7 segments
(abcdefg) = (1001100)
goto finaffichage

affiche5
movlw B'01001000' ; on affiche '5'
movwf PORTB ; afficheur 7 segments
(abcdefg) = (0100100)
goto finaffichage

affiche6
movlw B'11000000' ; on affiche '6'
movwf PORTB ; afficheur 7 segments
(abcdefg) = (1100000)
goto finaffichage

affiche7
movlw B'00011110' ; on affiche '7'
movwf PORTB ; afficheur 7 segments
(abcdefg) = (0001111)
goto finaffichage

affiche8
movlw B'00000000' ; on affiche '8'
movwf PORTB ; afficheur 7 segments
(abcdefg) = (0000000)
goto finaffichage

affiche9
movlw B'00011000' ; on affiche '9'
movwf PORTB ; afficheur 7 segments
(abcdefg) = (0001100)
goto finaffichage

afficherien
movlw B'11111110' ; on affiche ' '
movwf PORTB ; afficheur 7 segments
(abcdefg) = (1111111)
goto finaffichage

finaffichage
clrf donnee
movlw D'9'
movwf compteur_bit

goto debut_programme

; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; routine de temporisation de 52 µs (52 cycles avec un quartz 4 MHz)
tempo52

decf compteur_tempo52 , f
movf compteur_tempo52 , f
btfss STATUS , Z
goto tempo52 ; compteur_tempo52 <> 0
nop
nop
movlw D'9'
movwf compteur_tempo52
return

; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; routine de temporisation de 104 µs (104 cycles avec un quartz 4 MHz)
tempo104

decf compteur_tempo104 , f
movf compteur_tempo104 , f
btfss STATUS , Z
goto tempo104 ; compteur_tempo104 <> 0
movlw D'17'
movwf compteur_tempo104
nop
nop
nop
nop
return

END
16f628

; "Commande d'un afficheur 7 segments via RS232"


; Utilisation de l'USART du 16F628A avec interruption
; 9600 bauds/s 8 bits de données Pas de bit de parité
; 1 bit de STOP Pas de contrôle de flux

; (C) Fabrice Sincère, mars 2007


; IUT Nancy-Brabois
; version 1.01
; microcontrôleur PIC 16F628A
; développé avec Microchip MPLAB IDE

List p=16F628A ; processeur utilisé


#include <p16F628A.inc>

__config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF &
_DATA_CP_OFF & _BOREN_OFF & _MCLRE_ON
;bits de configuration :
;code protect OFF
;watchdog timer OFF
;power up timer ON
;oscillateur HS (quartz 4 MHz)
;low voltage program OFF
;data EE read protect OFF
;brown out detect OFF
;master clear enable ON

;xxxxxx
; macro
;xxxxxx

bank1 macro ; passage en banque 1


bsf STATUS,RP0
bcf STATUS,RP1
endm

bank0 macro ; passage en banque 0


bcf STATUS,RP0
bcf STATUS,RP1
endm

;xxxxxxxxxxxxxxxxxxxxxxxxx
; déclaration de variables
;xxxxxxxxxxxxxxxxxxxxxxxxx

CBLOCK H'020' ; début de la zone des registres d'usage


général du 16F628A
; banque 0

STATUS_TEMP : 1 ; sauvegarde du registre STATUS (routine


d'interruption)
W_TEMP : 1 ; sauvegarde du registre W
(routine d'interruption)
donnee : 1 ; 8 bits de données

ENDC

;xxxxxxxxxxxxxxxxxxxx
; démarrage sur reset
;xxxxxxxxxxxxxxxxxxxx
org 0x0000
goto initialisation

; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; Routine d'interruption
; 1 source d'interruption : réception (USART)
; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

org 0x0004 ; vecteur d'interruption

movwf W_TEMP
swapf STATUS,W
movwf STATUS_TEMP ; sauvegarde du registre W puis du
registre STATUS

bank1
btfss PIE1, RCIE
goto suite
bank0
btfsc PIR1, RCIF
goto reception
suite
goto restauration

reception
bank0
movf RCREG , W ; le flag RCIF est remis à 0 par une lecture du registre
RCREG
movwf donnee ; les 8 bits de données sont transféres dans un registre
d'usage général

; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; mise à jour afficheur 7 segments

movlw '0' ; (code ASCII de 0 = 0x30 =


B'00110000')
subwf donnee,W
btfsc STATUS,Z
goto affiche0 ; donnee = '1'

movlw '1' ; (code ASCII de 1)


subwf donnee,W
btfsc STATUS,Z
goto affiche1 ; donnee = '1'

movlw '2' ; (code ASCII de 2)


subwf donnee,W
btfsc STATUS,Z
goto affiche2 ; donnee = '2'

movlw '3' ; (code ASCII de 3)


subwf donnee,W
btfsc STATUS,Z
goto affiche3 ; donnee = '3'

movlw '4' ; (code ASCII de 4)


subwf donnee,W
btfsc STATUS,Z
goto affiche4 ; donnee = '4'
movlw '5' ; (code ASCII de 5)
subwf donnee,W
btfsc STATUS,Z
goto affiche5 ; donnee = '5'

movlw '6' ; (code ASCII de 6)


subwf donnee,W
btfsc STATUS,Z
goto affiche6 ; donnee = '6'

movlw '7' ; (code ASCII de 7)


subwf donnee,W
btfsc STATUS,Z
goto affiche7 ; donnee = '7'

movlw '8' ; (code ASCII de 8)


subwf donnee,W
btfsc STATUS,Z
goto affiche8 ; donnee = '8'

movlw '9' ; (code ASCII de 9)


subwf donnee,W
btfsc STATUS,Z
goto affiche9 ; donnee = '9'

movlw ' ' ; (code ASCII de l'espace =


0x20)
subwf donnee,W
btfsc STATUS,Z
goto afficherien ; donnee = ' '

; autre caractère

bsf PORTA,1
bsf PORTA,2
bsf PORTB,3
bsf PORTB,4
bsf PORTB,5
bsf PORTB,6
bcf PORTB,7
; le segment a est allumé
goto finaffichage

affiche0
bsf PORTA,1
bcf PORTA,2
bcf PORTB,3
bcf PORTB,4
bcf PORTB,5
bcf PORTB,6
bcf PORTB,7
; on affiche '0'
; afficheur 7 segments (abcdefg) = (0000001)
goto finaffichage

affiche1
bsf PORTA,1
bsf PORTA,2
bsf PORTB,3
bsf PORTB,4
bcf PORTB,5
bcf PORTB,6
bsf PORTB,7
; on affiche '1'
; afficheur 7 segments (abcdefg) = (1001111)
goto finaffichage

affiche2
bcf PORTA,1
bsf PORTA,2
bcf PORTB,3
bcf PORTB,4
bsf PORTB,5
bcf PORTB,6
bcf PORTB,7
; on affiche '2'
; afficheur 7 segments (abcdefg) = (0010010)
goto finaffichage

affiche3
bcf PORTA,1
bsf PORTA,2
bsf PORTB,3
bcf PORTB,4
bcf PORTB,5
bcf PORTB,6
bcf PORTB,7
; on affiche '3'
; afficheur 7 segments (abcdefg) = (0000110)
goto finaffichage

affiche4
bcf PORTA,1
bcf PORTA,2
bsf PORTB,3
bsf PORTB,4
bcf PORTB,5
bcf PORTB,6
bsf PORTB,7
; on affiche '4'
; afficheur 7 segments (abcdefg) = (1001100)
goto finaffichage

affiche5
bcf PORTA,1
bcf PORTA,2
bsf PORTB,3
bcf PORTB,4
bcf PORTB,5
bsf PORTB,6
bcf PORTB,7
; on affiche '5'
; afficheur 7 segments (abcdefg) = (0100100)
goto finaffichage

affiche6
bcf PORTA,1
bcf PORTA,2
bcf PORTB,3
bcf PORTB,4
bcf PORTB,5
bsf PORTB,6
bsf PORTB,7
; on affiche '6'
; afficheur 7 segments (abcdefg) = (1100000)
goto finaffichage

affiche7
bsf PORTA,1
bsf PORTA,2
bsf PORTB,3
bsf PORTB,4
bcf PORTB,5
bcf PORTB,6
bcf PORTB,7
; on affiche '7'
; afficheur 7 segments (abcdefg) = (0001111)
goto finaffichage

affiche8
bcf PORTA,1
bcf PORTA,2
bcf PORTB,3
bcf PORTB,4
bcf PORTB,5
bcf PORTB,6
bcf PORTB,7
; on affiche '8'
; afficheur 7 segments (abcdefg) = (0000000)
goto finaffichage

affiche9
bcf PORTA,1
bcf PORTA,2
bsf PORTB,3
bsf PORTB,4
bcf PORTB,5
bcf PORTB,6
bcf PORTB,7
; on affiche '9'
; afficheur 7 segments (abcdefg) = (0001100)
goto finaffichage

afficherien
bsf PORTA,1
bsf PORTA,2
bsf PORTB,3
bsf PORTB,4
bsf PORTB,5
bsf PORTB,6
bsf PORTB,7
; on affiche ' '
; afficheur 7 segments (abcdefg) = (1111111)
goto finaffichage

finaffichage

; xxxxxxxxxxxxxxxxxxxxxxxxxxx
; test d'une erreur d'overrun
bank0
btfss RCSTA , OERR
goto restauration
; traitement de l'erreur d'overrun
bcf RCSTA , CREN ; on efface le bit OERR
bsf RCSTA , CREN ; on relance la réception
goto restauration

restauration

swapf STATUS_TEMP,W ; restauration des registres STATUS


puis W
movwf STATUS
swapf W_TEMP,f
swapf W_TEMP,W

retfie

;xxxxxxxxxxxxxxx
; initialisation
;xxxxxxxxxxxxxxx

initialisation

bank0
clrf PORTA ; mise à 0 des sorties du port A
clrf PORTB ; mise à 0 des sorties du port B

movlw B'00000111'
movwf CMCON ; inactivation des comparateurs
analogiques

bank1
movlw B'11111001'
movwf TRISA
; bit 0 du port A (RA0) = 1 : configuration en entrée, par exemple
; bit 1 du port A (RA1) = 0 : configuration en sortie (LED segment
g de l'afficheur)
; bit 2 du port A (RA2) = 0 : configuration en sortie (LED segment
f)
; bits 3 à 7 du port A (RA3 à RA7) = 1 : configuration en entrée,
par exemple

movlw B'00000111'
movwf TRISB
; bit 0 du port B (RB0) = 1 : configuration en entrée, par exemple
; bit 1 du port B (RB0) = 1 : configuration en entrée (RX : USART)
; bit 2 du port B (RB0) = 1 : configuration en entrée (TX : USART)
; bit 3 du port B (RB3) = 0 : configuration en sortie (LED segment
e)
; bit 4 du port B (RB4) = 0 : configuration en sortie (LED segment
d)
; bit 5 du port B (RB5) = 0 : configuration en sortie (LED segment
c)
; bit 6 du port B (RB6) = 0 : configuration en sortie (LED segment
b)
; bit 7 du port B (RB7) = 0 : configuration en sortie (LED segment
a)

movlw D'25'
movwf SPBRG ; (SPBRG) = D'25'

movlw B'00000100'
movwf TXSTA
; bit 7 (CSRC) = 0 (non utilisé : 0 par exemple)
; bit 6 (TX9) = 0 (non utilisé : 0 par exemple)
; bit 5 (TXEN) = 0 (non utilisé : 0 par exemple)
; bit 4 (SYNC) = 0 : mode asynchrone
; bit 3 = 0 (non implémenté)
; bit 2 (BRGH) = 1 : mode asynchrone haute vitesse
; bit 1 (TRMT) = 0 (non utilisé : 0 par exemple)
; bit 0 (TX9D) = 0 (non utilisé : 0 par exemple)

bank0

movlw B'10010000'
movwf RCSTA
; bit 7 (SPEN) = 1 : utilisation du port série
; bit 6 (RX9) = 0 : 8 bits de réception
; bit 5 (SREN) = 0 (non utilisé : 0 par exemple)
; bit 4 (CREN) = 1 : autorise la réception
; bit 3 (ADEN) = 0 (non utilisé : 0 par exemple)
; bit 2 (FERR) = 0 (en lecture seule)
; bit 1 (OERR) = 0 (en lecture seule)
; bit 0 (RX9D) = 0 (non utilisé : 0 par exemple)

bcf PORTA,1 ; le segment g est allumé


bsf PORTA,2
bsf PORTB,3
bsf PORTB,4
bsf PORTB,5
bsf PORTB,6
bsf PORTB,7

clrf donnee

bank1
bsf PIE1 , RCIE ; autorisation de l'interruption de réception de
l'USART
bsf INTCON , PEIE ; autorisation des interruptions des périphériques
bsf INTCON, GIE ; autorisation globale des interruptions

bank0

goto debut_programme

;xxxxxxxxxxxxxxxxxxxxx
; programme principal
;xxxxxxxxxxxxxxxxxxxxx

debut_programme

goto debut_programme ; on attend l'interruption de réception


(USART)

END

Vous aimerez peut-être aussi