En aquest exemple farem sonar unes notes musicals en un brunzidor piezoelèctric o un altaveu.
El següent programa toca la seqüència do - re - mi, fa una pausa de 0,2 s i la torna a tocar.
PROCESSOR 16F690 #include <xc.inc> config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
numbuc EQU 0x20 ; Nombre de bucles per fer 0,2 s bucles EQU 0x21 ; Comptador de bucles numcicL EQU 0x22 ; Nombre de cicles de 771 us numcicC EQU 0x23 ; Nombre de cicles de 3 us port EQU 0x24 ; Variable per gestionar el port C Retard1 EQU 0x25 ; Variables de retard Retard2 EQU 0x26
PSECT code, class=CODE, delta=2, abs main: bsf RP0 ; Tria el banc 1 clrf TRISC ; Tot el port C és de sortida bcf RP0 ; Tria el banc 0 clrf port ; Desactiva les sortides del port C clrf PORTC ; Desactiva les sortides del port C Bucle: movlw 105 ; Valors que correspon aproximadament a do3 movwf numbuc ; Nombre de bucles per fer 0,2 s movlw 2 movwf numcicL ; Nombre de cicles de 771 us movlw 120 movwf numcicC ; Nombre de cicles de 3 us call TocaNota ; Toca la nota configurada movlw 117 ; Valors que correspon aproximadament a re3 movwf numbuc ; Nombre de bucles per fer 0,2 s movlw 2 movwf numcicL ; Nombre de cicles de 771 us movlw 50 movwf numcicC ; Nombre de cicles de 3 us call TocaNota ; Toca la nota configurada movlw 132 ; Valors que correspon aproximadament a mi3 movwf numbuc ; Nombre de bucles per fer 0,2 s movlw 1 movwf numcicL ; Nombre de cicles de 771 us movlw 245 movwf numcicC ; Nombre de cicles de 3 us call TocaNota ; Toca la nota configurada call RetM ; Espera 0,2 s goto Bucle
; ; Funció per tocar una nota ; numbuc Nombre de bucles per fer 0,2 s ; numcicL Nombre de cicles de 771 us ; numcicC Nombre de cicles de 3 us ; Aquestes tres variables no es modifiquen TocaNota: movf numbuc,w ; Nombre de cops que ho hem de repetir movwf bucles ; Variable per comptar-los TN0: movlw 00100000B ; RC5 correspon al brunzidor xorwf port,f ; Inverteix el bit movf port,w ; Agafa port movwf PORTC ; i ho copia al port C ; Retard de numcicL x 771 us movf numcicL,w ; Nombre de cicles que cal fer movwf Retard2 btfsc ZERO ; Mira si és zero goto TN2 ; No fem aquest retard TN1: decfsz Retard1,f goto TN1 decfsz Retard2,f goto TN1 TN2: ; Retard de numcicC x 3 us movf numcicC,w ; Nombre de cicles que cal fer movwf Retard1 btfsc ZERO ; Mira si és zero goto TN2 ; No fem aquest retard TN3: decfsz Retard1,f goto TN3 TN4: decfsz bucles,f goto TN0 ; Fi del bucle bcf port,5 ; En acabar, deixem la sortida desactivada movf port,w ; Agafa port movwf PORTC ; i ho copia al port C return RetM: ; Funció de retard de 0,2 s decfsz Retard1,f goto RetM decfsz Retard2,f goto RetM return END main

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.