; "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 __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