Programació en C del PIC 16F690

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

Mastermind electrònic

Programa del grup 1

En aquest cas és el segon jugador qui posa la combinació de colors que s'ha d'encertar i qui fa la correcció de cada tirada. Hi ha un límit de set o quatre tirades (segons el mode de joc) per encertar la combinació. 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 colors disponibles són vermell, verd, blau, groc i cian. A cada un dels polsadors de la part inferior correspon a un d'aquests polsadors, quan el premem situa el color a la posició actual. Per a la correcció es fan servir els colors verd (color i posició correctes), blau (color correcte però en posició incorrecta) i vermell (color incorrecte). A l'inici del joc es pot escollir si es farà servir o no el color blau. Durant la partida es mostra la combinació guanyadora, per tant cal preveure una cartolina fosca per tapar-la.

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
#define Polsador0   RA3		// Li assigna un nom a l'adreça del polsador
char a;
char Sortida[6];				// Valors a enviar al MAX7221 (48 bits)
char Actiu;// Variable que diu quin color està actiu
char M[8][8]={{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0}};	// Tenim una matriu de quatre fileres i vuit columnes // Fila de la matriu	
char y; // Columna de la matriu
char o;
char p;
char q;
char a;
char t;
char c;
char b;
char B;
char T;
char x;
char com[4];
char Polsad;
char Polsador(void);// Funció de lectura dels polsadors
void Envia3max(char Val[6]);			// Envia un joc de valors als tres MAX7221 desactivant interrupcions
void Envia_max(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 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
void TocaNota(char ValPR2, char ValCCPR1L, char ValDC1B);
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 = 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;
	CCP1CON = 0b00001100;
	CCPR1L = 49;
	PIR1bits.TMR2IF = 0;
	T2CON = 0b00000011;
	ADCON1 = 0b00010000;			// Posa el conversor a 1/8 de la freqüència
	ADCON0 = 0b00001001;			// Inicialitza a 0 el port B
	__delay_ms(1000);
	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
	Apaga();// Apaga tots els LED
	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ó
	RCSTAbits.SPEN = 0;			// desactiva comunicació sèrie
	TXSTAbits.TXEN = 0;			// desactiva comunicació
	Esborra();				// Esborra la pantalla i posa el cursor a l'inici
	EnviaL('E');				// Lletra
	EnviaL('S');				// Lletra
	EnviaL('C');				// Lletra
	EnviaL('U');				// Lletra
	EnviaL('L');				// Lletra
	EnviaL('L');
	EnviaL(' ');	
	EnviaL('M');				// Lletra
	EnviaL('O');				// Lletra
	EnviaL('D');				// Lletra
	EnviaL('E');				// Lletra
	Cursor(2,1);
	EnviaL('1');
	EnviaL(' ');
	EnviaL(' ');
	EnviaL(' ');
	EnviaL('2');
	T=1;
	while(T==1){
		Polsad = Polsador();		// Llegim els polsadors
		if (Polsad == 1) {	
			Esborra();		// Esborra la pantalla i posa el cursor a l'inici
			EnviaL('M');		// Lletra
			EnviaL('O');		// Lletra
			EnviaL('D');		// Lletra
			EnviaL('E');
			EnviaL(' ');		// Lletra
			EnviaL('1');		// Lletra
			T=2;
			x=1;
		} else if (Polsad == 2) {	
			Esborra();		// Esborra la pantalla i posa el cursor a l'inici
			EnviaL('M');		// Lletra
			EnviaL('O');		// Lletra
			EnviaL('D');		// Lletra
			EnviaL('E');
			EnviaL(' ');		// Lletra
			EnviaL('2');		// Lletra
			T=2;
			x=2;
		}
	}
	__delay_ms(300);
	while(x==1){
		o=0b00000000;
		p=0b00000000;
		q=0b00000000;
		y=0; //columna
		c=0; //fila
		B=1;
		while (B==1) {
			b=0;
			Polsad = Polsador();	// Llegim els polsadors
			if (Polsad == 1) {				
				M[c][y]=1;
				b=1;
			}
			if (Polsad == 2) {				
				M[c][y]=2;	
				b=1;
			}
			if (Polsad == 3) {				
				M[c][y]=3;
				b=1;	
   
			}
			if (Polsad == 4) {				
				M[c][y]=4;
				b=1;
			}
			if (Polsad == 5) {				
				M[c][y]=5;
				b=1;
			}
			if (b==1) {
				b=0;
				t=7;
				for (char e=0;e<8;e+=1){
					a=M[c][e];
					if (a==1){
						o=o|(1<<t);
					}
					if (a==2){
						p=p|(1<<t);
					}
					if (a==3){
						q=q|(1<<t);
					}
					if (a==4){
						o=o|(1<<t);
						p=p|(1<<t);
					}
					if (a==5){
						p=p|(1<<t);
						q=q|(1<<t);
					}
					if (a==0){
						p=p|(0<<t);
						q=q|(0<<t);
						o=o|(0<<t);
					}
					t=t-1;	
				}
				Sortida[1]=c+1;
				Sortida[3]=c+1;
				Sortida[5]=c+1;
				Sortida[0]=o;
				Sortida[2]=p;
				Sortida[4]=q;
				o=0b00000000;
				p=0b00000000;
				q=0b00000000;
				Envia3max(Sortida);
				__delay_ms(300);
				if ((M[c][4]==2) && (M[c][5]==2) && (M[c][6]==2) && (M[c][7]==2) && (c!=0)){
					B=0;
				}
				if ((c==4)&&(y==7) && ((M[4][4]!=2) || (M[4][5]!=2) || (M[4][6]!=2) || (M[4][7]!=2))){
					B=2;	
				}
				if (y<7) {
					y=y+1;
				}
				else if (y==7) {
					y=0;
					c=c+1;   
				}
			} 
			if (Polsador0 == 0) {
				if (y!=0){
					M[c][y]=0;
					y=y-1;
					__delay_ms(300);
				}
				if (y==0 && c!=0){
					M[c][y]=0;
					c=c-1;
					y=7;
					__delay_ms(300);
				}
			}
		}
		Apaga();
		o=0b00000000;
		p=0b00000000;
		q=0b00000000;
		t=7;
		for (char e=0;e<8;e+=1){
			a=M[0][e];
			if (a==1){
				o=o|(1<<t);
			}
			if (a==2){
				p=p|(1<<t);
			}
			if (a==3){
				q=q|(1<<t);
			}
			if (a==4){
				o=o|(1<<t);
				p=p|(1<<t);
			}
			if (a==5){
				p=p|(1<<);
				q=q|(1<<t);
			}
			if (a==0){
				p=p|(0<<t);
				q=q|(0<<t);
				o=o|(0<t);
			}
			t=t-1;	
		}
		Sortida[1]=1;
		Sortida[3]=1;
		Sortida[5]=1;
		Sortida[0]=o;
		Sortida[2]=p;
		Sortida[4]=q;
		Envia3max(Sortida);
		__delay_ms(300);
		if (B==0){
			TocaNota(141, 71, 0);	// Valor que correspon aproximadament a la3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(178, 89, 2);	// Valor que correspon aproximadament a fa3
			TocaNota(158, 79, 2);	// Valor que correspon aproximadament a sol3
			TocaNota(141, 71, 0);	// Valor que correspon aproximadament a la3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(141, 71, 0);	// Valor que correspon aproximadament a la3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(178, 89, 2);	// Valor que correspon aproximadament a fa3
			TocaNota(158, 79, 2);	// Valor que correspon aproximadament a sol3
			TocaNota(141, 71, 0);	// Valor que correspon aproximadament a la3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(178, 89, 2);	// Valor que correspon aproximadament a fa3
			TocaNota(158, 79, 2);	// Valor que correspon aproximadament a sol3
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(158, 79, 2);	// Valor que correspon aproximadament a sol3
			TocaNota(238, 119, 2);	// Valor que correspon aproximadament a do3
			TocaNota(178, 89, 2);	// Valor que correspon aproximadament a fa3
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(158, 79, 2);	// Valor que correspon aproximadament a sol3
			TocaNota(238, 119, 2);	// Valor que correspon aproximadament a do3
			TocaNota(178, 89, 2);	// Valor que correspon aproximadament a fa3
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			__delay_ms(200);	// Retard de 0,2 s
		}
		if (B==2){
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(238, 119, 2);	// Valor que correspon aproximadament a do3
			__delay_ms(200);	// Retard de 0,2 s
		}
		x=0;
	}	
	while(x==2){
		o=0b00000000;
		p=0b00000000;
		q=0b00000000;
		y=0; //columna
		c=0; //fila
		B=1;
		while (B==1) {
			b=0;
			Polsad = Polsador();	// Llegim els polsadors
			if (Polsad == 1) {				
				M[c][y]=1;
				b=1;
			}
			if (Polsad == 2) {				
				M[c][y]=2;	
				b=1;
			}
			if (Polsad == 3) {				
				M[c][y]=3;
				b=1;	
			}
			if (Polsad == 4) {				
				M[c][y]=4;
				b=1;
			}
			if (Polsad == 5) {				
				M[c][y]=5;
				b=1;
			}
			if (b==1) {
				b=0;
				t=7;
				for (char e=0;e<8;e+=1){
					a=M[c][e];
					if (a==1){
						o=o|(1<<t);
					}
					if (a==2){
						p=p|(1<<t);
					}
					if (a==3){
						q=q|(1<<t);
					}
					if (a==4){
						o=o|(1<<t);
						p=p|(1<<t);
					}
					if (a==5){
						p=p|(1<<t);
						q=q|(1<<t);
					}
					if (a==0){
						p=p|(0<<t);
						q=q|(0<<t);
						o=o|(0<<t);
					}
					t=t-1;	
				}
				Sortida[1]=c+1;
				Sortida[3]=c+1;
				Sortida[5]=c+1;
				Sortida[0]=o;
				Sortida[2]=p;
				Sortida[4]=q;
				o=0b00000000;
				p=0b00000000;
				q=0b00000000;
				Envia3max(Sortida);
				__delay_ms(300);
				if ((M[c][4]==2) && (M[c][5]==2) && (M[c][6]==2) && (M[c][7]==2) && (c!=0)){
					B=0;
				}
				if ((c==7)&&(y==7) && ((M[7][4]!=2) || (M[7][5]!=2) || (M[7][6]!=2) || (M[7][7]!=2))){
					B=2;	
				}
				if (y<7) {
					y=y+1;
				} else if (y==7) {
					y=0;
					c=c+1;   
				}
			} 
			if (Polsador0 == 0) {
				if (y!=0){
					M[c][y]=0;
					y=y-1;
					__delay_ms(300);
				}
				if (y==0 && c!=0){
					M[c][y]=0;
					c=c-1;
					y=7;
					__delay_ms(300);
				}
			}
		}
		Apaga();
		o=0b00000000;
		p=0b00000000;
		q=0b00000000;
		t=7;
		for (char e=0;e<8;e+=1){
			a=M[0][e];
			if (a==1){
				o=o|(1<<t);
			}
			if (a==2){
				p=p|(1<<t);
			}
			if (a==3){
				q=q|(1<<t);
			}
			if (a==4){
				o=o|(1<<t);
				p=p|(1<<t);
			}
			if (a==5){
				p=p|(1<<t);
				q=q|(1<<t);
			}
			if (a==0){
				p=p|(0<<t);
				q=q|(0<<t);
				o=o|(0<<t);
			}
			t=t-1;	
		}
		Sortida[1]=1;
		Sortida[3]=1;
		Sortida[5]=1;
		Sortida[0]=o;
		Sortida[2]=p;
		Sortida[4]=q;
		Envia3max(Sortida);
		__delay_ms(300);
		if (B==0){	
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(178, 89, 2);	// Valor que correspon aproximadament a fa3
			TocaNota(158, 79, 2);	// Valor que correspon aproximadament a sol3
			TocaNota(158, 79, 2);	// Valor que correspon aproximadament a sol3
			TocaNota(178, 89, 2);	// Valor que correspon aproximadament a fa3
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(238, 119, 2);	// Valor que correspon aproximadament a do3
			TocaNota(238, 119, 2);	// Valor que correspon aproximadament a do3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(178, 89, 2);	// Valor que correspon aproximadament a fa3
			TocaNota(158, 79, 2);	// Valor que correspon aproximadament a sol3
			TocaNota(158, 79, 2);	// Valor que correspon aproximadament a sol3
			TocaNota(178, 89, 2);	// Valor que correspon aproximadament a fa3
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(238, 119, 2);	// Valor que correspon aproximadament a do3
			TocaNota(238, 119, 2);	// Valor que correspon aproximadament a do3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(238, 119, 2);	// Valor que correspon aproximadament a do3
			TocaNota(238, 119, 2);	// Valor que correspon aproximadament a do3
			__delay_ms(200);	// Retard de 0,2 s
		}
		if (B==2){
			TocaNota(189, 95, 0);	// Valor que correspon aproximadament a mi3
			TocaNota(212, 106, 2);	// Valor que correspon aproximadament a re3
			TocaNota(238, 119, 2);	// Valor que correspon aproximadament a do3
			__delay_ms(200);	// Retard de 0,2 s
		}
		x=0;
	}
}
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 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
	__delay_ms(100);	   	 	// Retard de 0,1 s
}
void TocaNota1(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
	__delay_ms(200);	   	 	// Retard de 0,2 s
}
void Envia3max(char Val[6]) {			// 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[6]) {			// 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;
	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 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
}

 

 

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