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.
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
cblock 0x20 numbuc ; Nombre de bucles per fer 0,2 s bucles ; Comptador de bucles numcicL ; Nombre de cicles de 771 us numcicC ; Nombre de cicles de 3 us port ; Variable per gestionar el port C Retard1 ; Variables de retard Retard2 endc
org 0 Inici bsf STATUS,RP0 ; Tria el banc 1 clrf TRISC ; Tot el port C és de sortida bcf STATUS,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 b'00100000' ; 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 STATUS,Z ; 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 STATUS,Z ; 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

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