Programació en C del PIC 16F690

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

Tres en línia electrònic

Programa del grup 5

Els quatre polsadors de l'esquerra de la part inferior serveixen per moure el cursor: amunt, avall, esquerra i dreta. L'altre polsador de la part inferior serveix per acceptar la posició.

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 					// Carrega el fitxer de funcions
#define _XTAL_FREQ  4000000			// La freqüència del rellotge és 4 MHz
#define Reiniciar   RA3
char Sortida[6];				
char Matriu[3][3];
char Actiu; 					
int linia();
char Polsad;					
char color;
int n1 = 0;
int n2 = 0;    	
char Polsador(void);				
void Envia3max(char Valor[6]);			// Envia un joc de valors als tres MAX7221
void Ini3max(void);				// Inicialitza els tres MAX7221
void Apaga(void);				// Apaga tots els LED
void omplir(void);
void EnviaL(char Caracter);			
void Esborra(void);				
void Cursor(char Filera, char Columna);		
void TocaNota(char ValPR2, char ValCCPR1L, char ValDC1B);
void inici(void);
void musica_inici(void);
void missatge_final(char color);
void musica_final(void);
void main (void) {
	OPTION_REG = 0b10000101;       		// Configuració de Timer0
						// I resistències de pull-up desactivades (valor per defecte)
	TRISC = 0b00100000;			// 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
	Ini3max();				// Inicialitza els tres MAX7221
	Apaga();				// Apaga tots els LED
	Actiu = 1;				// Activa el color vermell
	TMR0 = 139;				// Presselecció de 139, que són 117 iteracions
	ADCON1 = 0b00010000;			// Posa el conversor a 1/8 de la freqüència
	ADCON0 = 0b00001001;			// Activa el conversor A/D connectat a AN2
	INTCON = 0b10100000;			// Activem GIE i T0IE          
						// Desactiva les sortides del port C
	CCP1CON = 0b00001100;			// Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill
	CCPR1L = 49;				// Valor que correspon a un cicle del 35 % a 440 Hz
	PIR1bits.TMR2IF = 0;			// Desactiva el bit d'interrupció del Timer 2
	T2CON = 0b00000011;	
	TXSTAbits.BRGH = 1;			// Configuració de velocitat
	BAUDCTLbits.BRG16 = 0;			// Paràmetre de velocitat de 8 bits
	SPBRG = 25;				// Velocitat de 9600 baud
	TXSTAbits.SYNC = 0;			// Comunicació asíncrona
	TXSTAbits.TX9 = 0;			// Comunicació de 8 bits
	RCSTAbits.SPEN = 1;			// Activa comunicació sèrie
	TXSTAbits.TXEN = 1;			// Activa comunicació
	Esborra();
	EnviaL('B');
	EnviaL('e');
	EnviaL('n');
	EnviaL('v');
	EnviaL('i');
	EnviaL('n');
	EnviaL('g');
	EnviaL('u');
	EnviaL('t');
	EnviaL('s');
	inici();
	while (1) {
		for (int y=0; y<3; y++)	{
			for (int x=0; x<3; x++)	{
				Matriu[x][y] = 0;
			}
		}
		Esborra();
		char caracter1 = n1 + '0';	// Li sumem el codi ASCII de 0
		char caracter2 = n2 + '0';	// Li sumem el codi ASCII de 0
		EnviaL('J');
		EnviaL('U');
		EnviaL('G');
		EnviaL('A');
		EnviaL('D');
		EnviaL('O');
		EnviaL('R');
		EnviaL(' ');
		EnviaL('1');
		Cursor (1, 16);
		EnviaL(caracter1);
		char x = 1;
		char y = 1;
		char x_ant;
		char y_ant;
		char color_aux = 1;
		Matriu[x][y] = 10;
		omplir();
		while (Reiniciar == 1){
			Polsad = Polsador();	// Llegim els polsadors
			color = color_aux;
			if (Polsad == 1) {
				x_ant = x;
				if (x == 0) {
					x = 2; 
				} else { 
					x -= 1; 
				} 
				Matriu[x][y] += 10;
				Matriu[x_ant][y] -= 10;
				omplir();
			}
			if (Polsad == 2) {		
				x_ant = x;
				if (x == 2) {
					x = 0; 
				} else { 
					x += 1; 
				} 
				Matriu[x][y] += 10;
				Matriu[x_ant][y] -= 10; 
				omplir();	// Encén el LED 4
			}
			if (Polsad == 3) {	// Si s'ha premut el polsador 3
				y_ant = y;
				if (y == 0) {
					y = 2; 
				} else { 
					y -= 1; 
				} 
				Matriu[x][y] += 10;
				Matriu[x][y_ant] -= 10;
				omplir();	// Encén el LED 3
			}
			if (Polsad == 4) {	// Si s'ha premut el polsador 2
				y_ant = y;
				if (y == 2) {
					y = 0; 
				} else { 
					y += 1; 
				} 
				Matriu[x][y] += 10;
				Matriu[x][y_ant] -= 10; 
				omplir();	// Encén el LED 2
			}
			if (Polsad == 5) {	// Si s'ha premut el polsador 1
				if (Matriu[x][y]>10){
					Cursor (2,1);	
					EnviaL('O');
					EnviaL('C');
					EnviaL('U');
					EnviaL('P');
					EnviaL('A');
					EnviaL('T');
					for (int c=0; c<3; c++){
						RC0 = 1;
						RC1 = 1;
						RC2 = 1;
						RC3 = 1;
						TocaNota(238, 119, 2);	
						_delay(200000);
						RC0 = 0;
						RC1 = 0;
						RC2 = 0;
						RC3 = 0;
					}
					Cursor(2,1);
					EnviaL(' ');
					Cursor(2,2);
					EnviaL(' ');
					Cursor(2,3);
					EnviaL(' ');
					Cursor(2,4);
					EnviaL(' ');
					Cursor(2,5);
					EnviaL(' ');
					Cursor(2,6);
					EnviaL(' ');
				} else{
					if (color == 1){
						Matriu[x][y] = 1;
						if (linia(color) == 1)
							missatge_final(color);
                        else{
							Cursor(1,9);
							EnviaL('2');
							Cursor(1,16);
							EnviaL(caracter2);
						}
						x = 1;
						y = 1;
						Matriu[x][y] += 10;
						omplir();
						color_aux = 2;
					}  
					if (color == 2){
						Matriu[x][y] = 2;
						if (linia(color) == 1)
							missatge_final(color);
						else{
							Cursor(1,9);
							EnviaL('1');
							Cursor(1,16);
							EnviaL(caracter1);
						}
						x = 1;
						y = 1;
						Matriu[x][y] += 10;
						omplir();
						color_aux = 1;
					}
				}
			}
			_delay(200000);		// Retard per permetre la visualització
		}
	}
}
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
		Envia3max(Sortida);		// Ho envia al MAX7221
	}
	INTCONbits.GIE = 1;			// Reactiva les interrupcions a l'acabar
}
char Polsador(void) {
	char Pols;
	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;
}
void omplir (void) {
	char f;
    char Mask;
    char a;
   	char b;
    char c;
	for (int x=0; x<3; x++) {
		a = 0b00000000;
		b = 0b00000000;
		c = 0b00100100;
		f = 3*(x)+1;
		Mask = 0b11000000;
		for (int y=0; y<3; y++)	{
			if (Matriu[x][y] == 1){
				a  = a | Mask;
			}
			if (Matriu[x][y] == 2){
				b  = b | Mask;
			}	
			if (Matriu[x][y] == 10){
				a = a | Mask;
				b  = b | Mask;
			}
			if (Matriu[x][y] == 11){
				a = a | Mask;
				c  = c | Mask;
			}    
			if (Matriu[x][y] == 12){
				b = b | Mask;
				c  = c | Mask;
			}    
			Mask = Mask >> 3;
		}
		Sortida[0] = a;
		Sortida[2] = b;
		Sortida[4] = c;
		Sortida[1] = f;
		Sortida[3] = f;
		Sortida[5] = f;
		Envia3max(Sortida);
		Sortida[0] = a;
		Sortida[2] = b;
		Sortida[4] = c;
		Sortida[1] = f+1;
		Sortida[3] = f+1;
		Sortida[5] = f+1;
		Envia3max(Sortida);
		if (x<2){
			Sortida[0] = 0b00000000;
			Sortida[2] = 0b00000000;
			Sortida[4] = 0b11111111;
			Sortida[1] = f+2;
			Sortida[3] = f+2;
			Sortida[5] = f+2;
			Envia3max(Sortida);
		}
	}
}
void Envia3max(char Valor[6]) {			// Envia un joc de valors als tres MAX7221
	INTCONbits.GIE = 0;			// Desactiva les interrupcions momentàniament
	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
	INTCONbits.GIE = 1;			// Reactiva les interrupcions a l'acabar
}
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;
	Envia3max(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;
	Envia3max(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;
	Envia3max(Bytes);			// Els envia
}
void Apaga(void) {				// Apaga tots els LED
	char Bytes[6];				// Els sis bytes que cal enviar
	for (int j = 0; 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
	}
}
void EnviaL(char Caracter) {
	INTCONbits.GIE = 0;			// Desactiva les interrupcions momentàniament
	RCSTAbits.SPEN = 1;			// Activa comunicació sèrie
	TXSTAbits.TXEN = 1;			// Activa comunicació
	TXREG = Caracter;			// Agafa el caràcter i l'envia
	__delay_ms(1);				// Donem temps
	while (PIR1bits.TXIF == 0)		// Esperem que s'acabi d'enviar
		;				// No fem res
	RCSTAbits.SPEN = 0;			// Desactiva comunicació sèrie
	TXSTAbits.TXEN = 0;			// Desactiva comunicació
	INTCONbits.GIE = 1;			// Activa les interrupcions
}
void Esborra(void) {
	EnviaL(254);				// Caràcter de control
	EnviaL(1);				// Esborra la pantalla i posa el cursor a l'inici
}
void Cursor(char Filera, char Columna) {
	char Posicio = 0;			// Variable per a calcular la posició
	if (Filera == 2) {
		Posicio = 64;			// La primera columna de la segona fila és 64;
	}
	if (Columna > 0 && Columna < 33) {	// Comprovem que sigui un valor raonable
		Posicio = Posicio + Columna;	// Sumem les adreces
		Posicio = Posicio - 1;		// Restem 1 perquè numera des de 0
	}
	Posicio = Posicio + 128;		// Posa el bit de posicionat a 1
	EnviaL(254);				// Control de la posició del cursor
	EnviaL(Posicio);			// Canvia el cursor de lloc
}
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(50);	   	 		// Retard de 0,2 s
	TRISC = 0b00100000;			// Posem RC5 (sortida del PWM) com a entrada
						// O sigui, silenci
	__delay_ms(50);	   		 	// Retard de 0,2 s
}
void inici (void){
	musica_inici();
	Sortida[1] = 0x01;			// Filera 1
	Sortida[3] = 0x01;
	Sortida[5] = 0x01;
	Sortida[0] = 0b00000000;		// Vermells
	Sortida[2] = 0b00000000;		// Verds
	Sortida[4] = 0b11111111;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x02;			// Filera 2
	Sortida[3] = 0x02;
	Sortida[5] = 0x02;
	Sortida[0] = 0b00111100;		// Vermells
	Sortida[2] = 0b00000000;		// Verds
	Sortida[4] = 0b11000011;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x03;			// Filera 3
	Sortida[3] = 0x03;
	Sortida[5] = 0x03;
	Sortida[0] = 0b00000100;		// Vermells
	Sortida[2] = 0b00000000;		// Verds
	Sortida[4] = 0b11111011;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x04;			// Filera 4
	Sortida[3] = 0x04;
	Sortida[5] = 0x04;
	Sortida[0] = 0b00111100;		// Vermells
	Sortida[2] = 0b00000000;		// Verds
	Sortida[4] = 0b11000011;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x05;			// Filera 5
	Sortida[3] = 0x05;
	Sortida[5] = 0x05;
	Sortida[0] = 0b00000100;		// Vermells
	Sortida[2] = 0b00000000;		// Verds
	Sortida[4] = 0b11111011;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x06;			// Filera 6
	Sortida[3] = 0x06;
	Sortida[5] = 0x06;
	Sortida[0] = 0b00111100;		// Vermells
	Sortida[2] = 0b00000000;		// Verds
	Sortida[4] = 0b11000011;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x07;			// Filera 7
	Sortida[3] = 0x07;
	Sortida[5] = 0x07;
	Sortida[0] = 0b00000000;		// Vermells
	Sortida[2] = 0b00000000;		// Verds
	Sortida[4] = 0b11111111;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x08;			// Filera 8
	Sortida[3] = 0x08;
	Sortida[5] = 0x08;
	Sortida[0] = 0b00000000;		// Vermells
	Sortida[2] = 0b00000000;		// Verds
	Sortida[4] = 0b11111111;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
						// Fi de la matriu 1
	__delay_ms(1000);			// Retard d'1,4 s teòrics
						// Correspon a uns 2,8 s
	Sortida[1] = 0x01;			// Filera 1
	Sortida[3] = 0x01;
	Sortida[5] = 0x01;
	Sortida[0] = 0b00000000;		// Vermells
	Sortida[2] = 0b11111111;		// Verds
	Sortida[4] = 0b00000000;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x02;			// Filera 2
	Sortida[3] = 0x02;
	Sortida[5] = 0x02;
	Sortida[0] = 0b00000000;		// Vermells
	Sortida[2] = 0b11000011;		// Verds
	Sortida[4] = 0b00111100;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x03;			// Filera 3
	Sortida[3] = 0x03;
	Sortida[5] = 0x03;
	Sortida[0] = 0b00000000;		// Vermells
	Sortida[2] = 0b11111011;		// Verds
	Sortida[4] = 0b00000100;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x04;			// Filera 4
	Sortida[3] = 0x04;
	Sortida[5] = 0x04;
	Sortida[0] = 0b00000000;		// Vermells
	Sortida[2] = 0b11000011;		// Verds
	Sortida[4] = 0b00111100;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x05;			// Filera 5
	Sortida[3] = 0x05;
	Sortida[5] = 0x05;
	Sortida[0] = 0b00000000;		// Vermells
	Sortida[2] = 0b11111011;		// Verds
	Sortida[4] = 0b00000100;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x06;			// Filera 6
	Sortida[3] = 0x06;
	Sortida[5] = 0x06;
	Sortida[0] = 0b00000000;		// Vermells
	Sortida[2] = 0b11000011;		// Verds
	Sortida[4] = 0b00111100;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x07;			// Filera 7
	Sortida[3] = 0x07;
	Sortida[5] = 0x07;
	Sortida[0] = 0b00000000;		// Vermells
	Sortida[2] = 0b11111111;		// Verds
	Sortida[4] = 0b00000000;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x08;			// Filera 8
	Sortida[3] = 0x08;
	Sortida[5] = 0x08;
	Sortida[0] = 0b00000000;		// Vermells
	Sortida[2] = 0b11111111;		// Verds
	Sortida[4] = 0b00000000;		// Blaus
		Envia3max(Sortida);			// Ho envia al MAX7221
						// Fi de la matriu 1
	__delay_ms(1000);			// Retard d'1,4 s teòrics
						// Correspon a uns 2,8 s
	Sortida[1] = 0x01;			// Filera 1
	Sortida[3] = 0x01;
	Sortida[5] = 0x01;
	Sortida[0] = 0b11111111;		// Vermells
	Sortida[2] = 0b00000000;		// Verds
	Sortida[4] = 0b00000000;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x02;			// Filera 2
	Sortida[3] = 0x02;
	Sortida[5] = 0x02;
	Sortida[0] = 0b11000011;		// Vermells
	Sortida[2] = 0b00111100;		// Verds
	Sortida[4] = 0b00000000;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x03;			// Filera 3
	Sortida[3] = 0x03;
	Sortida[5] = 0x03;
	Sortida[0] = 0b11111011;		// Vermells
	Sortida[2] = 0b00000100;		// Verds
	Sortida[4] = 0b00000000;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x04;			// Filera 4
	Sortida[3] = 0x04;
	Sortida[5] = 0x04;
	Sortida[0] = 0b11000011;		// Vermells
	Sortida[2] = 0b00111100;		// Verds
	Sortida[4] = 0b00000000;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x05;			// Filera 5
	Sortida[3] = 0x05;
	Sortida[5] = 0x05;
	Sortida[0] = 0b11111011;		// Vermells
	Sortida[2] = 0b00000100;		// Verds
	Sortida[4] = 0b00000000;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x06;			// Filera 6
	Sortida[3] = 0x06;
	Sortida[5] = 0x06;
	Sortida[0] = 0b11000011;		// Vermells
	Sortida[2] = 0b00111100;		// Verds
	Sortida[4] = 0b00000000;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x07;			// Filera 7
	Sortida[3] = 0x07;
	Sortida[5] = 0x07;
	Sortida[0] = 0b11111111;		// Vermells
	Sortida[2] = 0b00000000;		// Verds
	Sortida[4] = 0b00000000;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
	Sortida[1] = 0x08;			// Filera 8
	Sortida[3] = 0x08;
	Sortida[5] = 0x08;
	Sortida[0] = 0b11111111;		// Vermells
	Sortida[2] = 0b00000000;		// Verds
	Sortida[4] = 0b00000000;		// Blaus
	Envia3max(Sortida);			// Ho envia al MAX7221
						// Fi de la matriu 1
	__delay_ms(1000);			// Retard d'1,4 s teòrics
						// Correspon a uns 2,8 s
		       
}			
void musica_inici(void){
	TocaNota(141, 71,0);			// LA
	__delay_ms(100);
	TocaNota(189, 95, 0);			// MI
	__delay_ms(100); 
	TocaNota(178, 89, 2);			// FA
	__delay_ms(100); 
	TocaNota(158, 79, 2);			// SOL
	__delay_ms(100);
	TocaNota(178, 89, 2);			// FA
	__delay_ms(100);
	TocaNota(189, 95, 0);			// MI
	__delay_ms(100); 
	TocaNota(212, 106, 2);			// RE
	__delay_ms(100); 
	TocaNota(212, 106, 2);			// RE
	__delay_ms(100);
	TocaNota(178, 89, 2);			// FA
	__delay_ms(100);
	TocaNota(141, 71,0);			// LA
	__delay_ms(100);
	TocaNota(158, 79, 2);			// SOL
	__delay_ms(100);
	TocaNota(178, 89, 2);			// FA
	__delay_ms(100);
	TocaNota(189, 95, 0);			// MI
	__delay_ms(100); 
	TocaNota(178, 89, 2);			// FA
	__delay_ms(100);
	TocaNota(158, 79, 2);			// SOL
	__delay_ms(100);
	TocaNota(141, 71,0);			// LA
	__delay_ms(100);
	TocaNota(178, 89, 2);			// FA
	__delay_ms(100);
	TocaNota(212, 106, 2);			// RE
	__delay_ms(100);
	TocaNota(212, 106, 2);			// RE
	__delay_ms(100);
}
int linia(color){
	int r = 0;
	for (int i = 0; i<3; i++){
		if ((Matriu[i][0] == color) && (Matriu[i][1] == color) && (Matriu[i][2] == color))
			r = 1;
	}
	for (int i=0; i<3; i++) {
		if ((Matriu[0][i] == color) && (Matriu[1][i] == color) && (Matriu[2][i] == color))
			r = 1;
	}
	if (((Matriu[0][0] == color) && (Matriu[1][1] == color) && (Matriu[2][2] == color))
		|| ((Matriu[0][2] == color) && (Matriu[1][1] == color) && (Matriu[2][0] == color)))
		r = 1;
	return r;    
}
void missatge_final(char color){
	int k = 0;
	while (k<1){
		Cursor (2,1);
		EnviaL('G');
		EnviaL('U');
		EnviaL('A');
		EnviaL('N');
		EnviaL('Y');
		EnviaL('A');
		EnviaL('D');
		EnviaL('O');
		EnviaL('R');
		musica_final();
		if (color == 1){
			n1++;
			Sortida[1] = 0x01;		// Filera 1
			Sortida[3] = 0x01;
			Sortida[5] = 0x01;
			Sortida[0] = 0b00001000;	// Vermells
			Sortida[2] = 0b00000000;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x02;		// Filera 2
			Sortida[3] = 0x02;
			Sortida[5] = 0x02;
			Sortida[0] = 0b00011000;	// Vermells
			Sortida[2] = 0b00000000;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x03;		// Filera 3
			Sortida[3] = 0x03;
			Sortida[5] = 0x03;
			Sortida[0] = 0b00101000;	// Vermells
			Sortida[2] = 0b00000000;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x04;		// Filera 4
			Sortida[3] = 0x04;
			Sortida[5] = 0x04;
			Sortida[0] = 0b01001000;	// Vermells
			Sortida[2] = 0b00000000;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x05;		// Filera 5
			Sortida[3] = 0x05;
			Sortida[5] = 0x05;
			Sortida[0] = 0b00001000;	// Vermells
			Sortida[2] = 0b00000000;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x06;		// Filera 6
			Sortida[3] = 0x06;
			Sortida[5] = 0x06;
			Sortida[0] = 0b00001000;	// Vermells
			Sortida[2] = 0b00000000;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x07;		// Filera 7
			Sortida[3] = 0x07;
			Sortida[5] = 0x07;
			Sortida[0] = 0b00001000;	// Vermells
			Sortida[2] = 0b00000000;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x08;		// Filera 8
			Sortida[3] = 0x08;
			Sortida[5] = 0x08;
			Sortida[0] = 0b00000000;	// Vermells
			Sortida[2] = 0b00000000;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
							// Fi de la matriu 1
			__delay_ms(1400);		// Retard d'1,4 s teòrics
		}
		if (color == 2){
			n2++;
			Sortida[1] = 0x01;		// Filera 1
			Sortida[3] = 0x01;
			Sortida[5] = 0x01;
			Sortida[0] = 0b00000000;	// Vermells
			Sortida[2] = 0b00111100;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x02;		// Filera 2
			Sortida[3] = 0x02;
			Sortida[5] = 0x02;
			Sortida[0] = 0b00000000;	// Vermells
			Sortida[2] = 0b00000100;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x03;		// Filera 3
			Sortida[3] = 0x03;
			Sortida[5] = 0x03;
			Sortida[0] = 0b00000000;	// Vermells
			Sortida[2] = 0b00000100;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x04;		// Filera 4
			Sortida[3] = 0x04;
			Sortida[5] = 0x04;
			Sortida[0] = 0b00000000;	// Vermells
			Sortida[2] = 0b00111100;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x05;		// Filera 5
			Sortida[3] = 0x05;
			Sortida[5] = 0x05;
			Sortida[0] = 0b00000000;	// Vermells
			Sortida[2] = 0b00100000;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x06;		// Filera 6
			Sortida[3] = 0x06;
			Sortida[5] = 0x06;
			Sortida[0] = 0b00000000;	// Vermells
			Sortida[2] = 0b00100000;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x07;		// Filera 7
			Sortida[3] = 0x07;
			Sortida[5] = 0x07;
			Sortida[0] = 0b00000000;	// Vermells
			Sortida[2] = 0b00111100;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
			Sortida[1] = 0x08;		// Filera 8
			Sortida[3] = 0x08;
			Sortida[5] = 0x08;
			Sortida[0] = 0b00000000;	// Vermells
			Sortida[2] = 0b00000000;	// Verds
			Sortida[4] = 0b00000000;	// Blaus
			Envia3max(Sortida);		// Ho envia al MAX7221
							// Fi de la matriu 2
			__delay_ms(1400);		// Retard d'1,4 s teòrics
							// Correspon a uns 2,8 s
		}
		musica_final();
		k++;
	}
}
void musica_final(void){
	TocaNota(238, 119, 2);
	__delay_ms(10);
	TocaNota(238, 119, 2);
	__delay_ms(10);
	TocaNota(189, 95, 0);
	__delay_ms(20);
	TocaNota(158, 79, 2);
	__delay_ms(10);
	TocaNota(189, 95, 0);
	__delay_ms(10);
	TocaNota(158, 79, 2);
	__delay_ms(200);
}

 

 

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