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
}

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