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