Programació en C del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Mastermind electrònic

Programa del grup 4

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);
}

 

 

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