En aquest cas hi ha dos jugadors i un d'ells intenta enfonsar els vaixells que ha situat l'altre. El programa s'ha dissenyat pensant en que hi ha cinc vaixells que ocupen tres caselles cada un.
Els colors dels LED de la matriu representen:
| Color | Significat |
| Apagat | Casella sobre la que no s'ha disparat |
| Vermell | Aigua |
| Verd | Tocat |
| Groc | Posició del cursor |
Els polsadors de la part inferior serveixen per moure el cursor i per disparar sobre la casella actual, segons el següent ordre:
| Polsador | Funció |
| 1 | Dreta |
| 2 | Avall |
| 3 | Seleccionar o disparar |
| 4 | Canvi de jugador |
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 cic_int 5 // Nombre de cicles per a la intermitència
char Port; // Gestió del port a la funció Envia_max
char Compta; // Comptador de bits a la funció Envia_max
char Sortida[6]; // Valors a enviar al MAX7221 (48 bits)
char Sorti[6]; // Valors a enviar al MAX7221 des de la interrupció
char Actiu; // Variable que diu quin color està actiu
// Actiu = 0 Apagat
// Actiu = 1 Vermell
// Actiu = 2 Verd
// Actiu = 3 Blau
char Polsad; // Polsador que s'ha premut
char figura[8][8];
char x = 0; // Coordenada X del cursor (0 a 7)
// X = 0 és la columna de la dreta
char y = 0; // Coordenada Y del cursor (0 a 7)
char jugador=0;
char mirar = 1; // Espera que es deixi anar el polsador
char compt_int = 0; // Comptador de cicles per a la intermitència
char cur_on = 1; // Controla l'estat del cursor
char contador1 = 0;
char tocats = 0;
unsigned int intents = 0; // Valor a convertir (dos bytes, de 0 a 65535)
char Digits[5]; // Variable amb el número dígit a dígit
// Digits[0] són les unitats
char color = 1;
void Cursor(char Filera, char Columna); // Posiciona el cursor
void Envia3max(char Valor[]); // Envia un joc de valors als tres MAX7221
void TocaNota(char ValPR2, char ValCCPR1L, char ValDC1B);
// desactivant interrupcions
void Envia_max(void); // Envia un joc de valors als tres MAX7221
void EnviaL(char Caracter); // Envia un caràcter
void np(void);
void aigua(void);
void tocat(void);
void cdn(void);
void victoria(void);
void fv(void);
void in(void);
void tdos(void);
void gameover(void);
void pcinc(void);
void Esborra(void); // Esborra la pantalla i posa el cursor a l'inici
void Ini3max(void); // Inicialitza els tres MAX7221
void Apaga(void); // Apaga tots els LED
char Polsador(void); // Funció de lectura dels polsadors
void Intents(unsigned int valor);
void Borrarpantalla(void);
void Silenci(void);
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
CCP1CON = 0b00001100;
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
Actiu = 1;
TMR0 = 100; // Presselecció de 100, que són 156 iteracions
// Correspon a una interrupció cada 7,5 ms
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();
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
// amb el resultat justificat per l'esquerra
Apaga(); // Apaga tots els LED
TocaNota(189, 95, 0);
Esborra(); // Esborra la pantalla i posa el cursor a l'inici
np(); // Lletra
Silenci();
__delay_ms(3000); // 3 segons el missatge per indicar que ha de pulsar 6 cops el pulsador 0
Esborra();
Apaga();
while (1) {
// Mirem els polsadors
// Un cop s'ha fet l'acció del polsador, no es tornarà
// a fer fins que es detecti que s'han deixat anar
Polsad = Polsador(); // Llegim els polsadors
if (mirar == 1){
if (Polsad == 1) { // Si s'ha premut el polsador 1
x = (x + 1) % 8; // Incrementa x però la manté entre 0 i 7
mirar = 0;
}
if (Polsad == 2) { // Si s'ha premut el polsador 2
y = (y + 1) % 8; // Incrementa y però la manté entre 0 i 7
mirar = 0;
}
if (Polsad == 3) { // Si s'ha premut el polsador 3
// Posem el color al LED corresponent
if (jugador==0){
figura[y][x] = 3;
}else{
if (figura[y][x]==3){
figura[y][x]=2;
intents=intents+1;
tocats=tocats+1;
TocaNota(118,59,2);// Apaga tots els LED
Silenci();
Esborra(); // Esborra la pantalla i posa el cursor a l'inici
tocat();
in();
Intents(intents);
EnviaL(Digits[1]);
EnviaL(Digits[0]);
__delay_ms(1500); // 3 segons el missatge per indicar que ha de pulsar 6 cops el pulsador 0
Borrarpantalla();
if (intents>40){
gameover();
TocaNota(212, 106, 2);
TocaNota(224, 112, 2);
TocaNota(238, 119, 2);
Silenci();
}
}else{
if (figura[y][x]==0){
figura[y][x]=1;
TocaNota(238,119,2);
Silenci();
intents=intents+1;
Esborra();
aigua();
in();
Intents(intents);
EnviaL(Digits[1]);
EnviaL(Digits[0]);
__delay_ms(1500); // 1.5 segons el missatge per indicar que ha de pulsar 6 cops el pulsador 0
Borrarpantalla();
if (intents>40){
gameover();
TocaNota(212, 106, 2);
TocaNota(224, 112, 2);
TocaNota(238, 119, 2);
Silenci();
}
}
}
}
mirar = 0;
}
if ((Polsad == 4) & (jugador==0)){ // Si s'ha premut el polsador 4
for (signed char j = 0; j < 8; j++){
for (signed char k = 0; k < 8; k++){
if (figura[j][k] == 3){
contador1=contador1+1;
}
}
}
if (contador1==15){
jugador=1;
intents=0;
tdos();
x=0;
y=0;
}
if (contador1<15){
fv();
}
if (contador1>15){
for (signed char j = 0; j < 8; j++){
for (signed char k = 0; k < 8; k++){
figura[j][k] = 0;
jugador=0;
}
}
cdn();
x=0;
y=0;
}
contador1=0;
mirar = 0;
}
if (Polsad == 5) { // Si s'ha premut el polsador 5
Apaga();
tocats=0;
TocaNota(189, 95, 0);
Esborra(); // Esborra la pantalla i posa el cursor a l'inici
np();
Silenci();
__delay_ms(3000); // 3 segons el missatge per indicar que ha de pulsar 6 cops el pulsador 0
Esborra();
for (signed char j = 0; j < 8; j++){
for (signed char k = 0; k < 8; k++){
figura[j][k] = 0; // Apaguem tot
jugador=0;
x=0;
y=0;
}
}
mirar = 0;
}
} else {
if (Polsad == 0) { // Si no s'ha premut cap polsador (o dos a la vegada)
mirar = 1;
}
}
// Anem a mostrar la figura actual a la matriu de LED
for (signed char j = 0; j < 8; j++){ // Fileres
char mascara;
char col;
Sortida[0] = 0; // Vermells
Sortida[2] = 0; // Verds
Sortida[4] = 0; // Blaus
for (signed char k = 0; k < 8; k++){
if ((y == j) && (x == k)){ // Si estem a la casella del cursor
// El cursor es mostra en el color actual però si coincideix
// amb el color de la casella el mostrem blanc
if (cur_on == 1){ // Si toca el cursor encès
col = 5; // Color actual
if (col == figura[y][x]){ // Si coincideixen
col = 7; // posem blanc
}
} else {
col = figura[y][x]; // Color de la posició actual
}
} else { // Si no hi estem, és una casella normal
col = figura[j][k]; // Color de la posició actual
}
if ((col==3)&(jugador==1)){
col=0;
}
// Posem els bits a la columna corresponent
mascara = col & 0b0000001; // Serà 1 si hi ha vermell
Sortida[0] = Sortida[0] | (mascara << k);
mascara = (col & 0b0000010) >> 1; // Serà 1 si hi ha verd
Sortida[2] = Sortida[2] | (mascara << k);
mascara = (col & 0b0000100) >> 2; // Serà 1 si hi ha blau
Sortida[4] = Sortida[4] | (mascara << k);
}
Sortida[1] = j+1; // Filera
Sortida[3] = j+1;
Sortida[5] = j+1;
Envia3max(Sortida); // Ho envia al MAX7221
}
__delay_ms(1);
compt_int++;
if (compt_int == cic_int){ // Si toca intermitència
compt_int = 0;
cur_on = (cur_on + 1) % 2; // Canvia el cursor
}
if (tocats==15){
victoria();
TocaNota(133, 67, 0);
TocaNota(126, 63, 2);
TocaNota(118, 59, 2);
Silenci();
tocats=0;
}
}
}
void __interrupt() temporit(void){
if (INTCONbits.T0IF){ // Comprovem que hi ha interrupció per Timer 0
TMR0 = 100; // 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
Sorti[0] = 0x00; // Vermell
Sorti[2] = 0x00; // Verd
Sorti[4] = 0x00; // Blau
if (Actiu == 1) { // Si és vermell
Sorti[0] = 0x01; // Vermell activat
}
if (Actiu == 2) { // Si és verd
Sorti[2] = 0x01; // Verd activat
}
if (Actiu == 3) { // Si és blau
Sorti[4] = 0x01; // Blau activat
}
Sorti[1] = 0x0C; // Shutdown mode
Sorti[3] = 0x0C; // Shutdown mode
Sorti[5] = 0x0C; // Shutdown mode
Envia_max(); // Ho envia al MAX7221
}
}
void Envia3max(char Valor[]) { // Envia un joc de valors als tres MAX7221
INTCONbits.T0IE = 0; // Desactiva les interrupcions momentàniament
char Port = 0; // Variable on guardem l'estat del port B
char Temp; // Variable temporal
for (signed char j = 5; j >= 0; j--){ // Hem d'enviar 6 bytes
for (signed char 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.T0IE = 1; // Reactiva les interrupcions a l'acabar
}
void Envia_max(void) { // Envia un joc de valors als tres MAX7221
asm("banksel _Port");
asm("bcf (_Port&7fh),5"); // S'assegura que Clock està desactivat
asm("bcf (_Port&7fh),6"); // S'assegura que Latch està desactivat
asm("movf (_Port&7fh),w"); // Agafa el valor de Port
asm("movwf PORTB"); // I el posa al port B
asm("banksel _Compta");
asm("movlw 48"); // Número de bits a enviar
asm("movwf (_Compta&7fh)"); // Variable per comptar els bits
asm("Bucle:");
asm("banksel _Port");
asm("bcf (_Port&7fh),4"); // Desactiva Data. Si toca activar-ho, ja ho farem
asm("banksel _Sorti");
asm("rlf (_Sorti&7fh),f"); // Fa sortir el bit de més a l'esquerra cap a C
asm("rlf ((_Sorti+1)&7fh),f"); // i roda els altres a l'esquerra
asm("rlf ((_Sorti+2)&7fh),f");
asm("rlf ((_Sorti+3)&7fh),f");
asm("rlf ((_Sorti+4)&7fh),f");
asm("rlf ((_Sorti+5)&7fh),f");
asm("banksel _Port");
asm("btfsc STATUS,0"); // Mira si el bit de l'esquerra era un 1
asm("bsf (_Port&7fh),4"); // Si era 1, activa Data
asm("movf (_Port&7fh),w"); // Agafa el valor de Port. El valor que ha canviat és Data
asm("movwf PORTB"); // I el posa al port B
asm("bsf (_Port&7fh),5"); // Activa Clock, forçant a llegir el bit
asm("movf (_Port&7fh),w"); // Agafa el valor de Port. El valor que ha canviat és Clock
asm("movwf PORTB"); // I el posa al port B
asm("bcf (_Port&7fh),5"); // Desactiva Clock
asm("movf (_Port&7fh),w"); // Agafa el valor de Port. El valor que ha canviat és Clock
asm("movwf PORTB"); // I el posa al port B
asm("banksel _Compta");
asm("decfsz (_Compta&7fh),f"); // Decrementa Compta
asm("goto Bucle"); // Si Compta no és zero, repeteix el bucle
asm("banksel (_Port&7fh)");
asm("bsf (_Port&7fh),6"); // Torna a activar Latch
// Els valors es copiaran a la sortida del registre
asm("movf (_Port&7fh),w"); // Agafa el valor de Port. El valor que ha canviat és Latch
asm("movwf PORTB"); // I el 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;
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 (unsigned char 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 np(void){
Cursor(1,3);
TocaNota(238, 119, 2);
EnviaL('N'); // Lletra
EnviaL('O'); // Lletra
EnviaL('V');
EnviaL('A');// Lletra
TocaNota(212, 106, 2);
EnviaL(' '); // Lletra
EnviaL('P'); // Lletra
EnviaL('A'); // Lletra
EnviaL('R'); // Lletra
TocaNota(189, 95, 0);
EnviaL('T'); // Lletra
EnviaL('I');
EnviaL('D'); // Lletra
EnviaL('A');
}
void aigua(void){
Cursor(1,6);
EnviaL('A');
EnviaL('I');
EnviaL('G');
EnviaL('U');
EnviaL('A');
}
void tocat(void){
Cursor(1,6);
EnviaL('T');
EnviaL('O');
EnviaL('C');
EnviaL('A');
EnviaL('T');
}
void in(void){
Cursor(2,3);
EnviaL('I');
EnviaL('N');
EnviaL('T');
EnviaL('E');
EnviaL('N');
EnviaL('T');
EnviaL('S');
EnviaL(':');
EnviaL(' ');
}
void tdos(void){
Esborra();
Cursor(1,5);
EnviaL('T');
EnviaL('O');
EnviaL('R');
EnviaL('N');
EnviaL(' ');
EnviaL('J');
EnviaL('2');
__delay_ms(1500); // 1.5 segons el missatge per indicar que ha de pulsar 6 cops el pulsador 0
Esborra();
}
void fv(void){
Esborra();
Cursor(1,2);
EnviaL('F');
EnviaL('A');
EnviaL('L');
EnviaL('T');
EnviaL('E');
EnviaL('N');
EnviaL(' ');
EnviaL('V');
EnviaL('A');
EnviaL('I');
EnviaL('X');
EnviaL('E');
EnviaL('L');
EnviaL('L');
EnviaL('S');
__delay_ms(1500); // 1.5 segons el missatge per indicar que ha de pulsar 6 cops el pulsador 0
Esborra();
}
void gameover(void){
Borrarpantalla();
Apaga();
Cursor(1,3);
EnviaL('H');
EnviaL('A');
EnviaL('S');
EnviaL(' ');
EnviaL('P');
EnviaL('E');
EnviaL('R');
EnviaL('D');
EnviaL('U');
EnviaL('T');
__delay_ms(1500);
pcinc();
}
void cdn(void){
Esborra();
Cursor(1,2);
EnviaL('C');
EnviaL('O');
EnviaL('L');
EnviaL('.');
EnviaL('L');
EnviaL('O');
EnviaL('C');
EnviaL('A');
EnviaL(' ');
EnviaL('D');
EnviaL('E');
EnviaL(' ');
EnviaL('N');
EnviaL('O');
EnviaL('U');
__delay_ms(1500); // 1.5 segons el missatge per indicar que ha de pulsar 6 cops el pulsador 0
Esborra();
}
void victoria(void){
Esborra(); // Esborra la pantalla i posa el cursor a l'inici
Cursor(1,5);
EnviaL('V');
EnviaL('I');
EnviaL('C');
EnviaL('T');
EnviaL('O');
EnviaL('R');
EnviaL('I');
EnviaL('A');
in();
Intents(intents);
EnviaL(Digits[1]);
EnviaL(Digits[0]);
__delay_ms(4000); // 1.5 segons el missatge per indicar que ha de pulsar 6 cops el pulsador 0
pcinc();
}
void pcinc(void){
Esborra();
EnviaL('P');
EnviaL('R');
EnviaL('E');
EnviaL('M');
EnviaL(' ');
EnviaL('5');
EnviaL(' ');
EnviaL('P');
EnviaL('E');
EnviaL('R');
EnviaL(' ');
EnviaL('J');
EnviaL('U');
EnviaL('G');
EnviaL('A');
EnviaL('R');
}
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 Intents(unsigned int valor ){
for (signed char j = 0; j < 5; j++){ // 5 dígits
Digits[j] = valor % 10;
valor = valor / 10;
}
for (signed char j = 0; j < 5; j++){ // 5 dígits
Digits[j] = Digits[j] + '0'; // Li sumem el codi ASCII de 0
}
char mira0 = 1; // De moment, hem de mirar si el caràcter és zero
for (signed char j = 4; j > 0; j--){ // El 0 de les unitats el mostrarem sempre
if(mira0 == 1) { // Encara toca comprovar sí és 0?
if(Digits[j] == '0') { // Mirem si el dígit és 0
Digits[j] = ' '; // Si ho és, hi posem un espai
} else {
mira0 = 0; // Si no ho és, ja no cal mirar-ne més
}
}
}
}
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
}
void Silenci(void){
__delay_ms(200); // Retard de 0,2 s
TRISC = 0b00100000; // Posem RC5 (sortida del PWM) com a entrada
// O sigui, silenci
__delay_ms(200);
}
void Borrarpantalla(void){
for (signed char j = 0; j < 15; j++){
Cursor(1,j);
EnviaL(' ');
}
}

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