Programació en C del PIC 16F690

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

Rellotge

Programa del grup 4

En aquest cas és un rellotge amb alarma. Els polsadors permeten posar el rellotge en hora i ajustar l'alarma.

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 <xc.h>  // Carrega el fitxer de funcions
#define FiTimer1 PIR1bits.TMR1IF  // Li assigna un nom al bit que indica el final del Timer 1
#define flipbit(var, bit) ((var) ^= (1<<(bit)))
#define _XTAL_FREQ  4000000  // La freqüència del rellotge és 4 MHz
#define Polsador1   RA3  // Li assigna un nom a l'adreça del polsador
// Variables de hora
char ds=0;
char s_dec=0;
char s_uni=0;                              
char m_dec=0;
char m_uni=0;
char h_dec=0;
char h_uni=0;
// Variables pel canvi d'hora
signed char cs_dec=0;
signed char cs_uni=0;                            
signed char cm_dec=0;
signed char cm_uni=0;
signed char ch_dec=0;
signed char ch_uni=0;
// Variables de data
char dia_s=0;
char dia_uni=1;
char dia_dec=0;
char mes_uni=1;
char mes_dec=0;
char any_uni=0;
char any_dec=0;
char any_cent=0;
char any_um=2;
// Variables pel canvi de data
signed char cdia_s;
signed char cdia_uni;
signed char cdia_dec;
signed char cmes_uni;
signed char cmes_dec;
signed char cany_uni;
signed char cany_dec;
signed char cany_cent;
signed char cany_um;
//Llista que recull els caracter que forman dl, dt etc.
const char *Dies[7] = {"l", "t", "c", "j", "v", "s", "g"};
// Llista que recull les condicions limit dels dies de cada mes
signed char DiesMes_dec[12]={3,2,3,3,3,3,3,3,3,3,3,3};
signed char DiesMes_uni[12]={2,9,2,1,2,1,2,2,1,2,1,2};
// Variables que comptan el mes i l'any en una sola
signed char mes=0;
int any=2000;
// Variables d'alarma
signed char ah_dec;
signed char ah_uni;
signed char am_dec;
signed char am_uni;
char alh_dec=0;
char alh_uni=0;
char alm_dec=0;
char alm_uni=0;
char amp_dec=0;
char amp_uni=0;
char sona_ds[7]={0,0,0,0,0,0,0}; // Cada posicio val 1 o 0 depenent de si es vol que es repeteixi l'alarma algun dia de la setmana
char sona=0; // Estat d'activació de l'alarma
char sona_1=0; // Estat d'activació de l'alarma per poder posposarla
const char *Caracter[2] = {' ','*'}; // Simbol que s'envia a la pantalla segons si l'alarma esta activada o no
char posposa=0; // Val 0 o 1 si l'alarma s'ha posposat
char temps=0; // Variable que compta el temps per apagar l'alarma despres de 5 minuts
char Polsad; // Pel funcionament dels polsadors RA3 
signed char Canvi; // Utilitzada per seleccionar els parametres per modificar l'hora i la data
char Cpolsador1=0; // El seu valor que implica la visualitzacio de diferents pantalles
char desactiva=0; // Utilitzada per interrompre els diferents whiles en el programa
// Definició de les funcions  
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
char Polsador(void);  // Polsadors en serie
void TocaNota(char ValPR2, char ValCCPR1L, char ValDC1B);
void main (void){
  PORTB = 0;
  PORTC = 0;
  TRISC = 0b00100000;
  TRISB = 0;
  TRISA = 0xFF;  // Tot el port A és d'entrada
  ADCON1 = 0b00010000;  // Posa el conversor a 1/8 de la freq?ència
  ADCON0 = 0b00001001;  // Activa el conversor A/D connectat a AN2
  INTCONbits.GIE = 1;  // Habilitem les interrupcions a nivell general
  PIE1bits.TMR1IE = 1;  // Interrupció de timer1
  INTCONbits.PEIE = 1;
  TMR1H = 207;  // Inicialitza el Timer1 en 1 decima de s
  TMR1L = 19;
  FiTimer1 = 0;  // Aquest bit es posarà a 1 quan el temporitzador acabi
  T1CON = 0b00110001;  // Configuració de Timer1
  CCP1CON = 0b00001100;  // Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill
  ANSEL = 0b00000101;  // Configura AN0 i AN2 com entrada analògica
  ANSELH = 0;  // Desactiva les altres entrades analògiques
  __delay_ms(2000);  // Esperem que arrenqui la pantalla
  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();  // Esborra la pantalla i posa el cursor a l'inici
  while (1){
    Polsad =Polsador();
    // Pantalla principal
    Cursor(1,6);
    EnviaL(h_dec + '0');
    EnviaL(h_uni + '0');
    EnviaL('.');
    EnviaL(m_dec + '0');
    EnviaL(m_uni + '0');
    Cursor(2,6);
    EnviaL('d');
    EnviaL(Dies[dia_s][0]);
    EnviaL(' ');
    EnviaL(dia_dec + '0');
    EnviaL(dia_uni + '0');
    Cursor(1,14);
    EnviaL(Caracter[sona]);
    // Modifica el valor que implica la visualitzacio de diferents pantalles
    if (Cpolsador1>2){
      Cpolsador1=0;
    }
    if (Polsador1 == 0){
      __delay_ms(500);
      if (Polsador1 == 1){
        Cpolsador1++;
      }
      // Canvi d'hora
      if (Cpolsador1 == 1){
        desactiva=0;
        cs_dec=s_dec;  
        cs_uni=s_uni;  
        cm_dec=m_dec;
        cm_uni=m_uni;
        ch_dec=h_dec;
        ch_uni=h_uni;
        cdia_s=dia_s;  
        cdia_uni=dia_uni;
        cdia_dec=dia_dec;
        cmes_uni=mes_uni;
        cmes_dec=mes_dec;
        cany_uni=any_uni;
        cany_dec=any_dec;
        cany_cent=any_cent;
        cany_um=any_um;
        // Utilitzada per comparar si s'ha modificat algun valor
        char Comprova1[15]={ch_dec, ch_uni, cm_dec, cm_uni, cs_dec, cs_uni, cdia_s, cdia_dec, cdia_uni,
                            cmes_dec, cmes_uni, cany_um, cany_cent, cany_dec, cany_uni};
        Esborra();
        Canvi=-1; // inicialment no es selecciona ningun parametre
        while(desactiva==0){
          // Envia la pantalla avançada
          Cursor(1,1);
          EnviaL(ch_dec + '0');
          EnviaL(ch_uni + '0');
          EnviaL('.');
          EnviaL(cm_dec + '0');
          EnviaL(cm_uni + '0');
          EnviaL('.');
          EnviaL(cs_dec + '0');
          EnviaL(cs_uni + '0');
          Cursor(2,1);
          EnviaL('d');
          EnviaL(Dies[cdia_s][0]);
          EnviaL(' ');
          EnviaL(cdia_dec + '0');
          EnviaL(cdia_uni + '0');
          EnviaL('/');
          EnviaL(cmes_dec + '0');
          EnviaL(cmes_uni + '0');
          EnviaL('/');
          EnviaL(cany_um + '0');
          EnviaL(cany_cent + '0');
          EnviaL(cany_dec + '0');
          EnviaL(cany_uni + '0');
          Polsad = Polsador();
          if (Polsad == 1) {  // Si s'ha premut el polsador 1 decideix que valor canviar
            Canvi--;
            if (Canvi<0){ // Condicio limit de canvi
              Canvi=6;
            }
            // Pampallueig
            if (Canvi==2){ 
              Cursor(1,7);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==1){
              Cursor(1,4);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==0){
              Cursor(1,1);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==3){
              Cursor(2,1);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==4){
              Cursor(2,4);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==5){
              Cursor(2,7);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==6){
              Cursor(2,10);
              EnviaL(' ');
              EnviaL(' ');
              EnviaL(' ');
              EnviaL(' ');
            }
            __delay_ms(250);
          } 
          if (Polsad == 2) {  // Si s'ha premut el polsador 2 decideix que valor canviar
            Canvi++;
            if (Canvi>6){ // Condicio limit de canvi
              Canvi=0;
            }
            // Pampallueig
            if (Canvi==2){ 
              Cursor(1,7);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==1){
              Cursor(1,4);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==0){
              Cursor(1,1);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==3){
              Cursor(2,1);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==4){
              Cursor(2,4);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==5){
              Cursor(2,7);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==6){
              Cursor(2,10);
              EnviaL(' ');
              EnviaL(' ');
              EnviaL(' ');
              EnviaL(' ');
            }
            __delay_ms(250);
          }
          if (Polsad == 3) {  // Si s'ha premut el polsador 3 incrementa els valors
            if (Canvi==2){
              cs_uni++;
            }
            if (Canvi==1){
              cm_uni++;
            }
            if (Canvi==0){
              ch_uni++;
            }
            if(Canvi==3){
              cdia_s++;
            }
            if(Canvi==4){
              cdia_uni++;
            }
            if(Canvi==5){
              cmes_uni++;
              mes++;
            }
            if(Canvi==6){
              cany_uni++;
              any++;
            }
            __delay_ms(150);
          }
          if (Polsad == 4){  // Si s'ha premut el polsador 4 decrementa els valors
            if (Canvi==2){
              cs_uni--;
            }
            if (Canvi==1){
              cm_uni--;
            }
            if (Canvi==0){
              ch_uni--;
            }
            if(Canvi==3){
              cdia_s--;
            }
            if(Canvi==4){
              cdia_uni--;
            }
            if(Canvi==5){
              cmes_uni--;
              mes--;
            }
            if(Canvi==6){
              cany_uni--;
              any--;
            }
            __delay_ms(150);
          }
          // Any Bisiest
          DiesMes_dec[1]=2;
          DiesMes_uni[1]=9;
          if (any%4==0) { 
            if (any % 100 != 0) { 
              DiesMes_uni[1]=0;
              DiesMes_dec[1]=3;  
            } else {
              if ((any / 100) % 4 == 0) { 
                DiesMes_uni[1]=0;
                DiesMes_dec[1]=3;  
              } 
            }
          }
          // Condicions limit hora
          if(cs_uni>9){
            cs_uni=0;
            cs_dec++;
          }
          if(cs_dec>5){
            cs_dec=0;
          }
          if(cm_uni>9){
            cm_uni=0;
            cm_dec++;
          }
          if(cm_dec>5){
            cm_dec=0;
          }
          if(ch_uni>9){
            ch_uni=0;
            ch_dec++;
          }
          if(ch_dec>2){
            ch_dec=0;
          }
          if(ch_uni>3){
            if(ch_dec>1){
              ch_uni=0;
              ch_dec=0;
            }
          }
          if(cs_uni<0){
            cs_dec--;
            cs_uni=9;  
          }
          if(cs_dec<0){
            cs_dec=5;
            cs_uni=9;
          }
          if(cm_uni<0){
            cm_dec--;
            cm_uni=9;  
          }
          if(cm_dec<0){
            cm_dec=5;
            cm_uni=9;
          }
          if(ch_uni<0){
            ch_dec--;
            ch_uni=9;  
          }
          if(ch_dec<0){
            ch_dec=2;
            ch_uni=3;
          }
          // Condicions limit data
          // Dies
          if(cdia_uni>9){
            cdia_uni=0;
            cdia_dec++;  
          }
          if(cdia_dec>=DiesMes_dec[mes] && cdia_uni>=DiesMes_uni[mes]){
            cdia_dec=0;
            cdia_uni=1;
          }
          if(cdia_uni<0){
            cdia_uni=9;
            cdia_dec--;  
          }
          if(cdia_dec==0 && cdia_uni==0){
            cdia_uni=DiesMes_uni[mes]-1;
            cdia_dec=DiesMes_dec[mes];  
          }
          // Dia setamana
          if(cdia_s>6){
            cdia_s=0;  
          }
          if(cdia_s<0){
            cdia_s=6;  
          }
          // Mesos
          if(cmes_uni>9){
            cmes_uni=0;
            cmes_dec++;
          }
          if(cmes_uni>2 && cmes_dec==1){
            cmes_uni=1;
            cmes_dec=0;
            mes=0;
          }
          if(cmes_uni<0){
            cmes_uni=9;
            cmes_dec--;
          }
          if(cmes_dec==0 && cmes_uni==0){
            cmes_uni=2;
            cmes_dec=1;
            mes=11;
          }
          // Anys
          if(cany_uni>9){
            cany_uni=0;
            cany_dec++;
          }
          if(cany_dec>9){
            cany_dec=0;
            cany_cent++;
          }
          if(cany_cent>9){
            cany_cent=0;
            cany_um++;
          }
          if(cany_um>9){
            cany_um=1;
            cany_cent=9;
            cany_dec=0;
            cany_uni=0;
            any=1900;
          }
          if(cany_uni<0){
            cany_dec--;
            cany_uni=9;  
          }
          if(cany_dec<0){
            cany_dec=9;
            cany_cent--;
          }
          if(cany_cent<0){
            cany_cent=9;
            cany_um--;
          }
          if(cany_um==1 && cany_cent==8 && cany_dec==9 && cany_uni==9){
            cany_um=9;
            cany_cent=9;
            cany_dec=9;
            cany_uni=9;
            any=9999;
          }
          if (Polsador1 == 0){
            __delay_ms(500);
            if (Polsador1 == 1){
              char i;
              char Comprova2[15]={ch_dec, ch_uni, cm_dec, cm_uni, cs_dec, cs_uni, cdia_s, cdia_dec,
                                  cdia_uni, cmes_dec, cmes_uni, cany_um, cany_cent, cany_dec, cany_uni};
              for (i = 0; i < 15; i++) {
                if (Comprova1[i] != Comprova2[i]) {
                  // Es comprova si s'han modificat els valor i si es axi es desan
                  s_uni=cs_uni;
                  s_dec=cs_dec;  
                  m_uni=cm_uni;
                  m_dec=cm_dec;
                  h_uni=ch_uni;
                  h_dec=ch_dec;
                  dia_s=cdia_s;  
                  dia_uni=cdia_uni;
                  dia_dec=cdia_dec;
                  mes_uni=cmes_uni;
                  mes_dec=cmes_dec;
                  any_uni=cany_uni;
                  any_dec=cany_dec;
                  any_cent=cany_cent;
                  any_um=cany_um;
                }
              }
              Cpolsador1++; // Pas a l'altra pantalla
              desactiva=1; // Implica fi del bucle
            }
          }
        }  
      }
      // Configuracio de l'alarma
      if (Cpolsador1 == 2){
        Canvi=-1;
        desactiva=0;
        Esborra();
        // Envia les pantalles d'alarma segons el parametre a modificar
        while(desactiva==0){
          if(Canvi<3){
            Cursor(1,1);
            EnviaL('A');
            EnviaL('l');
            EnviaL('a');
            EnviaL('r');
            EnviaL('m');
            EnviaL('a');
            EnviaL(' ');
            EnviaL(ah_dec + '0');
            EnviaL(ah_uni + '0');
            EnviaL('.');
            EnviaL(am_dec + '0');
            EnviaL(am_uni + '0');
            Cursor(1,14);
            EnviaL(Caracter[sona]);
          } else {
            Cursor(1,1);
            EnviaL('R');
            EnviaL('e');
            EnviaL('p');
            EnviaL('e');
            EnviaL('t');
            EnviaL('e');
            EnviaL('i');
            EnviaL('x');
            EnviaL(' ');
            EnviaL('d');
            EnviaL(Dies[Canvi-3][0]);
            Cursor(1,14);
            EnviaL(Caracter[sona_ds[Canvi-3]]);
            Cursor(2,1);
          }
          Polsad = Polsador();
          if (Polsad == 1) {  // Si s'ha premut el polsador 1 decideix que valor canviar
            Canvi--;
            if (Canvi<0){ // Condicio limit de canvi
              Esborra();
              Canvi=9;
            }
            // Pampallueig
            if (Canvi==0){
              Cursor(1,8);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==1){
              Cursor(1,11);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==2){
              Esborra();
              Canvi=2;
            }
            __delay_ms(150);
          } 
          if (Polsad == 2) {  // Si s'ha premut el polsador 2 decideix que valor cavnair
            if (Canvi==2){ // Permet una interaccio mes correcta amb la pantalla
              Esborra();
            }  
            Canvi++;
            if (Canvi>9){ // Condicio limit de canvi
              Canvi=-1;
              Esborra();
            }
            // Pampallueig
            if (Canvi==0){
              Cursor(1,8);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==1){
              Cursor(1,11);
              EnviaL(' ');
              EnviaL(' ');
            }
            if (Canvi==2){
              Esborra();
              Canvi=3;
            }
            __delay_ms(150);
          }
          if (Polsad == 3) {  // Si s'ha premut el polsador 3 incrementa els valors
            if(Canvi == 0){
              ah_uni++;
            }
            if(Canvi == 1){
              am_uni++;
            }
            __delay_ms(150);
          }
          if (Polsad == 4) {  // Si s'ha premut el polsador 4 decrementa els valors
            if(Canvi == 0){
              ah_uni--;
            }
            if(Canvi == 1){
              am_uni--;
            }
            __delay_ms(150);
          }
          if (Polsad == 5){ 
            if(Canvi>2){ // Activa o desactiva la repeticio de l'alarma per cada dia
              sona_ds[Canvi-3]=sona_ds[Canvi-3]+1;
              if(sona_ds[Canvi-3]>1){
                sona_ds[Canvi-3]=0;
              }
            } else { // Activa o desactiva l'alarma 
              sona++;
              if(sona>1){
                sona=0;
              }
            }
            __delay_ms(150);
          }
          // Condicions limit hora
          if(am_uni>9){
            am_uni=0;
            am_dec++;
          }
          if(am_dec>5){
            am_dec=0;
          }
          if(ah_uni>9){
            ah_uni=0;
            ah_dec++;
          }
          if(ah_dec>2){
            ah_dec=0;
          }
          if(ah_uni>3){
            if(ah_dec>1){
              ah_uni=0;
              ah_dec=0;
            }
          }
          if(am_uni<0){
            am_dec--;
            am_uni=9;  
          }
          if(am_dec<0){
            am_dec=5;
            am_uni=9;
          }
          if(ah_uni<0){
            ah_dec--;
            ah_uni=9;  
          }
          if(ah_dec<0){
            ah_dec=2;
            ah_uni=3;
          }
          if (Polsador1 == 0){ //Sortida del bucle de canvi d'hora
            __delay_ms(500);
            if (Polsador1 == 1){
              Cpolsador1++;
              Esborra();
              desactiva=1;
            }
          }
        }
      }
      // Any Bisiest
      DiesMes_uni[1]=9;
      DiesMes_dec[1]=2;
      if (any%4==0) { 
        if (any % 100 != 0) { 
          DiesMes_uni[1]=0;
          DiesMes_dec[1]=3;  
        } else {
          if ((any / 100) % 4 == 0) { 
            DiesMes_uni[1]=0;
            DiesMes_dec[1]=3;  
          }
        }
      }
      // Condicions limit data
      // Dies
      if(dia_uni>9){
        dia_uni=0;
        dia_dec++;
      }
      if(dia_dec==DiesMes_dec[mes] && dia_uni==DiesMes_uni[mes]){
        dia_uni=1;
        dia_dec=0;
        mes_uni++;
        mes++;
      }
      // Dies setmana
      if(dia_s>6){
        dia_s=0;  
      }
      // Mesos
      if(mes_uni>9){
        mes_uni=0;
        mes_dec++;
      }
      if(mes_uni>2 && mes_dec==1){
        mes_uni=1;
        mes_dec=0;
        mes=0;
        any++;
        any_uni++;
      }
      if(any_uni>9){
        any_uni=0;
        any_dec++;
      }  
      if(any_dec>9){
        any_dec=0;
        any_cent++;
      }
      if(any_cent>9){
        any_cent=0;
        any_um++;
      }
      if(any_um>9){
        any_um=1;
        any_cent=9;
        any_dec=0;
        any_uni=0;
        any=1900;
      }
    }
    // Alarma
    if(posposa==0){
      alh_dec=ah_dec;
      alh_uni=ah_uni;
      alm_dec=am_dec;
      alm_uni=am_uni;
    }
    if(posposa==1){ // Nous valor per la condicio de sonada de l'alarma si s'ha posposat
      alh_dec=ah_dec;
      alh_uni=ah_uni;
      alm_dec=amp_dec;
      alm_uni=amp_uni;
    }
    if(alh_dec==h_dec && alh_uni==h_uni && alm_dec==m_dec && alm_uni==m_uni && s_dec==0 && s_uni==0){
      // Condicións per que soni l'alarma
      char r=0;
      if(sona==1){
        char z;
        char i;
        char m_uniant=0;
        desactiva=0;
        for (z = 0; z < 7; z++) { //Revisa si la llista sona_ds es vuida o no
          if (sona_ds[z] != 0) {
            r++;
          }
        }
        if(r!=0){ //Sona l'alarma si la llista no es vuida, volem que l'alarma es repteixi
          for (i = 0; i < 7; i++) {
            if (sona_ds[i] == 1 && dia_s == i) {
              // Sona l'alarma
              Esborra();
              // Envia la pantalla de sonada de l'alarma
              while(desactiva==0 && temps<5){
                Cursor(1,6);
                EnviaL(h_dec + '0');
                EnviaL(h_uni + '0');
                EnviaL('.');
                EnviaL(m_dec + '0');
                EnviaL(m_uni + '0');
                Cursor(2,1);
                EnviaL('A');
                EnviaL('p');
                EnviaL('a');
                EnviaL('g');
                EnviaL('a');
                EnviaL(' ');
                EnviaL('o');
                EnviaL(' ');
                EnviaL('p');
                EnviaL('o');
                EnviaL('s');
                EnviaL('p');
                EnviaL('o');
                EnviaL('s');
                EnviaL('a');
                EnviaL('!');
                TocaNota(189, 95, 0);  // Valor que correspon aproximadament a mi3
                TocaNota(212, 106, 2);  // Valor que correspon aproximadament a re3
                Polsad=Polsador();
                if(m_uni>m_uniant){ // Compta el temps que porta l'alarma sonant
                  temps++;
                  m_uniant=m_uni;
                }
                if(Polsad==5){ // Posposa l'alarma
                  Esborra();
                  amp_dec=m_dec+1;
                  amp_uni=m_uni;
                  posposa=1;
                  desactiva=1;
                }
                if(Polsad==4){ // Apaga l'alarma
                  Esborra();
                  posposa=0;
                  desactiva=1;
                }
              }
            }
          }
        }
        if(r==0){ //Sona la alarma si no esta configurada per que es repeteixi
          // Sona l'alarma
          Esborra();
          while(desactiva==0 && temps<5){
            // Envia la pantalla de sonada de l'alarma
            Cursor(1,6);
            EnviaL(h_dec + '0');
            EnviaL(h_uni + '0');
            EnviaL('.');
            EnviaL(m_dec + '0');
            EnviaL(m_uni + '0');
            Cursor(2,1);
            EnviaL('A');
            EnviaL('p');
            EnviaL('a');
            EnviaL('g');
            EnviaL('a');
            EnviaL(' ');
            EnviaL('o');
            EnviaL(' ');
            EnviaL('p');
            EnviaL('o');
            EnviaL('s');
            EnviaL('p');
            EnviaL('o');
            EnviaL('s');
            EnviaL('a');
            EnviaL('!');
            TocaNota(189, 95, 0);  // Valor que correspon aproximadament a mi3
            TocaNota(212, 106, 2);  // Valor que correspon aproximadament a re3
            if(m_uni>m_uniant){ // Compta el temps que porta l'alarma sonant
              temps++;
              m_uniant=m_uni;
            }
            Polsad=Polsador();
            if(Polsad==5){ // Posposa l'alarma
              Esborra();
              amp_dec=m_dec+1;
              amp_uni=m_uni;
              posposa=1;
              desactiva=1;
            }
            if(Polsad==4){ // Apaga l'alarma
              Esborra();
              sona=0;
              posposa=0;
              desactiva=1;
            }
          } 
        }
      }
    }
  }  
}
void __interrupt() temporit(void){  // funció d'interrupcions
  if(FiTimer1){  // Si ha acabat el temporitzador
    T1CONbits.TMR1ON = 0;  // Atura momentàniament el Timer1
    TMR1H = 207;  // Temps de una decima de segon
    TMR1L = 19;
    T1CONbits.TMR1ON = 1;  // Torna a engegar el Timer1
    ds++;  // Incrementa Compta
    if (ds == 10) {
      ds=0;
      s_uni++;
    }
    if (s_uni == 10) {
      s_uni=0;
      s_dec++;
    }
    if (s_dec == 6) {
      s_dec=0;
      m_uni++;
    }
    if (m_uni == 10) {
      m_uni=0;
      m_dec++;
    }
    if (m_dec == 6) {
      m_dec=0;
      h_uni++;
    }
    if (h_uni == 10) {
      h_uni=0;
      h_dec++;
    }
    if (h_dec == 2 && h_uni == 4) {
      s_dec=0;
      s_uni=0;
      m_dec=0;
      m_uni=0;
      h_dec=0; 
      h_uni=0;
      dia_uni++;
      dia_s++;
    }
    FiTimer1 = 0;
  }
}
void EnviaL(char Caracter) {
  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
}
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 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(200);  // Retard de 0,2 s
}
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.