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

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