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 <xc.h> // Carrega el fitxer de funcions necessari per al compilador XC8 #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 Taulell[3][3]; // Variable que representa el taulell de 9 posicions char color[3][2]; // matriu de color verd C1 i blau C2 char i; // Variable que representa la posició // i de la fitxa actual en joc al Taulell char j; // Variable que representa la posició // j de la fitxa actual en joc al Taulell bit Torn; // Si val 0 serà el Torn del Jugador 1, // si val 1 serà el torn del Jugador 2 bit Premut; char Polsat; // mirem si s'ha polsat algun polsador char compta=0;
// Definició de les funcions que farem servir void Envia3max(char Valor[6]); // Envia un joc de valors als tres MAX7221 void Ini3max(void); // Inicialitza els tres MAX7221 void Inici(void); // Apaga tots els LED char Polsador(void); char Atrapat(void); char Fi_joc(void);; char Final(void); void Apaga1(void); // funcio que pinta la pantalla de color verd void Apaga2(void); // funcio que pinta pantalla de color vermell 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); // Posiciona el cursor (filera 1 a 2 i // columna 1 a 32, segons pantalla)
void main (void) {
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
ADCON1 = 0b00010000; // Posa el conversor a 1/8 de la freqüència
ADCON0 = 0b00001001; // Activa el conversor A/D connectat a AN2
// amb el resultat justificat per l'esquerra
PORTC = 0; // Inicialitza a 0 el port C
PORTB = 0; // Inicialitza a 0 el port B
Torn = 0;
i = 2;
j = 2;
Ini3max(); // Inicialitza els tres MAX7221
Inici(); // Apaga tots els LED
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) {
Polsat = Polsador(); // Llegim els polsadors
if(Fi_joc() == 1){ // tres en línia i no s'ha acabat el joc
if(Torn == 0){
do{
Apaga2();
} while(1);
}
else if (Torn == 1){
do{
Apaga1();
} while(1);
}
}
if(Final()==1){ // tot el taulell ple
for (int a = 0; a < 3; a++){
for (int b = 0; b < 3; b++){
if(Taulell[i][j]!=Taulell[a][b]){
i=a;
j=b;
a=3;
b=3;
}
}
}
if (Fi_joc()==3){ //taulell ple i 3 en linia
if (Torn==0){
do{
Apaga1();
} while(1);
}
else if(Torn==1){
do{
Apaga2();
} while(1);
}
} else if(Fi_joc()==2){
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;
do{
Esborra();
EnviaL('E'); // Lletra
EnviaL('M'); // Lletra
EnviaL('P'); // Lletra
EnviaL('A'); // Lletra
EnviaL('T'); // Lletra
EnviaL('E');
_delay(10000);
} while(1);
}
} else if (Atrapat() == 4){
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(); // Esborra la pantalla i posa el cursor a l'inici
EnviaL('P'); // Lletra
EnviaL('1'); // Lletra
EnviaL('-'); // Lletra
EnviaL('T'); // Lletra
EnviaL('O'); // Lletra
EnviaL('-');
EnviaL('E'); // Lletra
EnviaL('X'); // Lletra
EnviaL('I');
EnviaL('T');
Cursor(2,1); // saltem de línia a la pantalla
EnviaL('P'); // Lletra
EnviaL('5'); // Lletra
EnviaL('-');
EnviaL('O'); // Lletra
EnviaL('K'); // Lletra
_delay(50000);
do{ // Fem un bucle perqué es quedi aqui
// mentre no es pitja cap polsador
Polsat = Polsador();
} while(Polsador() != 1 | Polsador() != 5); // Condició, si es pitja el polsador 1
// o 5 sortirà del bucle
Esborra();
if (Polsat == 1){ // S'hi s'ha pitjat 1, el canviarà de posició
// a la més propera que estigui buida
PORTC = 0b00000001;
_delay(100000);
PORTC = 0b00000000;
for(int a = 0;a < 3;a++){ // bucle que recorre totes
// les fitxes de la partida
for (int b = 0; b<3 ;b++){
if (Taulell[2-a][2-b] == 0){ // es comprova si
// alguna està buida
Taulell[i][j]=0;
if (Torn == 0){
Taulell[2-a][2-b] = 1;
} else if (Torn == 1){
Taulell[2-a][2-b] = 2;
}
i = 2-a;
j = 2-b;
a=3;
b=3;
} else{
;
}
}
}
} else if(Polsat == 5){ // i s'ha pitjat el polsador 5, col·locarà
// la fitxa en aquella casella
compta++;
PORTC = 0b00001111; // i posarà la nova fitxa de l'altre
// jugador en la primera casella buida
_delay(100000);
PORTC = 0b00000000; // que trobi seguint l'ordre: comença
// per la casella inferior dreta
Torn = ~Torn; // en l'ordre invers dels índexs:
// (2,2), (2,1), (2,0), (1,2),
// (1,1), (1,0), (0,2), (0,1) i (0,0)
for (int a = 0; a < 3; a++){
for (int b = 0; b < 3; b++){
if (Taulell[2-a][2-b] == 0){
i = 2-a;
j = 2-b;
a=3;
b=3;
} else{
;
}
}
}
if (Torn == 0){ // si es torn dels verdes
// posem fitxa verda
Taulell[i][j] = 1;
} else if(Torn == 1){ // si es torn del blaus
// posem fitxa blava
Taulell[i][j] = 2;
}
}
} else{
if(Polsat == 0){
;
} else if (Polsat == 1){
PORTC = 0b00000001;
_delay(100000);
PORTC = 0b00000000;
if( i==0 ){ // si la fitxa està a la filera 1
if(Taulell[i+2][j] == 0){ // si la pos 13 està buida
Taulell[i+2][j] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // la posició anterior la posem buida
i = i + 2; // actualitzem posició fitxa actual
} else{ // si la pos 13 està ocupada
if(Taulell[i+1][j] == 0){ // miro si pos 12
// està buida
Taulell[i+1][j] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // l'anterior la
// posem buida
i = i+1; // actualitzem posició fitxa actual
} else{
; // si 12 està ocupada no fem res.
}
}
} else if(i==1){ // si estic a la filera 2
if (Taulell[i-1][j] == 0){ // si la pos 11 està buida
Taulell[i-1][j] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // la posició anterior la posem buida
i = i-1; // actualitzem posició fitxa actual
} else{ // si la pos 11 està ocupada, miro la 13
if(Taulell[i+1][j] == 0){ // si està buida
Taulell[i+1][j] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // l'anterior la
// posem buida
i = i+1; // actualitzem posició fitxa actual
} else{ // si no està buida no fem res.
;
}
}
} else if( i==2){ // si estem a la filera 3
if (Taulell[i-1][j] == 0){ // si la pos 12 està buida
Taulell[i-1][j] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // la posició anterior la posem buida
i = i-1; // actualitzem posició fitxa actual
} else{ // si la pos 12 està ocupada, mirem la 11
if(Taulell[i-2][j] == 0){ // si està buida
Taulell[i-2][j] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // l'anterior la
// posem buida
i = i-2; // actualitzem posició fitxa actual
} else{
; // si 2 per sota ocupada no fem res.
}
}
}
} else if(Polsat == 2){
PORTC = 0b00000010;
_delay(100000);
PORTC = 0b00000000;
if( i== 0){ // si la fitxa està a la filera 1
if (Taulell[i+1][j] == 0){ // si la pos 12 buida
Taulell[i+1][j] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // la posició anterior la posem buida
i = i+1; // actualitzem posició fitxa actual
} else{ // si la pos 12 està ocupada
if(Taulell[i+2][j] == 0){ // si la pos 13
// està buida
Taulell[i+2][j] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // l'anterior la
// posem buida
i = i+2; // actualitzem posició fitxa actual
} else{
; // si 13 ocupada no fem res.
}
}
} else if( i==1 ){ // si estic a la filera 2
if (Taulell[i+1][j] == 0){ // si la pos 13 buida
Taulell[i+1][j]= Taulell[i][j]; // la posem
Taulell[i][j] = 0; // la posició anterior la posem buida
i = i+1; // actualitzem posició fitxa actual
} else{ // si la pos 13 està ocupada, miro la 11
if(Taulell[i-1][j] == 0){ // si està buida
Taulell[i-1][j] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // l'anterior la
// posem buida
i = i-1; // actualitzem posició fitxa actual
} else{ // si no està buida no fem res.
;
}
}
} else if (i==2){ // si estem a la filera 3
if (Taulell[i-2][j] == 0){ // si la pos 11 està buida
Taulell[i-2][j] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // la posició anterior la posem buida
i = i - 2; // actualitzem posició fitxa actual
} else{ // si la pos 11 està ocupada, mirem 12 per sota
if(Taulell[i-1][j] == 0){ // si la de 12
// està buida
Taulell[i-1][j] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // l'anterior la
// posem buida
i = i-1; // actualitzem posició fitxa actual
} else{
; // si 2 per sota ocupada no fem res.
}
}
}
} else if(Polsat == 3){
PORTC = 0b00000100;
_delay(100000);
PORTC = 0b00000000;
if( j==0 ){ // si estic a la columna 1
if (Taulell[i][j+2] == 0){ // si la pos de la dreta del tot buida
Taulell[i][j+2] = Taulell[i][j]; //la posem
Taulell[i][j] = 0; // la posició anterior la posem buida
j = j + 2; // actualitzem posició fitxa actual
} else{ // si la pos de dreta del tot està ocupada, miro la del mig
if(Taulell[i][j+1] == 0){ // si està buida
Taulell[i][j+1] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // l'anterior la
// posem buida
j = j+1; // actualitzem posició fitxa actual
} else{ // si no està buida no fem res.
;
}
}
} else if( j==1 ){ // si estic a la columna 2
if (Taulell[i][j-1] == 0){ // si la pos de l'esquerra buida
Taulell[i][j-1] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // la posició anterior la posem buida
j = j - 1; // actualitzem posició fitxa actual
} else{ // si la pos de l'esquerra està ocupada, miro la de la dreta
if(Taulell[i][j+1] == 0){ // si està buida
Taulell[i][j+1] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // l'anterior la
// posem buida
j = j+1; // actualitzem posició fitxa actual
} else{ // si no està buida no fem res.
;
}
}
} else if( j==2 ){ // si estic a la columna 3
if (Taulell[i][j-1] == 0){ // si la pos de l'esquerra buida
Taulell[i][j-1] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // la posició anterior la posem buida
j = j-1; // actualitzem posició fitxa actual
} else{ // si la pos de l'esquerra està ocupada,
// miro la de l'esquerra del tot
if(Taulell[i][j-2] == 0){ // si està buida
Taulell[i][j-2] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // l'anterior la
// posem buida
j = j-2; // actualitzem posició fitxa actual
} else{ // si no està buida no fem res.
;
}
}
}
} else if(Polsat == 4){
PORTC = 0b00001000;
_delay(100000);
PORTC = 0b00000000;
if( j==0 ){ // si estic a la columna 1
if (Taulell[i][j+1] == 0){ // si la pos de la dreta està buida
Taulell[i][j+1] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // la posició anterior la posem buida
j = j+1; // actualitzem posició fitxa actual
} else{ // si la pos de dreta està ocupada, miro la de la dreta del tot
if(Taulell[i][j+2] == 0){ // si està buida
Taulell[i][j+2] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // l'anterior la
// posem buida
j = j+2; // actualitzem posició fitxa actual
} else{ // si no està buida no fem res.
;
}
}
} else if( j==1 ){ // si estic a la columna 2
if (Taulell[i][j+1] == 0){ // si la pos de la dreta està buida
Taulell[i][j+1] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // la posició anterior la posem buida
j = j+1; // actualitzem posició fitxa actual
} else{ // si la pos la dreta està ocupada, miro la de l'esquerra
if(Taulell[i][j-1] == 0){ // si està buida
Taulell[i][j-1] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // l'anterior la posem buida
j = j-1; // actualitzem posició fitxa actual
} else{ // si no està buida no fem res.
;
}
}
} else if( j==2 ){ // si estic a la columna 3
if (Taulell[i][j-2] == 0){ // si la pos de l'esquerra
// del tot està buida
Taulell[i][j-2] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // la posició anterior la posem buida
j = j-2; // actualitzem posició fitxa actual
} else{ // si la pos de l'esquerra del tot està
// ocupada, miro la del mig
if(Taulell[i][j-1] == 0){ // si està buida
Taulell[i][j-1] = Taulell[i][j]; // la posem
Taulell[i][j] = 0; // l'anterior la
// posem buida
j = j-1; // actualitzem posició fitxa actual
} else{ // si no està buida no fem res.
;
}
}
}
} else if(Polsat == 5){ // si s'ha pitjat el polsador 5
compta++;
PORTC = 0b00001111;
_delay(100000);
PORTC = 0b00000000;
Torn = ~Torn;
for (int a = 0; a < 3; a++){
for (int b = 0; b < 3; b++){
if (Taulell[2-a][2-b] == 0){
i = 2-a;
j = 2-b;
a=3;
b=3;
} else{
;
}
}
}
if (Torn == 0){ // si es torn dels verdes posem fitxa verda
Taulell[i][j] = 1;
if(compta == 8 && Fi_joc()==3){
do{
Apaga2();
} while(1);
}
} else{ // si es torn del blaus posem fitxa blava
Taulell[i][j] = 2;
if (compta==8 && Fi_joc()==3){
do{
Apaga1();
} while(1);
}
}
}
}
for (int f = 0; f < 3; f++){
for (int c = 0; c <: 3; c++){
int a = 3*(c+1) - 3;
int b = 8 - a;
if(Taulell[f][c] == 1){ // si el color és verd
color[f][0] = color[f][0] | (0b11000000 >> a);
// activo els bits que toquen del color verd
color[f][1] = color[f][1] & ((0b00111111 >> a) | (0b00111111 << b));
// apago el color blau
} else if(Taulell[f][c] == 2){ // si el color és blau
color[f][0] = color[f][0] & ((0b00111111 >> a) | (0b00111111 << b));
// apago el color verd
color[f][1] = color[f][1] | (0b11000000 >> a);
// activo els bits que toquen del color blau
} else{ // si està buida la posició, és a dir, LED apagats
color[f][0] = color[f][0] & ((0b00111111 >> a) | (0b00111111 << b));
// apago color verd
color[f][1] = color[f][1] & ((0b00111111 >> a) | (0b00111111 << b));
// apago color blau
}
}
}
Sortida[1] = 0x01; // Enviem els bytes de la matriu color que correspon a l'estat dels LED
Sortida[3] = 0x01; // en la matriu en funció de les fitxes que hi ha col·locades al Taulell.
Sortida[5] = 0x01;
Sortida[0] = 0b00100100;
Sortida[2] = color[0][0];
Sortida[4] = color[0][1];
Envia3max(Sortida);
Sortida[1] = 0x02;
Sortida[3] = 0x02;
Sortida[5] = 0x02;
Sortida[0] = 0b00100100;
Sortida[2] = color[0][0];
Sortida[4] = color[0][1];
Envia3max(Sortida);
Sortida[1] = 0x04;
Sortida[3] = 0x04;
Sortida[5] = 0x04;
Sortida[0] = 0b00100100;
Sortida[2] = color[1][0];
Sortida[4] = color[1][1];
Envia3max(Sortida);
Sortida[1] = 0x05;
Sortida[3] = 0x05;
Sortida[5] = 0x05;
Sortida[0] = 0b00100100;
Sortida[2] = color[1][0];
Sortida[4] = color[1][1];
Envia3max(Sortida);
Sortida[1] = 0x07;
Sortida[3] = 0x07;
Sortida[5] = 0x07;
Sortida[0] = 0b00100100;
Sortida[2] = color[2][0];
Sortida[4] = color[2][1];
Envia3max(Sortida);
Sortida[1] = 0x08;
Sortida[3] = 0x08;
Sortida[5] = 0x08;
Sortida[0] = 0b00100100;
Sortida[2] = color[2][0];
Sortida[4] = color[2][1];
Envia3max(Sortida);
_delay(1000);
if (Fi_joc() == 0){ // no tres en línia ni empat, segueix el joc
;
}
}
}
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
}
}
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 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 d = 5; d >= 0; d--){ // Hem d'enviar 6 bytes
for (int k = 1; k < 9; k++){ // De 8 bits
Temp = Valor[d] & 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[d] = Valor[d] << 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
}
char Final(void){
for(int a = 0;a < 3;a++){ // bucle que recorre totes les fitxes de la partida
for (int b = 0; b<3 ;b++){
if (Taulell[a][b] == 0){
return 0;
}
}
}
return 1;
}
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 Apaga1(void) { // ENCEN tots els LED de color verd
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] = 0b11111111; // Verds
Bytes[4] = 0x00; // Blaus
Envia3max(Bytes); // Els envia
}
}
void Apaga2(void) { // ENCEN tots els LED de color blau
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] = 0b11111111; // Blaus
Envia3max(Bytes); // Els envia
}
}
void Inici(void) { // Apaga tots els LED
Taulell[2][2] = 1;
char Bytes[6]; // Els sis bytes que cal enviar
for (int r = 0; r <= 8; r++){ // Hem d'enviar 8 fileres
if (r == 0){ // si és la filera 3 pintals tots de vermell
Bytes[1] = r; // Filera
Bytes[3] = r;
Bytes[5] = r;
Bytes[0] = 0b11111111; // Vermells
Bytes[2] = 0b00000011; // Verds
Bytes[4] = 0x00; // Blaus
Envia3max(Bytes);
}
if (r == 1){ // si és la filera 3 pintals tots de vermell
Bytes[1] = r; // Filera
Bytes[3] = r;
Bytes[5] = r;
Bytes[0] = 0b11111111; // Vermells
Bytes[2] = 0b00000011; // Verds
Bytes[4] = 0x00; // Blaus
Envia3max(Bytes);
}
if (r == 3){ // si és la filera 3 pintals tots de vermell
Bytes[1] = r; // Filera
Bytes[3] = r;
Bytes[5] = r;
Bytes[0] = 0b11111111; // Vermells
Bytes[2] = 0x00; // Verds
Bytes[4] = 0x00; // Blaus
Envia3max(Bytes);
} else if (r == 6){ // si és la filera 6 pintals tots de vermell
Bytes[1] = r; // Filera
Bytes[3] = r;
Bytes[5] = r;
Bytes[0] = 0b11111111; // Vermells
Bytes[2] = 0x00; // Verds
Bytes[4] = 0x00; // Blaus
Envia3max(Bytes);
} else if (r==7){ // inicialment apareix fitxa verda avall dreta
Bytes[1] = r; // Filera
Bytes[3] = r;
Bytes[5] = r;
Bytes[0] = 0b00100100; // Vermells
Bytes[2] = 0b00000011; // Verds
Bytes[4] = 0x00; // Blaus
Envia3max(Bytes);
} else if (r==8){ // inicialment apareix fitxa verda avall dreta
Bytes[1] = r; // Filera
Bytes[3] = r;
Bytes[5] = r;
Bytes[0] = 0b00100100; // Vermells
Bytes[2] = 0b00000011; // Verds
Bytes[4] = 0x00; // Blaus
Envia3max(Bytes);
} else{ // si és cap filera de les altres
Bytes[1] = r; // Filera
Bytes[3] = r;
Bytes[5] = r;
Bytes[0] = 0b00100100; // Vermells
Bytes[2] = 0x00; // Verds
Bytes[4] = 0x00; // Blaus
Envia3max(Bytes);
}
}
}
char Polsador(void) { //detecta quin pulsador està premut
char Pols = 0;
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 Atrapat(void){ // detecta si alguna de les fitxes esta atrapada en el taulell
unsigned char compta = 0; // si aquest comptador arriba 4, la fitxa estarà atrapada (2 posicions
for (int b = 0;b < 3;b++){ // ocupades de la seva filera i 2 més de la seva columna).
if (b!=j){ // Miro les posicions de la filera
if (Taulell[i][b] != 0){
compta++; // si està ocupada sumo 1 a compta
}
}
if (b!=i){ // Miro les posicions de la columna
if (Taulell[b][j] != 0){
compta++; // si està ocupada sumo 1 a compta
}
}
}
return compta; // retorno compta
}
char Fi_joc(){ // funcio que detecta en quin moment de la partida ens trobem
unsigned char compta;
compta = 0;
for(int a=0;a<3;a++){
if(Taulell[a][0] == Taulell[a][1] && Taulell[a][1] == Taulell[a][2] && Taulell[a][0] != 0 && compta == 0 && a!=i){
compta++; // Si hi ha tres en línia en fileres sumo 1 a compta
} else if(Taulell[0][a] == Taulell[1][a] && Taulell[1][a] == Taulell[2][a] && Taulell[0][a] != 0 && compta == 0 && a!=j){
compta++; // si hi ha tres en línia en columna sumo 1 a compta
}
}
if(Taulell[0][0] == Taulell[1][1] && Taulell[1][1]== Taulell[2][2] && Taulell[0][0] != 0 && compta ==0 && i!=j){
compta++; // Si hi ha tres en línia en una diagonal sumo 1 a compta
} else if(Taulell[2][0] == Taulell[1][1] && Taulell[1][1] == Taulell[0][2] && Taulell[2][0] != 0 && compta == 0){
if (i == 1 && j == 1){
;
} else if(i==0 && j == 2){
;
} else if(i == 2 && j == 0){
;
} else{
compta++; // si hi ha tres en línia en l'altra diagonal sumo 1 a compta
}
} else{
compta = compta; // si no hi ha 3 en línia no sumis res a compta
//Taules (empat)!!
}
for (int a=0; a<3; a++){ // recorrem taulell per veure estat de la matriu
for (int b=0; b<3; b++){
if (Taulell[a][b] == 0){
return compta;
} else if(Taulell[a][b] != 0){
;
}
}
}
compta=compta+2;
return compta;
}

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