En aquest projecte volem fer un joc del Mastermind. Per això disposarem de quatre LED tricolor per indicar les combinacions de color i quatre LED monocolor per indicar els encerts. Aquests LED els controlarem amb uns registres de desplaçament. També tindrem cinc polsadors connectats a una entrada analògica i un brunzidor piezoelèctric que ens permetrà, si ho desitgem, afegir una melodia al nostre joc. L'esquema de connexionat dels elements és el següent:

Els LED tricolor no només ens permeten obtenir els tres colors que incorporen (vermell, blau i verd) sinó alguns colors més. En teoria, combinant aquests tres colors (amb diferents intensitats) podem obtenir quasi infinits colors. Però nosaltres només podem tenir els colors activats o desactivats (sense variar-ne la intensitat) i, per tant, el nombre de possibles colors és reduït. En principi, disposem dels de la taula següent:
| Vermell (R) | Verd (G) | Blau (B) | Color |
| 1 | 0 | 0 | Vermell |
| 0 | 1 | 0 | Verd |
| 0 | 0 | 1 | Blau |
| 1 | 1 | 0 | Groc |
| 1 | 0 | 1 | Magenta |
| 0 | 1 | 1 | Cian |
| 1 | 1 | 1 | Blanc |
Alternant de forma ràpida dues o més combinacions podem fer alguns colors intermedis; per exemple:
| Vermell (R) | Verd (G) | Blau (B) | Color |
| 1 | 0 | 1 | Morat |
| 0 | 0 | 1 |
El programa de l'exemple NM permet provar el brunzidor. i el programa de l'exemple PA permet provar els polsadors.
En el programa que farem com a exemple, tindrem les variables Sortida i Sortida+1 que és on posarem els valors que volem enviar als registres i, per tant, als LED. La següent taula ens indica a quin LED correspon cada bit i alguns exemples, que són els que veurem al programa de mostra.
| Sortida+1 | Sortida | Comentari | ||||||||||||||||
| B3 | G3 | R3 | B2 | G2 | R2 | B1 | G1 | R1 | B0 | G0 | R0 | M3 | M2 | M1 | M0 | |||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | Monocrom encesos i tricolor apagats | ||
| 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | Monocrom apagats i tricolor vermells | ||
| 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | Monocrom apagats i tricolor verds | ||
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | Monocrom apagats i tricolor blaus | ||
El següent programa permet provar els registres de desplaçament:
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
cblock 0x20 Port ; Bits a enviar al port B Sortida:2 ; Valors a enviar al registre de desplaçament ; Sortida+1 correspon als bits del 8 al 15 i Sortida als bits del 0 al 7 ; Sortida+1 Sortida ; B3 G3 V3 B2 G2 V2 B1 G1 R1 B0 G0 R0 M3 M2 M1 M0 Compta ; Variable per comptar els bits Retard1 ; Variables per als cicles de retard Retard2 Retard3 endc
org 0 Inici bsf STATUS,RP0 ; Tria el banc 1 movlw 0xFF ; Posa l'acumulador a FFh (tot uns) movwf TRISA ; Posa tots els bits del port A com a entrada clrf TRISB ; Posa tots els bits del port B com a sortida clrf TRISC ; Posa tots els bits del port C com a sortida bcf STATUS,RP0 bsf STATUS,RP1 ; Tria el banc 2 movlw b'00000001' movwf ANSEL ; Configura AN0 com entrada analògica bcf STATUS,RP0 bcf STATUS,RP1 ; Tria el banc 0 clrf Port ; Posa a zero tots els bits de la variable Port movf Port,w movwf PORTB ; I ho envia al port B Bucle movlw b'00001111' ; Bits 0 a 3 a u (LED monocrom) i la resta a zero movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000000' ; Bits 8 a 15 a zero movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .10 ; Temps d'un segon call Rets ; Espera 1 s movlw b'10010000' ; LED multicolor a vermell movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00100100' movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .10 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00100000' ; LED multicolor a verd movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'01001001' movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .10 ; Temps d'un segon call Rets ; Espera 1 s movlw b'01000000' ; LED multicolor a blau movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'10010010' movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .10 ; Temps d'un segon call Rets ; Espera 1 s goto Bucle ; Torna a repetir
; ; Funció de retard de 0,2 W s ; Rets movwf Retard3 Bucles decfsz Retard1,f goto Bucles decfsz Retard2,f goto Bucles decfsz Retard3,f goto Bucles return ; ; Envia 16 bits a un registre de desplaçament ; ; Els bits estan a les variables Sortida (bits menys significatius) ; i Sortida+1 ; Al final de la funció, el valor de Sortida queda corromput ; Si es vol conservar, cal copiar-lo a una altra variable EnviaR16 bcf Port,5 ; S'assegura que Clock està desactivat bcf Port,6 ; S'assegura que Latch està desactivat ; En cas contrari, els bits enviats es copiarien ; immediatament a les sortides movf Port,w ; Agafa el valor de Port movwf PORTB ; I el posa al port B movlw .16 ; Número de bits a enviar movwf Compta ; Variable per comptar els bits BucleR16 bcf Port,4 ; Desactiva Data. Si toca activar-ho, ja ho farem rlf Sortida,f ; Fa sortir el bit de més a l'esquerra cap a C ; i roda els altres a l'esquerra rlf Sortida+1,f ; Fa sortir el bit de més a l'esquerra cap a C ; i roda els altres a l'esquerra btfsc STATUS,C ; Mira si el bit de l'esquerra era un 1 bsf Port,4 ; Si era 1, activa Data movf Port,w ; Agafa el valor de Port. El valor que ha canviat és Data movwf PORTB ; I el posa al port B bsf Port,5 ; Activa Clock, forçant a llegir el bit movf Port,w ; Agafa el valor de Port. El valor que ha canviat és Clock movwf PORTB ; I el posa al port B bcf Port,5 ; Desactiva Clock movf Port,w ; Agafa el valor de Port. El valor que ha canviat és Clock movwf PORTB ; I el posa al port B decfsz Compta,f ; Decrementa Compta goto BucleR16 ; Si Compta no és zero, repeteix el bucle bsf Port,6 ; Torna a activar Latch. Els valors es copiaran a la sortida del registre movf Port,w ; Agafa el valor de Port. El valor que ha canviat és Latch movwf PORTB ; I el posa al port B return end
A continuació posarem els programes realitzats pels grups. Estan tal com els han deixat i tenint present que no els va donar temps de simplificar-los o millorar-los. També pot ser que hi hagi errades ortogràfiques.

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