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;
}

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