Programació en C del PIC 16F690

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

Sensor de temperatura i humitat

Programa del grup 2

El grup 2 va fer un programa que mostrava la humitat i la temperatura, aquesta en kelvin, graus Celsius i graus Fahrenheit. A més a la matriu LED hi podia mostrar el nivell de temperatura a base de més o menys fileres enceses que tenien un o altre color segons la temperatura. Finalment, la matriu també podia mostrar un sol o un floc de neu segons la temperatura.

El programa d'aquest grup é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 Sens   RA5			// Li assigna un nom a l'adreça del sensor
unsigned int Valor;				// Variable de treball
unsigned int Error;				// Error de lectura
unsigned int Lectura[3];			// Valor llegit
						// Lectura[0] és la suma de comprovació
						// Lectura[1] és la temperatura
						// Lectura[2] és la humitat
unsigned int floquet;
char Negatiu;					// Guarda si el valor de la temperatura és negatiu o positiu
char Sortida[6];				// Valors a enviar al MAX7221 (48 bits)
char Polsat;
char Actiu;					// Variable que diu quin color està actiu
						// Actiu = 0		Apagat
						// Actiu = 1		Vermell
						// Actiu = 2		Verd
						// Actiu = 3		Blau
int CalorProg;
						// Definició de les funcions que farem servir 
char Sensor(void);				// Lectura del sensor. dona 0 si la suma de control és correcta
char Polsador(void);
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 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 escriupantalla(int A);			// Converteix caracters ASCII per ser mostrats a la pantalla
void pantallaLED(int P);
int IntervalTemp(void);
void escriumatriu(int C);
void main (void) {
	TRISC = 0;				// Tot el port C és de sortida
	TRISB = 0;				// Tot el port B és de sortida
	PORTA = 0b00100000;			// RA5 a 1
	T1CON = 0b00100001;			// Configuració de Timer1
						// Com a temporitzador basat en rellotge
						// 10 - Factor d'escala de 4
						// TMR1L s'incrementarà cada 2 us
	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ó
	__delay_ms(1000);			// Retard d'1 s
	Esborra();				// Esborra la pantalla i posa el cursor a l'inici
	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)
	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
						// Correspon a una interrupció cada 7,5 ms
	INTCON = 0b10100000;			// Activem GIE i T0IE
	ADCON1 = 0b00010000;			// Posa el conversor a 1/8 de la freqüència
	ADCON0 = 0b00001001;			// Activa el conversor A/D connectat a AN2
	while (1) {				// Inici del bucle de programa
		OSCCON = 0b01111000;		// IRCF = 111, rellotge a 8 MHz
		INTCONbits.GIE = 0;		// Desactiva les interrupcions momentàniament
		Error = Sensor();
		INTCONbits.GIE = 1;		// Activa les interrupcions momentàniament
		OSCCON = 0b01101000;			// IRCF = 111, rellotge a 8 MHz
		if (Error == 0) {		// Llegeix el sensor i si és correcte segueix
			Polsat=Polsador();
			if (Polsat==1){
				escriupantalla(2);
			} else if (Polsat==2){
				escriupantalla(3);
			} else if (Polsat==3){
				floquet=Lectura[1];
				if (floquet<200){
					pantallaLED(2);
				} else {
					pantallaLED(0);
					pantallaLED(1);
				}  
			} else {
				CalorProg=IntervalTemp();
				escriumatriu(CalorProg);
				escriupantalla(1);
			}    
			escriupantalla(0);
		} else {
			Cursor(2, 16);
			EnviaL('E');
		}
		__delay_ms(200);		// Retard d'1 s
	}
}
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
}
int IntervalTemp (void) {
	unsigned int a;
	a=Lectura[1]/50;
	int Calor=a+1;
	return Calor;
}
void escriumatriu(int C) {
	for (int k = 1; k < 9; k++){
		Sortida[1] = 9 - k;		// Filera
		Sortida[3] = 9 - k;
		Sortida[5] = 9 - k;
		if (C<5) {
			if (C>=k) {
				Sortida[2] = 0b00000000;	// Verds
				Sortida[4] = 0b11111111;	// Blaus
				Sortida[0] = 0b00000000;	// Vermells
			} else {
				Sortida[2] = 0b00000000;	// Verds
				Sortida[4] = 0b00000000;	// Blaus
				Sortida[0] = 0b00000000;	// Vermells
			}
			INTCONbits.GIE = 0;			// Desactiva les interrupcions momentàniament
			Envia3max(Sortida);			// Ho envia al MAX7221
			INTCONbits.GIE = 1;			// Activa les interrupcions momentàniament
		} else if (C>4 && C<7) {
			if (C>=k) {
				Sortida[2] = 0b11111111;	// Verds
				Sortida[4] = 0b00000000;	// Blaus
				Sortida[0] = 0b00000000;	// Vermells
			} else{
				Sortida[2] = 0b00000000;	// Verds
				Sortida[4] = 0b00000000;	// Blaus
				Sortida[0] = 0b00000000;	// Vermells
			}
			INTCONbits.GIE = 0;			// Desactiva les interrupcions momentàniament
			Envia3max(Sortida);			// Ho envia al MAX7221
			INTCONbits.GIE = 1;			// Activa les interrupcions momentàniament
		} else if (C>6) {
			if (C>=k) {
				Sortida[2] = 0b00000000;	// Verds
				Sortida[4] = 0b00000000;	// Blaus
				Sortida[0] = 0b11111111;	// Vermells
			} else {
				Sortida[2] = 0b00000000;	// Verds
				Sortida[4] = 0b00000000;	// Blaus
				Sortida[0] = 0b00000000;	// Vermells
			}
			INTCONbits.GIE = 0;			// Desactiva les interrupcions momentàniament
			Envia3max(Sortida);			// Ho envia al MAX7221
			INTCONbits.GIE = 1;			// Activa les interrupcions momentàniament
		}
	}
}
void escriupantalla(int A) {   
						// Si A=0 HUMITAT; Si A=1 graus centigrads; Si A=2 Kelvin
	char Digits[5];	
	if (A==1){
		Valor = Lectura[1];		// Temperatura
			if (Valor >= 32768) {	// Si el bit més significatiu està activat és negatiu
				Negatiu = 1;			// És negatiu
				Valor = Valor -32768;		// Agafem el valor absolut
			} else {
				Negatiu = 0;			// És positiu
			}
   		} else if (A==2){
			if (Lectura[1] >= 32768) {		// Si el bit més significatiu està activat
				Negatiu = 1;			// És negatiu
				Valor = 2732-Lectura[1];	// Temperatura
				Lectura[1] = Lectura[1] -32768;	// Agafem el valor absolut
			} else {
				Negatiu = 0;			// És positiu
				Valor=Lectura[1]+2732;
			} 
		} else if (A==3){
			Valor = (Lectura[1]*1.8)+320;		// Temperatura
			if (Valor >= 32768) {			// Si el bit més significatiu està activat
				Negatiu = 1;			// És negatiu
				Valor = Valor -32768;		// Agafem el valor absolut
			} else {
				Negatiu = 0;			// És positiu
			}
		} else if (A==0){
			Valor = Lectura[2];	// Humitat
		}
		Digits[0] = Valor % 10;		// Unitats
		Valor = Valor / 10;
		Digits[1] = Valor % 10;		// Desenes
		Valor = Valor / 10;
		Digits[2] = Valor % 10;		// Centenes
		Valor = Valor / 10;
		Digits[3] = Valor % 10;		// Milers
		Digits[4] = Valor / 10;		// Desenes de milers
		if (A>0){
			for (int j = 0; j < 5; j++){		// 5 dígits
				Digits[j] = Digits[j] + '0';	// Li sumem el codi ASCII de 0
			}			// Això és la temperatura multiplicada per 10
			if (Digits[4] == '0') {			// Mirem si el primer dígit és 0
				Digits[4] = ' ';		// Si ho és, hi posem un espai
				if (Digits[3] == '0') {		// I mirem si ho és el segon
					Digits[3] = ' ';	// Si ho és, hi posem un espai
					if (Digits[2] == '0') {	// I mirem si ho és el tercer
						Digits[2] = ' ';		// Si ho és, hi posem un espai
					}			// Els dos darrers zeros els mostrarem sempre
				}
			}
			if (Negatiu) {
				Digits[4] = '-';		// Si és negatiu, posem el -
			}
			Cursor(1, 1);		// Posició
			EnviaL('T');
			EnviaL('E');
			EnviaL('M');
			EnviaL('P');		// Vector amb el número dígit a dígit
			Cursor(1, 8);
			if (A==1) {
				for (int j = 4; j > 0; j--){	// 4 dígits (el 5è és el decimal)
					EnviaL(Digits[j]);	// Número
				}
				EnviaL(',');			// Coma
				EnviaL(Digits[0]);		// Número
				EnviaL(' ');			// Espai
				EnviaL(0b11011111);		// Graus
				EnviaL('C');			// Lletra
			} else if (A==2) {
				for (int j = 4; j > 0; j--){	// 4 dígits (el 5è és el decimal)
					EnviaL(Digits[j]);	// Número
			}
			EnviaL(',');		// Coma
			EnviaL(Digits[0]);	// Número
			EnviaL(' ');		// Espai
			EnviaL('K');		// Lletra
			EnviaL(' ');		// Espai
		} else if (A==3) {
			for (int j = 4; j > 0; j--){		// 4 dígits (el 5è és el decimal
				EnviaL(Digits[j]);		// Número
			}
			EnviaL(',');		// Coma
			EnviaL(Digits[0]);	// Número
			EnviaL(' ');		// Espai
			EnviaL(0b11011111);	// Graus
			EnviaL('F');		// Lletra
		}
	} else if (A==0){
		for (int j = 0; j < 5; j++){			// 5 dígits
			Digits[j] = Digits[j] + '0';		// Li sumem el codi ASCII de 0
		}				// Això és la humitat multiplicada per 10
		if (Digits[4] == '0') {				// Mirem si el primer dígit és 0
			Digits[4] = ' ';			// Si ho és, hi posem un espai
			if (Digits[3] == '0') {			// I mirem si ho és el segon
				Digits[3] = ' ';		// Si ho és, hi posem un espai
				if (Digits[2] == '0') {		// I mirem si ho és el tercer
					Digits[2] = ' ';	// Si ho és, hi posem un espai
				}		// Els dos darrers zeros els mostrarem sempre
			}
		}
		Cursor(2, 1);			// Posició
		EnviaL('H');
		EnviaL('U');
		EnviaL('M');
		EnviaL('I');
		EnviaL('T');
		EnviaL('A');
		EnviaL('T');
		EnviaL(':');
		Cursor(2,8);
		for (int j = 4; j > 0; j--){	// 4 dígits (el 5è és el decimal
			EnviaL(Digits[j]);	// Número
		}
		EnviaL(',');			// Coma
		EnviaL(Digits[0]);		// Número
		EnviaL(' ');			// Espai
		EnviaL('%');			// Tant per cent
	}
}
char Sensor(void) {
	char Bytes[5];				// Vector per a guardar els cinc bytes que envia el sensor
	char Temps;				// Guarda el valor de TMR1L
	for (int j = 0; j < 5; j++){		// 5 bytes
		Bytes[j] = 0;			// Posem el vector a zero
	}
	TRISA = 0b11011111;			// Tot el port A és d'entrada excepte, de moment, RA5
	PORTA = 0b00000000;			// RA5 a 0
	__delay_ms(2);				// Retard de 2 ms
	PORTA = 0b00100000;			// RA5 a 1
	__delay_us(15);				// Retard de 15 us
						// Un cop activat, esperem la resposta
	TRISA = 0b11111111;			// Tot el port A és d'entrada, inclosa RA5
						// Esperem a rebre el pols d'inici
						// Primer un L d'uns 80 us
						// Per començar, s'ha de desactivar l'entrada
						// i s'ha de reactivar al cap d'entre 70 i 90 us
	while (Sens)				// S'ha desactivat l'entrada?
		;				// No, doncs esperem
	TMR1H = 0;
	TMR1L = 0;				// Sí, doncs comencem a comptar el temps
	while ((!Sens) && (TMR1L < 45))		// Esperem que s'activi l'entrada
		;				// O passin més de 90 us
	Temps = TMR1L;				// Agafa el valor de TMR1L
	TMR1H = 0;
	TMR1L = 0;				// Torna a començar a comptar el temps
	if (Temps > 45) {			// És més gran
		return 1;			// Error 1 - L inicial massa llarg
	}
	if (Temps < 35) {			// Mirem que no sigui menor que 70 us
		return 2;			// Error 2 - L inicial massa curt
	}
						// L inicial ja està
	while (Sens && (TMR1L < 45))		// Esperem a que es desactivi l'entrada
		;				// O passin més de 90 us
	Temps = TMR1L;				// Agafa el valor de TMR1L
	TMR1H = 0;
	TMR1L = 0;				// Torna a començar a comptar el temps
	if (Temps > 45) {			// És més gran
		return 3;			// Error 3 - H inicial massa llarg
	}
	if (Temps < 35) {			// Mirem que no sigui menor que 70 us
		return 4;			// Error 4 - H inicial massa curt
	}
						// H inicial ja està
						// Ara hem de rebre els bits
	TMR1H = 0;
	TMR1L = 0;				// Torna a començar a comptar el temps
	for (int j = 0; j < 5; j++){		// 5 bytes
		for (int k = 0; k < 8; k++){	// 8 bits a cada byte
			Bytes[j] = 2 * Bytes[j];		// Rodem a l'esquerra el bit anterior
								// per deixar lloc al nou
								// Si no n'hi havia cap no canvia res
								// ja que estava a zero
						// Esperem a rebre un bit
						// Primer un L d'uns 80 us
						// Ara l'entrada està a zero
						// S'ha d'activar al cap d'entre 10 i 90 us
			while ((!Sens) && (TMR1L < 45))		// Esperem que s'activi l'entrada
				;		// O passin més de 90 us
			Temps = TMR1L;		// Agafa el valor de TMR1L
			TMR1H = 0;
			TMR1L = 0;		// Torna a començar a comptar el temps
			if (Temps > 45) {	// És més gran
				return 5;	// Error 5 - Valor L del bit massa llarg
			}
			if (Temps < 5) {	// Mirem que no sigui menor que 10 us
				return 6;	// Error 6 - Valor L del bit massa curt
			}
						// Ja tenim el valor L del bit. Ara esperem un H
			while (Sens && (TMR1L < 40))		// Esperem a que es desactivi l'entrada
				;		// O passin més de 80 us
			Temps = TMR1L;		// Agafa el valor de TMR1L
			TMR1H = 0;
			TMR1L = 0;		// Torna a començar a comptar el temps
			if (Temps > 40) {	// És més gran
				return 7;	// Error 7 - Valor H del bit massa llarg
			}
			if (Temps < 6) {	// Mirem que no sigui menor que 12 us
				return 8;	// Error 8 - Valor H del bit massa curt
			}
						// Ja hem comprovat que no sigui massa curt ni massa llarg
						// Si és més petit que 38 us és un pols curt, o sigui un 0
						// Si és curt no cal fer res, el 0 ja hi és
						// Si és més gran que 60 us és un pols llarg, o sigui un 1
			if (Temps > 19) {	// És més gran que 38 us
						// Sí, doncs no és un pols curt
				if (Temps > 30) {		// És més gran que 60 us
						// És un pols llarg
					Bytes[j] = Bytes[j] + 1;			// Entrem un 1
				} else {
					return 9;		// Error 9 - Valor H del bit incorrecte
				}
			}
		}
	}
						// Ja tenim els 5 bytes. Fem la suma de comprovació
						// Cal sumar els quatre primers bytea
						// Però sense portar-ne
	Valor = 0;				// Primer la posem a zero
	for (int j = 0; j < 4; j++){		// 4 bytes
		Valor = Valor + Bytes[j];	// Sumem un dels quatre elements
		if (Valor > 255) {		// Mirem si és més gran del que cap a un byte
						// Si és més gran, només pot haver activat un bit del segon byte
						// el que correspon a 256
			Valor = Valor -256;	// Restem les que en portàvem
		}
	}
	if (Valor != Bytes[4]) {		// No coincideixen
		return 10;			// Error 10 - Falla la suma de comprovació
	}
	Lectura[1] = 256 * Bytes[2] + Bytes[3];			// Temperatura
	Lectura[2] = 256 * Bytes[0] + Bytes[1];			// Humitat
	return 0;				// Recepció correcta
}
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 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 pantallaLED (int P){
	__delay_ms(200);			// Retard d'1 s
	if (P==0){
		Sortida[1] = 0x01;		// Filera 1
		Sortida[3] = 0x01;
		Sortida[5] = 0x01;
		Sortida[0] = 0b11111000;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b00000111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x02;		// Filera 2
		Sortida[3] = 0x02;
		Sortida[5] = 0x02;
		Sortida[0] = 0b11111000;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b00000111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x03;		// Filera 3
		Sortida[3] = 0x03;
		Sortida[5] = 0x03;
		Sortida[0] = 0b11111000;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b00000111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x04;		// Filera 4
		Sortida[3] = 0x04;
		Sortida[5] = 0x04;
		Sortida[0] = 0b11110000;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b00001111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x05;		// Filera 5
		Sortida[3] = 0x05;
		Sortida[5] = 0x05;
		Sortida[0] = 0b11100000;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b00011111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x06;		// Filera 6
		Sortida[3] = 0x06;
		Sortida[5] = 0x06;
		Sortida[0] = 0b00000000;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b11111111;	// 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] = 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] = 0b11111111;	// Verds
		Sortida[4] = 0b11111111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
	} else if (P==1){			// Matriu 2
		Sortida[1] = 0x01;		// Filera 1
		Sortida[3] = 0x01;
		Sortida[5] = 0x01;
		Sortida[0] = 0b11111000;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b00000111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x02;		// Filera 2
		Sortida[3] = 0x02;
		Sortida[5] = 0x02;
		Sortida[0] = 0b11111110;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b00000001;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x03;		// Filera 3
		Sortida[3] = 0x03;
		Sortida[5] = 0x03;
		Sortida[0] = 0b11111000;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b00000111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x04;		// Filera 4
		Sortida[3] = 0x04;
		Sortida[5] = 0x04;
		Sortida[0] = 0b11110000;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b00001111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x05;		// Filera 5
		Sortida[3] = 0x05;
		Sortida[5] = 0x05;
		Sortida[0] = 0b11101000;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b00010111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x06;		// Filera 6
		Sortida[3] = 0x06;
		Sortida[5] = 0x06;
		Sortida[0] = 0b01000100;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b10111011;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x07;		// Filera 7
		Sortida[3] = 0x07;
		Sortida[5] = 0x07;
		Sortida[0] = 0b01000000;	// Vermells
		Sortida[2] = 0b11111111;	// Verds
		Sortida[4] = 0b10111111;	// 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] = 0b11111111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
						// Fi de la matriu 2
    } else if (P==2){				// Matriu 2
		Sortida[1] = 0x01;		// Filera 1
		Sortida[3] = 0x01;
		Sortida[5] = 0x01;
		Sortida[0] = 0b10100101;	// Vermells
		Sortida[2] = 0b10100101;	// Verds
		Sortida[4] = 0b11111111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x02;		// Filera 2
		Sortida[3] = 0x02;
		Sortida[5] = 0x02;
		Sortida[0] = 0b01100110;	// Vermells
		Sortida[2] = 0b01100110;	// Verds
		Sortida[4] = 0b11111111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x03;		// Filera 3
		Sortida[3] = 0x03;
		Sortida[5] = 0x03;
		Sortida[0] = 0b11100111;	// Vermells
		Sortida[2] = 0b11100111;	// Verds
		Sortida[4] = 0b11111111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x04;		// Filera 4
		Sortida[3] = 0x04;
		Sortida[5] = 0x04;
		Sortida[0] = 0b00011000;	// Vermells
		Sortida[2] = 0b00011000;	// Verds
		Sortida[4] = 0b11111111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x05;		// Filera 5
		Sortida[3] = 0x05;
		Sortida[5] = 0x05;
		Sortida[0] = 0b00011000;	// Vermells
		Sortida[2] = 0b00011000;	// Verds
		Sortida[4] = 0b11111111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x06;		// Filera 6
		Sortida[3] = 0x06;
		Sortida[5] = 0x06;
		Sortida[0] = 0b11100111;	// Vermells
		Sortida[2] = 0b11100111;	// Verds
		Sortida[4] = 0b11111111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x07;		// Filera 7
		Sortida[3] = 0x07;
		Sortida[5] = 0x07;
		Sortida[0] = 0b01100110;	// Vermells
		Sortida[2] = 0b01100110;	// Verds
		Sortida[4] = 0b11111111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
		Sortida[1] = 0x08;		// Filera 8
		Sortida[3] = 0x08;
		Sortida[5] = 0x08;
		Sortida[0] = 0b10100101;	// Vermells
		Sortida[2] = 0b10100101;	// Verds
		Sortida[4] = 0b11111111;	// Blaus
		Envia3max(Sortida);		// Ho envia al MAX7221
						// Fi de la matriu 2
	}
}    
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;
}

 

 

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