Programació en C del PIC 16F690

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

Marcador esportiu

Programa del grup 2

En aquest cas el marcador anava destinat al bàsquet. La funció dels LED és:

LED Significat
1 El sistema està en mode 0
2 El sistema està en mode 1
3 El visitant té la pilota
4 El local té la pilota

El temps de possessió de la pilota s'indica a la matriu de LED. El valor inicial, 24 o 14, s'indica amb el potenciòmetre. En aquest cas la matriu LED treballa amb un sol color, per tant no cal cap interrupció per alternar la visualització dels tres colors.

La funció dels polsadors és la següent:

Polsador Funció en mode 0 Funció en mode 1
0 Canvi de mode Canvi de mode
1 Suma un punt al local Resta un punt al local
2 Suma una falta al local Resta una falta al local
3 Inicia o atura el temps Alternar possessió
4 Suma una falta al visitant Resta una falta al visitant
5 Suma un punt al visitant Resta un punt al visitant

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
#define FiTimer0 INTCONbits.T0IF		// Li assigna un nom al bit que indica el final del Timer 0
#define Polsador0 RA3
char tLed=24;					// Variable que es mostrara a la matriu LED
char cont=0;					// Variable de control
char Polsad;					// Polsador que s'ha premut
char LocU=0;					// Variable unitats dels punts Local
char LocD=0;					// Variable desenas dels punts Local
char LocC=0;					// Variable centenes dels punts Local
char Caracter;					// Variable caracter que enviarem a la pantalla
char VisU=0;					// Variable unitats dels punts Visitant
char VisD=0;					// Variable desenas dels punts Visitant
char VisC=0;					// Variable centenes dels punts Local
char m1=1;					// Variable primer digit minuts
char m2=0;					// Variable segon digit minuts
char s1=0;					// Variable primer digit segons
char s2=0;					// Variable segon digit segons
char c1=0;					// Variable decimes
char c2=0;					// Variable centecimes 
char Part=1;					// Variable part
char Temps=0;					// Variable que indica si el temps esta pausat o no
char FLoc=0;					// Variable faltes acumulades Local
char FVis=0;					// Variable faltes acumulades Visitant
char Mode=0;					// Variable que indica en quin mode estara la placa			 
char um=0;					// Variable que sera 1 en l'ultim minut de cada part
char cicle=0;					// Variable per evitar problemes amb els polsadors
char t='P';					// P per parts E per empat
char PartE=0;					// Variable de part de prorrogas
char Pos=0;					// De quin equip es la possessio 0-Local 1-Visitant
char Sortida[6];					 
char digit[10][8] = {{0b00000000, 0b00000111, 0b00000101, 0b00000101, 0b00000101, 0b00000111, 0b00000000, 0b00000000},
		 {0b00000000, 0b00000010, 0b00000010, 0b00000010, 0b00000010, 0b00000010, 0b00000000, 0b00000000},
		 {0b00000000, 0b00000111, 0b00000001, 0b00000111, 0b00000100, 0b00000111, 0b00000000, 0b00000000},
		 {0b00000000, 0b00000111, 0b00000001, 0b00000111, 0b00000001, 0b00000111, 0b00000000, 0b00000000},
		 {0b00000000, 0b00000101, 0b00000101, 0b00000111, 0b00000001, 0b00000001, 0b00000000, 0b00000000},
		 {0b00000000, 0b00000111, 0b00000100, 0b00000111, 0b00000001, 0b00000111, 0b00000000, 0b00000000},
		 {0b00000000, 0b00000111, 0b00000100, 0b00000111, 0b00000101, 0b00000111, 0b00000000, 0b00000000},
		 {0b00000000, 0b00000111, 0b00000001, 0b00000001, 0b00000001, 0b00000001, 0b00000000, 0b00000000},
		 {0b00000000, 0b00000111, 0b00000101, 0b00000111, 0b00000101, 0b00000111, 0b00000000, 0b00000000},
		 {0b00000000, 0b00000111, 0b00000101, 0b00000111, 0b00000001, 0b00000001, 0b00000000, 0b00000000}				 
		};				// Matriu d'unitats 
char digit2[3][8] = {{0b00000000, 0b01110000, 0b01010000, 0b01010000, 0b01010000, 0b01110000, 0b00000000, 0b00000000},
		 {0b00000000, 0b00100000, 0b00100000, 0b00100000, 0b00100000, 0b00100000, 0b00000000, 0b00000000},
		 {0b00000000, 0b01110000, 0b00010000, 0b01110000, 0b01000000, 0b01110000, 0b00000000, 0b00000000}
		};				// Matriu de desenes
						// Definició de les funcions que farem servir
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 Envia3max(char Val[]);			// Envia un joc de valors als tres MAX7221 desactivant interrupcions
void Envia_max(char Valor[]);			// Envia un joc de valors als tres MAX7221
void Ini3max(void);				// Inicialitza els tres MAX7221
void Apaga(void);				// Apaga tots els LED
void TocaNota(char ValPR2, char ValCCPR1L, char ValDC1B);
char Polsador(void);				// Funció de lectura dels polsadors
void MLed(void);				// Funció de control de la matriu LED
void CTemps(void);				// Funció que disminueix el temporitzador en una centecima			 
void ActLCD(void);				// Funció per actualitzar la pantalla LCD
void main (void) {
	__delay_ms(1000);
	ANSEL = 0b00000101;			
	ANSELH = 0;				
	ANSELbits.ANS0 = 1;
	TRISC = 0b00100000;	
	TRISB = 0;				
	TRISA = 0xFF;				
	TRISAbits.TRISA0 = 1;
	ADCON1 = 0b00010000;			
	ADCON0 = 0b00001001;			
	TXSTAbits.BRGH = 1;			
	BAUDCTLbits.BRG16 = 0;			
	SPBRG = 25;				
	TXSTAbits.SYNC = 0;			
	TXSTAbits.TX9 = 0;			
	RCSTAbits.SPEN = 1;			
	TXSTAbits.TXEN = 1;			
	Esborra();				// Esborra la pantalla i posa el cursor a l'inici
	PORTC = 0;
	PORTB = 0;
	CCP1CON = 0b00001100;
	CCPR1L = 49;
	PIR1bits.TMR2IF = 0;
	T2CON = 0b00000011;
	Ini3max();				// Inicialitza els tres MAX7221
	Apaga();				// Apaga tots els LED de la matriu LED
	Cursor(1,1);				// Preparem la pantalla mitjançant les funcions esmentades
	EnviaL('L');
	EnviaL('O');
	EnviaL('C');
	Cursor(1,6);
	EnviaL(m1 + '0');
	EnviaL(m2 + '0');
	EnviaL('.');
	EnviaL(s1 + '0');
	EnviaL(s2 + '0');
	Cursor(1,14);
	EnviaL('V');
	EnviaL('I');
	EnviaL('S');
	Cursor(2,5);
	EnviaL('F');
	EnviaL(FLoc + '0');
	Cursor(2,11);
	EnviaL('F');
	EnviaL(FVis + '0');
	Cursor(2,8);
	EnviaL('P');
	EnviaL(Part + '0');
	Cursor(2,14);
	EnviaL(VisC + '0');
	EnviaL(VisD + '0');
	EnviaL(VisU + '0');
	Cursor(2,1); 
	EnviaL(LocC + '0');
	EnviaL(LocD + '0');
	EnviaL(LocU + '0');
	INTCON = 0b10100000; 								 
	FiTimer0 = 0;	 										 
	OPTION_REG = 0b10000101;	 	
	INTCONbits.GIE = 1;			 
	TMR0=100;
	__delay_ms(1000);
	Sortida[2] = 0x00;			// Verd apagat
	Sortida[4] = 0x00;			// Blau apagat
	Sortida[0] = 0x01;			// Vermell activat
	Sortida[1] = 0x0C;		
	Sortida[3] = 0x0C;		
	Sortida[5] = 0x0C;		
	Envia_max(Sortida);			// Ho envia al MAX7221
	while (1) {
		MLed();
		if (tLed == 0) {		// si s'acaba el temps de possessio
			TocaNota(118, 59, 2);	// Tocar nota
			tLed=24;		// reiniciem a 24
			Temps=0;		// Atura el temps
			if (Pos==0){		// La possessio canvia de equip
				Pos = 1; 
			} else {
				Pos =0;
			}
		} 
		Polsad=0;
		if (cicle != 0) {						 
			cicle --;
		}
		if (Polsador0 == 0 && cicle == 0) {		// si s'activa el BTN0 i la variable cicle es 0
			cicle=5;		// la reiniciem a 5 per evitar que detecti el polsador massa seguit
			if (Mode < 1){		// Alternem la possessio
				Mode ++;
			} else {
				Mode = 0;
			}
		}
		if (cicle == 0) {
			Polsad = Polsador();	// Llegim els polsadors
		}
		if (Polsad != 0) {				 
			cicle=5;
		}
		if (Mode == 0){			// Funcions dels polsadors si estem en el mode 0
			if (Pos == 1){		// Leds que indiquen qui te la possessio i en quin mode estem
				PORTC = 0b00001001;		// Led 4 (possessio Local) i 1 (mode 0)
			} else {	
				PORTC = 0b00000101;		// Led 3 (possessio Vis) i 1 (mode 0)
			}
			if (Polsad == 5) {	// Si s'ha premut el polsador 5
				VisU++;		// Suma un punt a Visitants
				if (VisU == 10){
					VisU=0;
					VisD++;
				}
				if (VisD == 10){
					VisD=0;
					VisC++;
				}
				Cursor(2,14);
				EnviaL(VisC + '0');
				EnviaL(VisD + '0');
				EnviaL(VisU + '0');
			}
			if (Polsad == 2) {	// Si s'ha premut el polsador 2
				if (FLoc < 5){	// Suma 1 a les faltes Locals (a un maxim de 5)
					FLoc=FLoc+1;
					Cursor(2,6);
					EnviaL(FLoc + '0');
				}
			}
			if (Polsad == 3) {	// Si s'ha premut el polsador 3
				if (Temps==0){	// Atura o inicia el temps
					Temps = 1; 
				} else{
					Temps =0;
				}
			}
			if (Polsad == 4) {	// Si s'ha premut el polsador 4
				if (FVis<5) {	// Suma 1 a les faltes dels Visitants (a un maxim de 5)
					FVis++;
					Cursor(2,12);
					EnviaL(FVis + '0');
				}
			}
			if (Polsad == 1) {	// Si s'ha premut el polsador 1
				LocU++;		// Suma 1 als punts del Local
				if (LocU == 10){
					LocU=0;
					LocD++;
				}
				if (LocD == 10){
					LocD=0;
					LocC++;
				}
				Cursor(2,1);
				EnviaL(LocC + '0');
				EnviaL(LocD + '0');
				EnviaL(LocU + '0');
			}
		}
		if (Mode == 1) {		// Funcions dels polsadors si estem en el mode 1
			if (Pos == 1){		// Leds que indiquen qui te la possessio i en quin mode estem
				PORTC = 0b00001010;		// Led 4 (possessio Local) i 2 (mode 1)
			} else {
				PORTC = 0b00000110;		// Led 3 (possessio Vis) i 2 (mode 1)
			}
			if (Polsad == 5) {	// Si s'ha premut el polsador 5
				if (VisU == 0 && VisD == 0 && VisC == 0) { 
					;
				} else {
					if (VisU==0) {
						VisU=10;
						if (VisD==0) {
							VisD=10;
							VisC--;
						}
						VisD--;
					}
					VisU=VisU-1;		// Resta un punt a Visitants
					Cursor(2,14);
					EnviaL(VisC + '0');
					EnviaL(VisD + '0');
					EnviaL(VisU + '0');
				}
			}
			if (Polsad == 2 && FLoc != 0) {		// Si s'ha premut el polsador 2
				if (FLoc > 0){	// Resta 1 a les faltes Locals
					FLoc--;
					Cursor(2,6);
					EnviaL(FLoc + '0');
				}
			}
			if (Polsad == 3) {	// Si s'ha premut el polsador 3
				if (Pos==0){	// Alternem la possessio
					Pos = 1; 
				} else{
					Pos =0;
				}
				ADCON0 = 0b00000001;
				ADCON0bits.GO = 1;		
				while (ADCON0bits.GO == 1)	
					;				
				if (ADRESH <= 0b00001111){	// Si potencimetre te un valor igual o inferior a 0b00001111
					tLed=14;		// Reiniciem el temps de possessio a 14
				} else {
					tLed=24;		// Reiniciem el temps de possessio a 24
				}
			}
			if (Polsad == 4 && FVis != 0) {		// Si s'ha premut el polsador 4
				if (FVis>0) {	// Resta 1 a les faltes dels Visitants
					FVis--;
					Cursor(2,12);
					EnviaL(FVis + '0');
				}
			}
			if (Polsad == 1) {	// Si s'ha premut el polsador 1
				if (LocU == 0 && LocD == 0 && LocC == 0) {
					;
				} else {
					if (LocU==0) {
						LocU=10;
						if (LocD==0) {
							LocD=10;
							LocC--;
						}
						LocD--;
					}
					LocU--;	// Resta un punt a Locals	
					Cursor(2,1);
					EnviaL(LocC + '0');
					EnviaL(LocD + '0');
					EnviaL(LocU + '0');
				}
			}
		}
		ActLCD();			// actualitzem la pantalla LCD
		__delay_ms(10);			// Retard per permetre la visualització
	}
}
void __interrupt() temporit(void){		// funció d'interrupcions	
	INTCONbits.GIE = 0;			// Desactivem momentàniament les interrupcions
	if (FiTimer0){				// Comprovem que hi ha interrupció per Timer 0
		TMR0=108;			
		FiTimer0 = 0;			// Tornem a posar el bit a zero		
		if (Temps == 1) {		// Si el temps no esta aturat
			CTemps();		// Restem una centecima
			cont ++;
			if (cont == 100){	// Quan passi un segon (100 interrupcions)
				cont = 0;		 
				if (tLed != 0){	// Si no s'ha acabat el temps de possessio
					tLed --;		// resta un segon al temps de possessio
				}
			}
		}
	}	
	INTCONbits.GIE = 1;
}
void CTemps(void) {				// Funció que disminueix una centesima al temporitzador
	if (c2==0){
		c2=9;
		if (c1==0){
			c1=9;
			if (s2==0){
				s2=9;
				if (s1==0){
					s1=5;
					if (m2==0){
						m2=9;
						if (m1!=0){
							m1=m1-1;		 
						} else {
							if (Part>=4 && LocC == VisC && LocD == VisD && LocU == VisU){
								if (PartE<9) {
									PartE++;
								}
								m2=5;
								m1=0;
								s2=0;
								s1=0;
								c1=0;
								c2=0;
								t='E';
							} else if (Part >= 4) {
								Part=1;
								m2=0;
								m1=1;
								s2=0;
								s1=0;
								c1=0;
								c2=0;
								t='P';
								LocU=0;
								LocD=0;
								LocC=0;
								VisU=0;
								VisC=0;
								VisD=0;
							} else {
								Part++;
								m2=0;
								m1=1;
								s2=0;
								s1=0;
								c1=0;
								c2=0;
							}
							TocaNota(118, 59, 2);
							FVis=0;
							FLoc=0;
							Temps=0;
							um=0;
							tLed=24;
						}
					} else {
						m2--;
					}
				} else {
					s1--;
				}
			} else {
				s2--;
			}
		} else{
					c1--;
		}
	} else{
		c2--;
	}
	if (c1==0 && s2==0 && s1 == 0 && m1 == 0 && m2 ==1) {
		um=1;
	}
}
char Polsador(void) {				// Funció que indica quin polsador s'está prement
	ADCON0 = 0b00001001;
	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 --;			// 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(400);	 	 	// 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 ActLCD(void){				// Funció que actualitza els valors mostrats a la pantalla LCD
	Cursor(2,14);
	EnviaL(VisC + '0');
	EnviaL(VisD + '0');
	EnviaL(VisU + '0');
	Cursor(2,1); 
	EnviaL(LocC + '0');
	EnviaL(LocD + '0');
	EnviaL(LocU + '0');
	if (um==0){
		Cursor(1,6);
		EnviaL(m1 + '0');
		EnviaL(m2 + '0');
		EnviaL('.');
		EnviaL(s1 + '0');
		EnviaL(s2 + '0');
	} else {
		Cursor(1,6);
		EnviaL(s1 + '0');
		EnviaL(s2 + '0');
		EnviaL(',');
		EnviaL(c1 + '0');
		EnviaL(c2 + '0');		
	}
	Cursor(2,8);
	EnviaL(t);
	if (t=='P'){
		Caracter = Part + '0';
	} else {
		Caracter = PartE + '0';
	} 
	EnviaL(Caracter);
	if (FLoc>=4){				// Si algun dels equips ha arribat a 4 o 5 faltes
		Caracter='*';			// envia un * indicant que l'equip esta bonus
	} else {
		Caracter=' ';
	}
	Cursor(1,4);
	EnviaL(Caracter);
	if (FVis>=4){
		Caracter='*';
	} else {
		Caracter=' ';
	}
	Cursor(1,13);
	EnviaL(Caracter);
	Cursor(2,6);
	EnviaL(FLoc + '0');
	Cursor(2,12);
	EnviaL(FVis + '0');
}
void Envia3max(char Val[]) {			// 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[]) {			// 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
	}
}
void MLed(void){
	char unitat = tLed % 10;		// Agafem les unitats
	char desena = tLed / 10;		// Agafem les desenes
	char dreta[8];
	char esq[8];
	for (int j = 0; j < 8; j++){
		dreta[j] = digit[unitat][j];
	}
	for (int j = 0; j < 8; j++){
		esq[j] = digit2[desena][j];
	}
	for (int k = 0; k < 8; k++){
		Sortida[1] = k+1;		// Filera 1
		Sortida[0] =esq[k] | dreta[k];
		Envia3max(Sortida);		// Ho envia al MAX7221
		__delay_ms(1);
	}
}

 

 

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