El programa d'aquest grup permet que juguin dues persones o bé una persona contra la màquina, la posició del potenciòmetre permet reiar entre els dos modes de joc. La matriu de LED es fa servir de manera que les quatre columnes de l'esquerra mostren les combinacions de colors i les quatre de la dreta mostren la correcció de la tirada corresponent. Els quatre primers polsadors corresponen a les quatre caselles de joc i cada cop que es prem un polsador canvia el color seguint la seqüència següent: apagat, blanc, groc, vermell, blau i verd. El cinquè polsador serveix per confirmar que la combinació actual és la que es vol jugar.
La correcció de la tirada la fa la màquina encenent en color magenta si s'ha encertat el color i la posició i en color cian si la posició no és correcta. Si no s'encerta el color no s'encendrà cap LED.
El programa és el següent:
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include "pic16f690.h" // Carrega el fitxer d'adreces i paràmetres del PIC 16F690 #include <xc.h> // Carrega el fitxer de funcions necessari per al compilador XC8 #include <stdlib.h> // Carrega el fitxer on hi ha la funció rand() #include <stdbool.h> #define _XTAL_FREQ 4000000 // La freqüència del rellotge és 4 MHz
char Sortida[6]; // Valors a enviar al MAX7221 (48 bits) char Actiu; // Variable que diu quin color està actiu // Actiu = 0 Apagat // Actiu = 1 Vermell // Actiu = 2 Verd // Actiu = 3 Blau char Polsad; char a; // comptador polsador 1 char b; // comptador polsador 2 char c; // comptador polsador 3 char d; // comptador polsador 4 char e; char f; char g; char h; char i; char n; char cpu; char c1; char c2; char c3; char c4; char partida=0; char aleatori(void); unsigned char Mode;
// Definició de les funcions que farem servir char Polsador(void); // Funció de lectura dels polsadors void Envia3max(char Val[]); // Envia un joc de valors als tres MAX7221 desactivant interrupcions void Envia_max(char Valor[]); // Envia un joc de valors als tres MAX7221 void Ini3max(void); // Inicialitza els tres MAX7221 void Apaga(void); // Apaga tots els LED void TocaNota(char ValPR2, char ValCCPR1L, char ValDC1B); void EnviaL(char Caracter); // Envia un caràcter void Esborra(void); // Esborra la pantalla i posa el cursor a l'inici void Cursor(char Filera, char Columna); void victoria(void);
void main (void) {
char vermell = 0b00000000;
char verd = 0b00000000;
char blau = 0b00000000;
OPTION_REG = 0b10000101; // Configuració de Timer0
// Com a temporitzador basat en rellotge
// 101 - Factor d'escala de 64
// I resistències de pull-up desactivades (valor per defecte)
TRISC = 0; // Tot el port C és de sortida
TRISB = 0; // Tot el port B és de sortida
TRISA = 0xFF; // Tot el port A és d'entrada
ANSEL = 0b00000101; // Configura AN0 i AN2 com entrada analògica
ANSELH = 0; // Desactiva les altres entrades analògiques
PORTC = 0; // Inicialitza a 0 el port C
PORTB = 0; // Inicialitza a 0 el port B
TRISC = 0b00100000; // Definim com volem les E/S del port C
// RC5 (sortida del PWM), de moment, com a entrada
PORTC = 0; // Desactiva les sortides del port C
CCP1CON = 0b00001100; // Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill
// DC1B = 11 (bits 5-4) els dos bits de menys pes són 0
// CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten
// Ho posa com a configuració del PWM
CCPR1L = 49; // Valor que correspon a un cicle del 35 % a 440 Hz
// Registre que ens dona l'amplada de tON
PIR1bits.TMR2IF = 0; // Desactiva el bit d'interrupció del Timer 2
T2CON = 0b00000011; // Configura el Timer 2
// bits T2KCPS (bits 1-0) a 11 prescalat de 16
// bit 2 (TMR2ON) a 0, Timer aturat
// Postscaler TOUTPS (bits 6-3) no afecten al PWM
Ini3max(); // Inicialitza els tres MAX7221
Actiu = 1; // Activa el color vermell
TMR0 = 139; // Presselecció de 139, que són 117 iteracions
// Correspon a una interrupció cada 7,5 ms
INTCON = 0b10100000; // Activem GIE i T0IE
while(1){
Apaga(); // Apaga tots els LED
int filera = 8;
a=0;
b=0;
c=0;
d=0;
e=0;
f=0;
g=0;
h=0;
i=0;
n=0;
cpu=0;
partida=0;
while(Polsad==0){
Polsad=Polsador();
}
c1=aleatori();
c2=aleatori();
c3=aleatori();
c4=aleatori();
vermell=0b00000000;
blau=0b00000000;
verd=0b00000000;
while (partida==0) {
ADCON0 = 0b00000001; // Activa el conversor connectat a AN0
ADCON0bits.GO = 1; // Posa en marxa el conversor
while (ADCON0bits.GO == 1) // Mentre no acabi
; // ens esperem
ADCON0 = 0b00000001; // Activa el conversor connectat a AN0
ADCON0bits.GO = 1; // Posa en marxa el conversor
while (ADCON0bits.GO == 1) // Mentre no acabi
; // ens esperem
if (ADRESH >127){
Mode = 1;
} else {
Mode = 0;
}
if ( Mode==0) { // escollim mode de joc aqui cmença 'l'arbre'
Polsad = Polsador(); // Llegim els polsadors
while (n==0){
Polsad = Polsador(); // Llegim els polsadors
if (Polsad == 1) {
e=e+1;
}
if (e == 1){ //blanc
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell | 0b10000000; // Vermells
verd = verd | 0b10000000; // Verds
blau = blau| 0b10000000; // Blaus
}
if (e == 2){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell|0b10000000; // Vermells
verd = verd|0b10000000; // Verds
blau = blau & 0b01111111; // Blaus
}
if (e == 3){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell|0b10000000; // Vermells
verd = verd & 0b01111111; // Verds
blau = blau & 0b01111111; // Blaus
}
if (e == 4){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b01111111; // Vermells
verd = verd & 0b01111111; // Verds
blau = blau | 0b10000000; // Blaus
}
if (e == 5){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b01111111; // Vermells
verd = verd | 0b10000000; // Verds
blau = blau & 0b01111111; // Blaus
}
if (e>5){
e=0;
}
if (Polsad == 2) {
f=f+1;
}
if (f == 1){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell | 0b01000000; // Vermells
verd =verd | 0b01000000; // Verds
blau = blau | 0b01000000; // Blaus
}
if (f == 2){ // groc
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell |0b01000000; // Vermells
verd = verd |0b01000000; // Verds
blau = blau & 0b10111111; // Blaus
}
if (f == 3){ // vermell
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell |0b01000000; // Vermells
verd = verd & 0b10111111; // Verds
blau = blau & 0b10111111; // Blaus
}
if (f == 4){ // blau
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b10111111; // Vermells
verd = verd & 0b10111111; // Verds
blau = blau | 0b01000000; // Blaus
}
if (f == 5){ // verd
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b10111111; // Vermells
verd = verd | 0b01000000; // Verds
blau = blau & 0b10111111; // Blaus
}
if (f>5){
f=0;
}
if (Polsad == 3) {
g=g+1;
}
if (g == 1){ // blanc
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell | 0b00100000; // Vermells
verd =verd | 0b00100000; // Verds
blau = blau | 0b00100000; // Blaus
}
if (g == 2){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell |0b00100000; // Vermells
verd = verd |0b00100000; // Verds
blau = blau & 0b11011111; // Blaus
}
if (g == 3){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell |0b00100000; // Vermells
verd = verd & 0b11011111; // Verds
blau = blau & 0b11011111; // Blaus
}
if (g == 4){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b11011111; // Vermells
verd = verd & 0b11011111; // Verds
blau = blau | 0b00100000; // Blaus
}
if (g == 5){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b11011111; // Vermells
verd = verd | 0b00100000; // Verds
blau = blau & 0b11011111; // Blaus
}
if (g>5){
g=0;
}
if (Polsad == 4) {
h=h+1;
}
if (h == 1){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell | 0b00010000; // Vermells
verd = verd | 0b00010000; // Verds
blau = blau | 0b00010000; // Blaus
}
if (h == 2){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell |0b00010000; // Vermells
verd = verd |0b00010000; // Verds
blau = blau & 0b11101111; // Blaus
}
if (h == 3){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell |0b00010000; // Vermells
verd = verd & 0b11101111; // Verds
blau = blau & 0b11101111; // Blaus
}
if (h == 4){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b11101111; // Vermells
verd = verd & 0b11101111; // Verds
blau = blau | 0b00010000; // Blaus
}
if (h == 5){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b11101111; // Vermells
verd = verd | 0b00010000; // Verds
blau = blau & 0b11101111; // Blaus
}
if (h>5){
h=0;
}
if (Polsad == 5){
n=n+1;
vermell=0b00000000;
blau=0b00000000;
verd=0b00000000;
}
Sortida[0]=vermell;
Sortida[2]=verd;
Sortida[4]=blau;
Envia3max(Sortida);
while(Polsad>=1){
Polsad = Polsador();
}
_delay(20000);
}
}
if (Mode == 1) {
while (cpu == 0) {
e=c1;
f=c2;
g=c3;
h=c4;
cpu = cpu +1;
}
}
Polsad = Polsador(); // Llegim els polsadors
if (Polsad == 1) {
a=a+1;
}
if (a == 1){ // blanc
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell | 0b10000000; // Vermells
verd = verd | 0b10000000; // Verds
blau = blau| 0b10000000; // Blaus
}
if (a == 2){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell|0b10000000; // Vermells
verd = verd|0b10000000; // Verds
blau = blau & 0b01111111; // Blaus
}
if (a == 3){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell|0b10000000; // Vermells
verd = verd & 0b01111111; // Verds
blau = blau & 0b01111111; // Blaus
}
if (a == 4){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b01111111; // Vermells
verd = verd & 0b01111111; // Verds
blau = blau | 0b10000000; // Blaus
}
if (a == 5){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b01111111; // Vermells
verd = verd | 0b10000000; // Verds
blau = blau & 0b01111111; // Blaus
}
if (a>5){
a=0;
}
if (Polsad == 2) {
b=b+1;
}
if (b == 1){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell | 0b01000000; // Vermells
verd =verd | 0b01000000; // Verds
blau = blau | 0b01000000; // Blaus
}
if (b == 2){ // groc
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell |0b01000000; // Vermells
verd = verd |0b01000000; // Verds
blau = blau & 0b10111111; // Blaus
}
if (b == 3){ // vermell
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell |0b01000000; // Vermells
verd = verd & 0b10111111; // Verds
blau = blau & 0b10111111; // Blaus
}
if (b == 4){ // blau
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b10111111; // Vermells
verd = verd & 0b10111111; // Verds
blau = blau | 0b01000000; // Blaus
}
if (b == 5){ // verd
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b10111111; // Vermells
verd = verd | 0b01000000; // Verds
blau = blau & 0b10111111; // Blaus
}
if (b>5){
b=0;
}
if (Polsad == 3) {
c=c+1;
}
if (c == 1){ // blanc
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell | 0b00100000; // Vermells
verd =verd | 0b00100000; // Verds
blau = blau | 0b00100000; // Blaus
}
if (c == 2){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell |0b00100000; // Vermells
verd = verd |0b00100000; // Verds
blau = blau & 0b11011111; // Blaus
}
if (c == 3){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell |0b00100000; // Vermells
verd = verd & 0b11011111; // Verds
blau = blau & 0b11011111; // Blaus
}
if (c == 4){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b11011111; // Vermells
verd = verd & 0b11011111; // Verds
blau = blau | 0b00100000; // Blaus
}
if (c == 5){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b11011111; // Vermells
verd = verd | 0b00100000; // Verds
blau = blau & 0b11011111; // Blaus
}
if (c>5){
c=0;
}
if (Polsad == 4) {
d=d+1;
}
if (d == 1){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell | 0b00010000; // Vermells
verd =verd | 0b00010000; // Verds
blau = blau | 0b00010000; // Blaus
}
if (d == 2){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell |0b00010000; // Vermells
verd = verd |0b00010000; // Verds
blau = blau & 0b11101111; // Blaus
}
if (d == 3){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell |0b00010000; // Vermells
verd = verd & 0b11101111; // Verds
blau = blau & 0b11101111; // Blaus
}
if (d == 4){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b11101111; // Vermells
verd = verd & 0b11101111; // Verds
blau = blau | 0b00010000; // Blaus
}
if (d == 5){
Sortida[1] = filera; // Filera 8
Sortida[3] = filera;
Sortida[5] = filera;
vermell = vermell & 0b11101111; // Vermells
verd = verd | 0b00010000; // Verds
blau = blau & 0b11101111; // Blaus
}
if (d>5){
d=0;
}
if (Polsad == 5){
if (a==e) {
vermell = vermell |0b00001000; // Vermells
verd = verd & 0b11110111; // Verds
blau = blau | 0b00001000;
} else if(a==f || a==g || a==h){
vermell = vermell &0b11110111;
verd= verd | 0b00001000;
blau = blau | 0b00001000;
}
if (b==f){
vermell = vermell |0b00000100; // Vermells
verd = verd & 0b11111011; // Verds
blau = blau | 0b00000100;
} else if(b==e || b==g || b==h){
vermell = vermell & 0b11111011;
verd = verd | 0b00000100;
blau = blau | 0b00000100;
}
if(c==g){
vermell = vermell |0b00000010; // Vermells
verd = verd & 0b11111101; // Verds
blau = blau | 0b00000010;
} else if (c==e || c==h || c==f){
vermell = vermell & 0b11111101;
verd= verd | 0b00000010;
blau = blau | 0b00000010;
}
if (d==h){
vermell = vermell |0b00000001; // Vermells
verd = verd & 0b11111110; // Verds
blau = blau | 0b00000001; // Blaus
} else if (d==e || d==g || c==f){
vermell = vermell & 0b11111110;
verd= verd | 0b00000001;
blau = blau | 0b00000001;
}
if(a==e && b==f && c==g && d==h){
Sortida[0]=vermell;
Sortida[2]=verd;
Sortida[4]=blau;
Envia3max(Sortida);
victoria();
_delay(2000000);
partida=partida+1;
}
Sortida[0]=vermell;
Sortida[2]=verd;
Sortida[4]=blau;
Envia3max(Sortida);
filera=filera -1;
vermell=0b00000000;
blau=0b00000000;
verd=0b00000000;
a=0;
b=0;
c=0;
d=0;
_delay(200000);
}
Sortida[0]=vermell;
Sortida[2]=verd;
Sortida[4]=blau;
Envia3max(Sortida);
while(Polsad>=1){
Polsad = Polsador();
}
_delay(20000);
}
}
_delay(20000);
}
void __interrupt() temporit(void){
INTCONbits.GIE = 0; // Desactiva les interrupcions momentàniament
if (INTCONbits.T0IF) { // Comprovem que hi ha interrupció per Timer 0
TMR0 = 139; // Preselecció de Timer0
INTCONbits.T0IF = 0; // Desactiva el bit que indica interrupció pel Timer0
if (Actiu != 0) { // Si la matriu no està apagada
Actiu--; // Passem a activar un altre color
if (Actiu == 0) { // Si hem arribat a zero
Actiu = 3; // Torna a posar el 3
}
}
// D'entrada els desactivem els tres
Sortida[0] = 0x00; // Vermell
Sortida[2] = 0x00; // Verd
Sortida[4]= 0x00; // Blau
if (Actiu == 1) { // Si és vermell
Sortida[0] = 0x01; // Vermell activat
}
if (Actiu == 2) { // Si és verd
Sortida[2] = 0x01; // Verd activat
}
if (Actiu == 3) { // Si és blau
Sortida[4] = 0x01; // Blau activat
}
Sortida[1] = 0x0C; // Shutdown mode
Sortida[3] = 0x0C; // Shutdown mode
Sortida[5] = 0x0C; // Shutdown mode
Envia_max(Sortida); // Ho envia al MAX7221
}
INTCONbits.GIE = 1; // Reactiva les interrupcions a l'acabar
}
void Envia3max(char Val[]) { // Envia un joc de valors als tres MAX7221
INTCONbits.GIE = 0; // Desactiva les interrupcions momentàniament
Envia_max(Val);
INTCONbits.GIE = 1; // Reactiva les interrupcions a l'acabar
}
void Envia_max(char Valor[]) { // Envia un joc de valors als tres MAX7221
char Port = 0; // Variable on guardem l'estat del port B
char Temp; // Variable temporal
for (int j = 5; j >= 0; j--){ // Hem d'enviar 6 bytes
for (int k = 1; k < 9; k++){ // De 8 bits
Temp = Valor[j] & 0b10000000; // Agafa el bit de més a l'esquerra
// Temp només podrà valer 0 o 128
if (Temp == 0) { // Si val 0
Port = Port & 0b11101111; // Desactiva Data (bit 4)
} else { // Si val 128
Port = Port | 0b00010000; // Activa Data (bit 4)
}
Valor[j] = Valor[j] << 1; // Rodem els bits per situar el següent
PORTB = Port; // Ho posa al port B
Port = Port | 0b00100000; // Activa Clock (bit 5) i força lectura
PORTB = Port; // Ho posa al port B
Port = Port & 0b11011111; // Desactiva Clock (bit 5)
PORTB = Port; // Ho posa al port B
}
}
Port = Port | 0b01000000; // Activa Latch (bit 6) per copiar a les sortides
PORTB = Port; // Ho posa al port B
}
void Ini3max(void) { // Inicialitza els tres MAX7221
char Bytes[6]; // Els sis bytes que cal enviar
Bytes[0] = 0x00; // Desactivat
Bytes[1] = 0x0C; // Shutdown mode
Bytes[2] = 0x00;
Bytes[3] = 0x0C;
Bytes[4] = 0x00;
Bytes[5] = 0x0C;
Envia_max(Bytes); // Els envia
Bytes[0] = 0x00; // No decode
Bytes[1] = 0x09; // Decode mode
Bytes[2] = 0x00;
Bytes[3] = 0x09;
Bytes[4] = 0x00;
Bytes[5] = 0x09;
Envia_max(Bytes); // Els envia
Bytes[0] = 0x07; // Vuit fileres
Bytes[1] = 0x0B; // Scan limit
Bytes[2] = 0x07;
Bytes[3] = 0x0B;
Bytes[4] = 0x07;
Bytes[5] = 0x0B;
Envia_max(Bytes); // Els envia
}
void Apaga(void) { // Apaga tots els LED
char Bytes[6]; // Els sis bytes que cal enviar
for (int j = 1; j <= 8; j++){ // Hem d'enviar 8 fileres
Bytes[1] = j; // Filera
Bytes[3] = j;
Bytes[5] = j;
Bytes[0] = 0x00; // Vermells
Bytes[2] = 0x00; // Verds
Bytes[4] = 0x00; // Blaus
Envia3max(Bytes); // Els envia
}
}
char Polsador(void) {
char Pols = 0;
ADCON0 = 0b00001001;
ADCON0bits.GO = 1; // Posa en marxa el conversor
while (ADCON0bits.GO == 1) // Mentre no acabi
; // ens esperem
ADCON0 = 0b00001001;
ADCON0bits.GO = 1; // Posa en marxa el conversor
while (ADCON0bits.GO == 1) // Mentre no acabi
; // ens esperem
if (ADRESH < 220 && ADRESH > 200) {
Pols = 1; // Comprova polsador 1
}
if (ADRESH < 194 && ADRESH > 174) {
Pols = 2; // Comprova polsador 2
}
if (ADRESH < 163 && ADRESH > 143) {
Pols = 3; // Comprova polsador 3
}
if (ADRESH < 90 && ADRESH > 70) {
Pols = 4; // Comprova polsador 4
}
if (ADRESH < 55 && ADRESH > 35) {
Pols = 5; // Comprova polsador 5
}
return Pols;
}
char aleatori(void){
int val;
char correcte;
correcte=false;
while (correcte==false){
val=rand() & 0x0007;
if (val>1 && val<6){
correcte=true;
}
}
return val;
}
void TocaNota(char ValPR2, char ValCCPR1L, char ValDC1B) {
TRISC = 0b00100000; // Definim com volem les E/S del port C
// RC5 (sortida del PWM), de moment, com a entrada
PR2 = ValPR2; // Carrega PR2
CCP1CON = CCP1CON & 0b11001111; // Posa a zero els bits que corresponen a DC1B
ValDC1B = ValDC1B % 4; // DC1B va de 0 a 3
ValDC1B = ValDC1B * 16; // Desplaça els bits a la posició que els correspon a CCP1CON
CCP1CON = CCP1CON + ValDC1B; // Coloca DC1B al seu lloc
CCPR1L = ValCCPR1L; // Carrega CCPR1L, registre que ens dona l'amplada de tON
PIR1bits.TMR2IF = 0; // Desactiva el bit d'interrupció del Timer 2
T2CON = 0b00000111; // Configura el Timer 2
// bits T2KCPS (bits 1-0) a 11 prescalat de 16
// bit 2 (TMR2ON) a 1, Timer activat
// Postscaler TOUTPS (bits 6-3) no afecten al PWM
while (PIR1bits.TMR2IF == 0) // Espera l'activació del bit d'interrupció del Timer 2
; // Esperem
TRISC = 0b00000000; // Posem RC5 (sortida del PWM) com a sortida
__delay_ms(200); // Retard de 0,2 s
TRISC = 0b00100000; // Posem RC5 (sortida del PWM) com a entrada
// O sigui, silenci
}
void victoria(void) {
TocaNota(238,119,2); // do
__delay_ms(10);
TocaNota(238,119,2); // do
__delay_ms(10);
TocaNota(158,79,2); // sol
__delay_ms(10);
TocaNota(158,79,2); // sol
__delay_ms(10);
TocaNota(141,71,0); // la
__delay_ms(10);
TocaNota(141,71,0); // la
__delay_ms(10);
TocaNota(158,79,2); // sol
__delay_ms(40);
TocaNota(178,89,2); // fa
__delay_ms(10);
TocaNota(178,89,2); // fa
__delay_ms(10);
TocaNota(189,95,0); // mi
__delay_ms(10);
TocaNota(189,95,0); // mi
__delay_ms(10);
TocaNota(212,106,2); // re
__delay_ms(10);
TocaNota(212, 106, 2); // re
__delay_ms(10);
TocaNota(238,119, 2); // do
__delay_ms(40);
}

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