pic16f84

13
MICROCONTROLEUR ET PROGRAMATION COMPTE RENDU DU TP N°01 Gestion des afficheurs 7 segments Microcontrôleur : pic 16f84A Programmation : assembleur sur MPLAB Plan I. Affichage hexa d’une variable 8 bits sur 1 afficheur 7 segment II. Affichage hexa d’une variable 8 bits sur 2 afficheur 7 segment III. Affichage hexa d’une variable 8 bits sur 4 afficheur 7 segment IV. un compteur binaire Groupe : E.I.2.2.2

Upload: haithemo

Post on 13-Jun-2015

3.013 views

Category:

Documents


7 download

DESCRIPTION

exemples simple de programmation en assembleur

TRANSCRIPT

Page 1: pic16f84

MICROCONTROLEUR ET PROGRAMATION

COMPTE RENDU DU TP N°01

Gestion des afficheurs 7 segments

Microcontrôleur : pic 16f84A

Programmation : assembleur sur MPLAB

Plan

I. Affichage hexa d’une variable 8 bits sur 1 afficheur 7 segment

II. Affichage hexa d’une variable 8 bits sur 2 afficheur 7 segment

III. Affichage hexa d’une variable 8 bits sur 4 afficheur 7 segment

IV. un compteur binaire

Groupe : E.I.2.2.2

LOUSSIF MOUHAMED AMINE

YAZID HAITHEM

CHAWKI ZGUIDER

Page 2: pic16f84

I. Affichage hexa d’une variable 8 bits sur 1 afficheur 7 segment

Description Le code suivant permet d’incrémenter et d’afficher une variable hexadécimale de 8 bits sur un afficheur 7 segment.Un bouton poussoir liée au pin RB0 est programmé comme étant une interruption, l’appui sur ce bouton permet d’incrémenter cette variable.

NON

OUI

NON

OUI

Conversion Hex 7seg

Afficheur

RB0=0 ?

Compteur++

RB0=0

Déclarer une variable compteur

Compteur = 0

Page 3: pic16f84

Code assembleur

list p=16F84A ; list directive to define processor

#include <p16F84A.inc> ; processor specific variable definitions__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

var EQU 0X0Cc1 EQU 0X0Dc2 EQU 0X0Ec3 EQU 0X0Forg 00h

goto MAIN ; go to beginning of programhex_2_7seg

andlw 0x0F ;MSB DE W =0addwf PCL,f ;PCL=PCL+Wretlw B'01111110'retlw B'00001100'retlw B'10110110'retlw B'10011110'retlw B'11001100'retlw B'11011010'retlw B'11111010'retlw B'00001110'retlw B'11111110'retlw B'11011110'retlw B'11101110'retlw B'11111000'retlw B'01110010'retlw B'10111100'retlw B'11110010'retlw B'11100010'

tempo movlw 1movwf c1

r1 movlw 85movwf c2

r2 movlw 0xffmovwf c3

r3 decfsz c3

goto r3decfsz c2goto r2decfsz c1goto r1return

MAIN bsf STATUS,RP0bcf STATUS,RP1movlw 0x01movwf TRISBclrf TRISAbcf STATUS,RP0clrf var

debut;conversion et affichage du LSB

movfw varcall hex_2_7segbsf PORTA,0 ; RA0=1 AFF0 ONbcf PORTA,1; RA1= 0 AFF1 OFFmovwf PORTBcall tempo

;conversion et aff de MSBswapf var ; MSB<->LSBmovfw varswapf varcall hex_2_7segbcf PORTA,0 ; RA0=0 AFF0 OFFbsf PORTA,1 ; RA1=1 AFF1 ONmovwf PORTBcall tempobtfss PORTB,0goto debutincf vargoto debutEND ; directive 'end of

program'

Page 4: pic16f84

Montage sur ISIS

Page 5: pic16f84

II. Affichage hexa d’une variable 8 bits sur 2 afficheur 7 segment

Description

Le programme suivant permet d’incrémenter et d’afficher un variable hexadécimal de 8 bits sur deux afficheurs 7 segments (affichage multiplexé), les deux afficheurs sont a cathode commune tels que les deux cathodes sont liés l’un au pin RA0 et l’autre au pin RA1.Un bouton poussoir liée au pin RB0 est programmé comme étant une interruption, l’appui sur ce bouton permet d’incrémenter cette variable.

On suit l’organigramme suivant :

Code assembleur

Initialisation PORT (E/S)

Init(V1)

Convertir le LSB(V1)

Hex7seg

Activer Afficheur 0

Afficheur sur PORT B

Temporisation (25ms/s)

Convertir MSB(V1)

Hex7seg

Activer afficheur 1 Temporisateur

Page 6: pic16f84

list p=16F84A ; list directive to define processor

#include <p16F84A.inc> ; processor specific variable definitions

__CONFIG _CP_ON & _WDT_OFF & _PWRTE_ON & _RC_OSC

var EQU 0X0C ; 0x0C l'addresse du variable compteur

c1 EQU 0X0Dc2 EQU 0X0Ec3 EQU 0X0F ORG 0goto main

conversionandlw 0x0f ;(MSB de W )=0addwf PCL,f ; PCL=PCL+Wretlw B'01111110' ;code 0retlw B'00001100' ;code 1retlw B'10110110' ;code 2retlw B'10011110' ;code 3retlw B'11001100' ;code 4retlw B'11011010' ;code 5retlw B'11111010' ;code 6retlw B'00001110' ;code 7retlw B'11111110' ;code 8retlw B'11011110' ;code 9retlw B'11101110' ;code Aretlw B'11111000' ;code Bretlw B'01110010' ;code Cretlw B'10111100' ;code Dretlw B'11110010' ;code Eretlw B'11100010' ;code F

tempomovlw 1movwf c1

r1 movlw 85 ; 6*255*255 cyclesmovwf c2

r2 movlw 0xff ; 255*255 cyclesmovwf c3

r3 decfsz c3 ; 255 cyclesgoto r3

decfsz c2goto r2decfsz c1goto r1return

mainbsf STATUS,RP0 ; basculer vers bank1

clrf TRISB ; configuration du PORTB en sortie (Output)bsf TRISB,0 ; RB0 (input)clrf TRISA ; PORTA (output)bcf STATUS,RP0 ; basculer vers bank0clrf var ; var=0

retour;conversion et affichage du LSBmovfw varcall conversion

bsf PORTA,0 ;RA0=1 AFF0 ONbcf PORTA,1 ;RA1=0 AFF1 OFFmovwf PORTBcall tempo;conversion et affichage du MSBswapf var ; MSB <->LSBmovfw var ; w=varswapf var ; MSB <->LSBcall conversion

bcf PORTA,0 ;RA0=0 AFF0 OFFbsf PORTA,1 ;RA1=1 AFF1 ONmovwf PORTBcall tempobtfss PORTB,0goto retourincf vargoto retour

attente1btfss PORTB,0goto attente1

attente2btfsc PORTB,0goto attente2incf vargoto retour

END

Page 7: pic16f84

Montage sur ISIS

Page 8: pic16f84

III. Affichage hexa d’une variable 8 bits sur 4 afficheur 7 segment

Description

Le programme suivant permet d’incrémenter et d’afficher un variable hexadécimal de 16 bits sur 4 afficheurs 7 segments(affichage multiplexé) ,les 4 afficheurs sont a cathode commune tels que les 4 cathodes sont liés aux pins RA0 ,RA1,RA2 et RA3.Un bouton poussoir liée au pin RB0 est programmé comme étant une interruption ,l’appui sur ce bouton permet d’incrémenter cette variable.

Code

Page 9: pic16f84

Montage sur ISIS

Page 10: pic16f84

IV. UN COMPTEUR BINAIRE

Descriptionc’est un compteur binaire sur 8 bits qui compte de b’00000000’ jusqu'à b’11111111’ , à l’aide d’un pic 16f84A, deux bouton-poussoir, l’un relié à la pin RA0 (BP1) et l’autre à la pin RA1 (BP2) : - BP1 lance le programme -BP2 stoppe le comptageLe résultat est affiché sur deux afficheur 7 segments

Code

LIST p=16F84 ; Définition de processeur#include <p16F84.inc> ; Définitions de variables

__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _HS_OSC

;definitions

#DEFINE bp1 PORTA,0 ;définir le PORTA,0 par bp1 #DEFINE bp2 PORTA,1 ;définir le PORTA,1 par bp2

#DEFINE porb PORTB ;définir le PORTB par porb;declaration des variables

cblock 0x0c ; début de la zone variables retard_1 :1 ; le premier registre pour la temporisation. retard_2 :1 ; le deuxième registre pour la temporisation. endc ; fin de la zonz variable

;configuration des ports

org 0x00 ; Adresse de départ après reset bsf STATUS,RP0 ; acceder en bank1 movlw b'11111' ; configurerle PORTA en entré. movwf TRISA clrf TRISB ; configurerle PORTB en sortie bcf STATUS,RP0 ; accéder en bank0 clrf porb ; effacer le PORTB (initialisation)

debut btfsc bp1 ;controler le bp1, sauter si c'est le "0" (appui) goto debut ;boucler si c'est bp1=1 (c'est pas appui) star call tempo ;retarder le zero. incf porb,f ;incrimenter btfsc bp2 ;controler le bp2, sauter si c'est le "0" (appui) goto star ;continuait le comptage. goto debut ;si on clique sur bp1 on arrete la comptage.

tempo ;etiquette de la temporésation clrf retard_1 ;initialiser retard_1 clrf retard_2 ;initialiser retard_2

tempo_1 incfsz retard_1 ;incrémenter et tester le débordement de reard_1

Page 11: pic16f84

goto tempo_1 ;boucler s'il n'est pas encor déborder. incfsz retard_2 ;incrémenterle retard_2 si le tard1 est débrdé. goto tempo_1 ;refaire si le ratard_2 n'est pas encor déborder. return ;retourne de la temporisation.

end

Montage sur ISIS