; PIC 16F628 ; Chenillard 8 LEDs sur PORT A List p=16F628 ; processeur utilisé #include __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_OFF ;bits de configuration : ;code protect OFF ;watchdog timer OFF ;power up timer ON ;oscillateur RC_CLKOUT ;low voltage program OFF ;data EE read protect OFF ;brown out detect OFF ;master clear enable OFF : Utiliser la broche comme I/O ;xxxxxx ; macro ;xxxxxx bank0 macro ; Selection bank 0 bcf STATUS,RP0 bcf STATUS,RP1 endm bank1 macro ; Selection bank 1 bsf STATUS,RP0 bcf STATUS,RP1 endm bank2 macro ; Selection bank 2 bcf STATUS,RP0 bsf STATUS,RP1 endm bank3 macro ; Selection bank 3 bsf STATUS,RP1 bsf STATUS,RP0 endm ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Initialisation de la mémoire EEPROM (facultatif) ; Cela met dans l'EEPROM le message : ; (C) Gilles Bernard (en code ASCII) ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx org 0x2100 ; début de zone EEPROM du PIC 16F628 DE '(' DE 'C' DE ')' DE 'G' ,'i' ,'l','l','e','s',' ' DE 'B','e','r','n','a','r','d',' ' ;xxxxxxxxxxxxxxxxxxxxxxxxx ; déclaration de variables ;xxxxxxxxxxxxxxxxxxxxxxxxx CBLOCK 0x020 valeur : 1 compteur : 1 compteur2 : 1 chenillard : 1 compteur_1 : 1 ; Pour la boucle de tempo compteur_2 : 1 ; Pour la boucle de tempo compteur_3 : 1 ; Pour la boucle de tempo ENDC ;xxxxxxxxxxxxxxxxxxxx ; démarrage sur reset ;xxxxxxxxxxxxxxxxxxxx org 0x0000 goto initialisation ;xxxxxxxxxxxxxxx ; initialisation ;xxxxxxxxxxxxxxx initialisation bank1 movlw B'00000000' movwf OPTION_REG ; Activation des resistances de pullup sur B movlw B'00000000' movwf TRISB movlw B'11111111' movwf TRISA bank0 movlw B'00000111' movwf CMCON ; Desactivation des comparateur clrf PORTA clrf PORTB movlw B'00000000' ; Pas d'interruptions movwf INTCON goto debut_programme ;xxxxxxxxxxxxxxxxxxxxxxxxxx ; Routines de temporisation ;xxxxxxxxxxxxxxxxxxxxxxxxxx tempo_250ms ; Temporisation de W*250ms movwf compteur_3 boucle3_250ms ; Tempo de 250ms movlw .250 movwf compteur_2 boucle2_250ms ; Tempo 1ms movlw .250 movwf compteur_1 boucle1_250ms ; La boucle dure 4 cycles = 4us nop decfsz compteur_1,f goto boucle1_250ms decfsz compteur_2,f goto boucle2_250ms decfsz compteur_3,f goto boucle3_250ms return tempo_1ms ; Temporisation de W*1ms movwf compteur_2 boucle2_1ms ; Tempo 1ms movlw .250 movwf compteur_1 boucle1_1ms ; La boucle dure 4 cycles = 4us nop decfsz compteur_1,f goto boucle1_1ms decfsz compteur_2,f goto boucle2_1ms return tempo_10us ; Temporisation de W*10us movwf compteur_1 boucle1_10us ; La boucle dure 10 cycles = 10us nop nop nop nop nop nop nop decfsz compteur_1,f goto boucle1_10us return ;; Aller et retour facon K2000 sequence1 movlw .7 movwf compteur movlw .1 movwf chenillard bcf STATUS,C boucleseq11 movf chenillard,W movwf PORTB movlw .50 call tempo_1ms rlf chenillard,f decfsz compteur goto boucleseq11 movlw .8 movwf compteur boucleseq12 movf chenillard,W movwf PORTB movlw .50 call tempo_1ms rrf chenillard,f decfsz compteur goto boucleseq12 return ;; Croisement sequence2 movlw .8 movwf compteur movlw .0 movwf chenillard boucleseq21 movlw HIGH tabseq2 movwf PCLATH movf chenillard,W call tabseq2 movwf PORTB movlw .100 call tempo_1ms incf chenillard decfsz compteur goto boucleseq21 return ;; Alternance sequence3 movlw .8 movwf compteur movlw B'10101010' movwf chenillard boucleseq31 movf chenillard,W movwf PORTB movlw .200 call tempo_1ms comf chenillard,f decfsz compteur goto boucleseq31 return ;xxxxxxxxxxxxxxxxxxxxx ; programme principal ;xxxxxxxxxxxxxxxxxxxxx debut_programme movlw .10 movwf compteur2 boucleseq10 call sequence1 decfsz compteur2,f goto boucleseq10 movlw .10 movwf compteur2 boucleseq20 call sequence2 decfsz compteur2,f goto boucleseq20 movlw .5 movwf compteur2 boucleseq30 call sequence3 decfsz compteur2,f goto boucleseq30 goto debut_programme org 0x0200 tabseq2 addwf PCL,f retlw B'10000001' ;0 retlw B'01000010' ;1 retlw B'00100100' ;2 retlw B'00010000' ;3 retlw B'00001000' ;4 retlw B'00100100' ;5 retlw B'01000010' ;6 retlw B'10000001' ;7 retlw B'00000000' ;8 END