Ir ao conteúdo

Posts recomendados

Postado

Galera,sou novo aqui no forum e vim tirar uma duvida com vocês.

 

eu achei pesquisando na internet um projeto com o pic16f877a de um radio relogio com despertador e termometro entre outras caracteristicas,o esquema ta tudo certo,mas o programa aparecem erros ao compilar, tentei compilar pelo  mikroC pro,mplab x ide e tambem pelo mplab ide 8, todos aparecem erros,então eu queria ver se vocês podiam me ajudar

obs:nao entendo muito de programaçao,lendo o codigo creio q é linguagem C

 

link o projeto:https://antoniopolo.wordpress.com/2012/03/06/radio-fm-pll-digital-termometro-relogio-pic16f877a/

 

codigo:

</pre>
<pre>// LCD module connections
 sbit LCD_RS at RB4_bit;
 sbit LCD_EN at RB5_bit;
 sbit LCD_D4 at RB0_bit;
 sbit LCD_D5 at RB1_bit;
 sbit LCD_D6 at RB2_bit;
 sbit LCD_D7 at RB3_bit;
 sbit LCD_RS_Direction at TRISB4_bit;
 sbit LCD_EN_Direction at TRISB5_bit;
 sbit LCD_D4_Direction at TRISB0_bit;
 sbit LCD_D5_Direction at TRISB1_bit;
 sbit LCD_D6_Direction at TRISB2_bit;
 sbit LCD_D7_Direction at TRISB3_bit;
 // End LCD module connections
 //DS1307 RTC Interfacing with PIC16F877A
 sbit I2C1_Scl at RC3_bit;
 sbit I2C1_Sda at RC4_bit;
 sbit I2C1_Scl_Direction at TRISC3_bit;
 sbit I2C1_Sda_Direction at TRISC4_bit;
 //I2C via software with PIC16F877A - via hardware deu erro para ler o Chip FM
 sbit Soft_I2C_Scl at RD2_bit;
 sbit Soft_I2C_Sda at RD3_bit;
 sbit Soft_I2C_Scl_Direction at TRISD2_bit;
 sbit Soft_I2C_Sda_Direction at TRISD3_bit;
 // End Software I2C connections
 
// Botoes de sintonia
 #define BUTTON_DOWN (PORTD.F0 == 0) //search down
 #define BUTTON_UP (PORTD.F1 == 0) //search up
 #define BUTTON_SET2 (PORTD.F4 == 0)
 #define BUTTON_SET1 (PORTD.F5 == 0)
 #define BUTTON_SNOOZE (PORTD.F7 == 0)
 #define mem_fm_qtd 25 //quantidade de posicoes de memoria para estacoes
 #define tempo_exposicao 50 // tempo exposicao da temperatura
 #define tempo_exposicao2 100 // tempo exposicao data
 
//Range de Frequencias Europa
 #define FREQ_HIGH 108
 #define FREQ_LOW 87.5
 
//nivel do sinal simbolo
 #define nivel_clear Lcd_Chr(1,1,' '); Lcd_Chr(1,2,' '); Lcd_Chr(1,3,' '); Lcd_Chr(1,4,' ')
 #define rele_on PORTB.F7 = 1
 #define rele_off PORTB.F7 = 0
 //define functions
 void Display_Temperature(unsigned int temp2write, unsigned int linha);
 void Sintoniza_freq(float frequex); //sintoniza frequ fixa
 void Le_freq(); //ler o chip FM carregando as variaveis
 void display_freq(float freqrep); //mostra frequencia
 void display_sinal(); // mostr ao nivel do sinal
 void recup_freq(int freq_addr, int sint_yn); //recupera freq da eprom e 0=nao sintoniza / 1=sintoniza
 void grava_Freq(int freq_addr); //grava 2 bytes da pll no eprom
 void display_mem(short int mem_fm); // mostra a frequencia de uma determ posic memoria =1,2,3,4,5
 void acerta_relogio (unsigned short xtipo);
 
void write_ds1307(unsigned short address,unsigned short w_data); //escreve hora
 unsigned short read_ds1307(unsigned short address); //le hora
 unsigned char BCD2UpperCh(unsigned char bcd); //usada no relogio
 unsigned char BCD2LowerCh(unsigned char bcd); //usada no relogio
 void holdx(); // testa tempo de pressao na tecla - vai para ajste alarme ou ajuste hora
 void alarme(); //ajusta alarme
 
//char bcd_to_bin(char bcd);
 //void checa_alarm();
 //end define functions
 
//variaveis do termometro
 unsigned char *tempC = "000.0";
 unsigned int tempinC;
 unsigned long temp_value;
 unsigned char txt[15];
 
//Variaveis do FM
 char frequencyH=0;
 char frequencyL=0;
 int frequencyB;
 long int frequency=0;
 char buffer[5];
 float freq_available=0;
 float freq_available2=0;
 short int showtime; //showtime variavel para shift no display : data x temp
 unsigned int cnt;
 short int flag_exp; //flag para shift display data x temper
 short int niv; //nivel do sinal
 short int st_flag; //informacao de stereo
 short int freq_eprom1; //byte1 da freq recuperado da eprom
 short int freq_eprom2; //byte2 da freq recuperado da eprom
 float freq_now;
 int memoria_fm;
 int hold_bt; //contador para apertar e segurar o botao - set hora
 int temp_min; //variaveis temps alarme
 int temp_hour; //variaveis temps alarme
 
//variaveis de acerto de relogio
 unsigned short xchar; //dois digitos do valor (hora, mes, dia..) para a funcao de acerto do rlogio
 
//variaveis do relogio
 //unsigned int sec;
 unsigned short int minute;
 unsigned short int hour;
 unsigned short int day;
 unsigned short int date;
 unsigned short int month;
 unsigned short int year;
 unsigned char time[9];
 unsigned char ddate[9];
 unsigned char ddate2[9]; //data temporaria para ajuste de hora
 
//variaveis do alarme
 unsigned short a_hour;
 unsigned short a_min;
 unsigned short cnt2;
 unsigned short xalarme; //alarme 0 = alarme off, 1, 2, 3 = qtd do snooze
 bit in_alarm; // se 1 o alarme esta acionado se 0 o alarme nao esta acionado
 
void main()
 {
 
TRISB = 0; // PORTB saida do display lcd
 
//termometro porta analogicas
 ADCON1 = 0b10000000; // 1- opcao osc, 0- left justif, 00-void, 0000 - vref+=vdd vref-=vss todas as portas an = A analogicasA
 TRISA = 0b00110011; //ra0/an0 e ra1/an1 inputs lm35
 TRISD =0xFF; // porta de sera input dos botoes
 CMCON = 0x07; // Disable Comparators
 
Lcd_Init(); // Initialize LCD
 Lcd_Cmd(_LCD_CLEAR); // Clear LCD display
 Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
 
I2C1_Init(32768); //Inicia o DS1307 I2C e define a frequencia do xtal - xtal do tipo de relogio
 
Soft_I2C_Init();
 //Delay_ms(50);
 
//recupera e sintoniza ultima frequencia sintonizada
 recup_freq(0x00, 1);
 //Delay_ms(500);
 Le_freq(); //le freque inicial
 freq_now=freq_available2;
 display_freq(freq_now); //display frequencia
 
//teste do relogio
 //================================
 
write_ds1307(0,0x00);
 
//================= loop principal - inicio =================//
 //================= loop principal - inicio =================//
 //================= loop principal - inicio =================//
 
memoria_fm = 1;
 showtime = 1; //controla tempo de exibicao da hora x temperatura
 flag_exp = 0;
 in_alarm = 0; //alarme nao esta acionado
 
//le informacoes do alarme - hora, min, e snooze
 //a_hour= EEPROM_Read(0xAA); // posicoes de memoria para hora e minuto
 //a_min= EEPROM_Read(0XAF);
 while(1)
 {
 temp_value = ADC_Read(0); // le o sensor numero 1
 temp_value = temp_value*5000;//1077; //1168;
 tempinC = temp_value/1000;
 tempinC = tempinC*10;
 
if(showtime >= tempo_exposicao) if(showtime < tempo_exposicao2) //controle tempo de exposicao da hora x temperatura { VDelay_ms(15); if(flag_exp == 1) { Lcd_Out(2,1," "); Lcd_Chr(2,3,223); //imprime o grau celcius e o C Lcd_Chr(2,4,'C'); Display_Temperature(tempinC,2); flag_exp =0; //tratamento impressao do dia da semana ddate2[6] = BCD2UpperCh(day); ddate2[7] = BCD2LowerCh(day); ddate2[8] = '\0'; if(ddate2[7] == '1') {Lcd_Chr(2, 6, 'D');Lcd_Chr(2, 7, 'o');Lcd_Chr(2, 8, 'm');} if(ddate2[7] == '2') {Lcd_Chr(2, 6, 'S');Lcd_Chr(2, 7, 'e');Lcd_Chr(2, 8, 'g');} if(ddate2[7] == '3') {Lcd_Chr(2, 6, 'T');Lcd_Chr(2, 7, 'e');Lcd_Chr(2, 8, 'r');} if(ddate2[7] == '4') {Lcd_Chr(2, 6, 'Q');Lcd_Chr(2, 7, 'u');Lcd_Chr(2, 8, 'a');} if(ddate2[7] == '5') {Lcd_Chr(2, 6, 'Q');Lcd_Chr(2, 7, 'u');Lcd_Chr(2, 8, 'i');} if(ddate2[7] == '6') {Lcd_Chr(2, 6, 'S');Lcd_Chr(2, 7, 'e');Lcd_Chr(2, 8, 'x');} if(ddate2[7] == '7') {Lcd_Chr(2, 6, 'S');Lcd_Chr(2, 7, 'a');Lcd_Chr(2, 8, 'b');} } showtime++; } else { showtime= 1; } Delay_ms(50); //Acerto de Estacoes de FM //le hora e imprime //======================= //sec=read_ds1307(0); // read second minute=read_ds1307(1); // read minute hour=read_ds1307(2); // read hour day=read_ds1307(3); // read day date=read_ds1307(4); // read date month=read_ds1307(5); // read month year=read_ds1307(6); // read year time[0] = BCD2UpperCh(hour); time[1] = BCD2LowerCh(hour); time[2] = ':'; time[3] = BCD2UpperCh(minute); time[4] = BCD2LowerCh(minute); time[5] = '\0'; ddate[0] = BCD2UpperCh(date); ddate[1] = BCD2LowerCh(date); ddate[2] ='.'; ddate[3] = BCD2UpperCh(month); ddate[4] = BCD2LowerCh(month); ddate[5] ='.'; ddate[6] = BCD2UpperCh(year); ddate[7] = BCD2LowerCh(year); ddate[8] = '\0'; // checa alarme liga rele a_min= EEPROM_Read(0XAF); a_hour= EEPROM_Read(0xAA); xalarme= EEPROM_Read(0XB2); temp_min = minute; //conversoes de hora minuto temp_min = ((temp_min>>4)&0x0f)*10 + (temp_min&0x0f); //bcd to dec
 temp_hour = hour;
 temp_hour = ((temp_hour>>4)&0x0f)*10 + (temp_hour&0x0f); //bcd to dec
 
 if (xalarme >0) //alarme on - snooze maior que zero
 {
 if (temp_hour == a_hour && temp_min== a_min && !in_alarm) //dispara alarme
 {
 in_alarm = 1;
 rele_on;
 write_ds1307(7,0x10);
 xalarme--; //snooze menos 1
 if (xalarme 59) {a_min=0; a_hour++; if (a_hour > 23) a_hour = 0;} //ajuste estouros
 
 EEPROM_Write(0xAA, a_hour); //regrava alarme
 EEPROM_Write(0xAF, a_min);
 EEPROM_Write(0xB2, xalarme);
 in_alarm =0; // rehabilita alarme
 }
 }
 
 }
 if (xalarme >0) Lcd_Chr(2, 11, 'a'); else Lcd_Chr(2, 11, ' ');//indicador de alarme ligado
 
if(BUTTON_SNOOZE){ write_ds1307(7,0x00); PORTB.F7 = ~PORTB.F7; Vdelay_ms(500);} // botao snooze
 Lcd_Out(2,12,time);
 
 if(showtime < tempo_exposicao) //controle tempo de exposicao da data x temperatura { if(flag_exp == 0) { Lcd_Out(2,1," "); Lcd_Out(2,1,ddate); flag_exp =1; } showtime++; } if(BUTTON_DOWN) //search down { while(BUTTON_DOWN) // incrementa sem sintonizar { freq_now = freq_now - 0.1; display_freq(freq_now); VDelay_ms(50); } Sintoniza_freq(freq_now); VDelay_ms(100) ; Le_Freq(); } if(BUTTON_UP) //search up { while(BUTTON_UP) // incrementa decrem sem sintonizar { freq_now = freq_now + 0.1; display_freq(freq_now); VDelay_ms(50); } Sintoniza_freq(freq_now); VDelay_ms(100) ; Le_Freq(); } if(BUTTON_SET1) //menu de memorizacao de estacoes { hold_bt = 0; // pressionar e segurar o botao de SET- ajuste de hora holdx(); //ajuste de hora e alarme if (hold_bt > 800) // ajuste de hora
 {
 write_ds1307(0,0x80); //write sec stop oscilator
 acerta_relogio(2); //hour
 acerta_relogio(1); //minute
 acerta_relogio(4); //date
 acerta_relogio(5); //month
 acerta_relogio(6); //year
 acerta_relogio(3); //day
 write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator
 }
 
if (hold_bt > 440) if (hold_bt cnt=0;
 memoria_fm = 1;
 display_mem(memoria_fm);
 
while(cnt<550)
 {
 VDelay_ms(5); // COMENTADO PARA LIBERAR MEMORIA
 // if(BUTTON_DOWN) //decresce memoria
 // {
 // VDelay_ms(15) ;
 // cnt=0;
 //while(BUTTON_DOWN) // debounce button
 //{
 // memoria_fm = memoria_fm -2;
 // if (memoria_fm mem_fm_qtd) memoria_fm=1;
 display_mem(memoria_fm);
 VDelay_ms(100) ;
 
//}
 }
 
if(BUTTON_SET2) //memoriza estação
 {
 VDelay_ms(15) ;
 //while(BUTTON_SET2)
 //{
 recup_freq(0x00,0); //recupera a frequencia atual atualiza variaveis
 Delay_ms(500);
 Le_freq(); // le frequencia do FM e atualiza variaveis
 grava_Freq(0x00+(memoria_fm+1));
 cnt=1000;
 //}
 }
 cnt++;
 }
 
Lcd_Cmd(_LCD_CLEAR);
 /*
 if (cnt == 1001) // saiu pois memorizou a estacao = mantem estacao e grava na memoria a mesma
 {
 Lcd_Cmd(_LCD_CLEAR);
 recup_freq(0x00,1); //recupera a frequencia atual atualiza variaveis
 freq_now=freq_available2;
 display_freq(freq_now); //display frequencia
 Le_freq(); // le frequencia do FM e atualiza variaveis
 }
 if (cnt == 550) //saiu por time out = sintoniza a estacao corrente da memoria
 {
 Lcd_Cmd(_LCD_CLEAR);
 display_freq(freq_now); //display frequencia
 Le_freq(); // le frequencia do FM e atualiza variaveis
 }
 */
 
} //end do if de set1 - memoriza estacoes
 if(BUTTON_SET2) //browse estacoes memorizadas
 {
 
cnt=0;
 display_mem(memoria_fm);
 
while(cnt<150)
 {
 
 VDelay_ms(15) ;
 if(BUTTON_DOWN) //acresce memoria
 {
 VDelay_ms(15) ;
 cnt=0;
 //while(BUTTON_DOWN) // debounce button
 // {
 memoria_fm = memoria_fm -2;
 if (memoria_fm mem_fm_qtd) memoria_fm=1;
 display_mem(memoria_fm);
 VDelay_ms(100) ;
 recup_freq(0x00+(memoria_fm+1),1); //recupera a frequencia atual atualiza variaveis
 freq_now=freq_available2;
 display_freq(freq_now); //display frequencia
 Le_freq(); // le frequencia do FM e atualiza variaveis
 Sintoniza_freq(freq_now);
 
//}
 }
 
cnt++;
 }
 display_sinal(); // mostr ao nivel do sinal
 } //end do if de set2 - browse estacoes
 
} //end while
 //================= loop principal - final =================//
 //================= loop principal - final =================//
 //================= loop principal - final =================//
 } // end main
 
void Display_Temperature(unsigned int temp2write, unsigned int linha) {
 if (temp2write/10000)// convert Temp to characters// 48 is the decimal character code value for displaying 0 on LCD
 tempC[0] = temp2write/10000 + 48;
 else tempC[0] = ' ';
 tempC[1] = (temp2write/1000)%10 + 48; // Extract tens digit
 tempC[2] = (temp2write/100)%10 + 48; // Extract ones digit
 tempC[4] = (temp2write/10)%10 + 48; // Extract tens digit
 Lcd_Chr(linha,1,tempC[1]); // print temperature on LCD
 Lcd_Chr(linha,2,tempC[2]);
 }
 
void Sintoniza_freq(float frequex) { // Set frequencia fixa no FM
 
if (frequex < FREQ_LOW) { frequex = FREQ_HIGH; freq_now=FREQ_HIGH; } if (frequex > FREQ_HIGH)
 {
 frequex = FREQ_LOW;
 freq_now=FREQ_LOW;
 }
 
frequency=frequex*1000000; //starting frequency 89.7 novafm
 frequencyB=(4*(frequency+225000))/32768; //valor decimal da pll
 frequencyH=frequencyB>>8; // desloca 8 bytes e pega entao o primeiro byte = 00110010 - decimal 50
 frequencyL=frequencyB&0XFF; // pega o 2nd byte faz(AND) com 00000000 11111111 -> resultado 10000010 - dec 130
 Soft_I2C_Start();
 Soft_I2C_Write(0xC0); //endereço do chip FM - write mode
 Soft_I2C_Write(frequencyH); //byte1
 Soft_I2C_Write(frequencyL); //byte2
 Soft_I2C_Write(0xB0); //byte3
 Soft_I2C_Write(0x10); //byte4
 Soft_I2C_Write(0x00); //byte5
 Soft_I2C_Stop();
 
grava_Freq(0x00); //grava 1o e 2o bytes com a frequencia sintonizada
 //0x00 e 0x01 sao os enderecos para gravacao da ultima estacao
 
}
 
void Le_Freq() //atualiza variaveis de frequ e variaveis de sinal, fm
 {
 Soft_I2C_Start();
 Soft_I2C_Write(0xC1);
 buffer[0] = Soft_I2C_Read(1);
 buffer[1] = Soft_I2C_Read(1);
 buffer[2] = Soft_I2C_Read(1);
 buffer[3] = Soft_I2C_Read(1);
 buffer[4] = Soft_I2C_Read(1);
 Soft_I2C_Stop();
 
Delay_ms(50);
 freq_available=(((buffer[0]&0x3F)<>4; // valor numerico do nivel do sinal
 display_sinal(); // mostr anivel do sinal
 //flag de stereo - acende o led
 st_flag = buffer[2]>>7;
 if (st_flag ==0) {Lcd_Chr(1,15,' ');Lcd_Chr(1,16,' ');}
 else {Lcd_Chr(1,15,'F');Lcd_Chr(1,16,'m');}
 
}
 
void display_freq(float freqrep)
 {
 long int i;
 if (freqrep < FREQ_LOW) { freqrep = FREQ_HIGH; freq_now=FREQ_HIGH; } if (freqrep > FREQ_HIGH)
 {
 freqrep = FREQ_LOW;
 freq_now= FREQ_LOW;
 }
 
i= (freqrep*1000000)-30000; //soma 50k para acertar arredondamento
 
longToStr(i, txt);
 
Lcd_Chr(1,5,txt[2]);
 Lcd_Chr(1,6,txt[3]);
 Lcd_Chr(1,7,txt[4]);
 Lcd_Chr(1,8,'.');
 Lcd_Chr(1,9,txt[5]);
 Lcd_Out(1,10, "Mhz");
 }
 void display_sinal() //imprime nivel do sinal graficamente
 {
 nivel_clear;
 if (niv=3 && niv4 && niv8 && niv12 ) {nivel_clear;Lcd_Chr(1,1,'o');Lcd_Chr(1,2,'o');Lcd_Chr(1,3,'o');Lcd_Chr(1,4,'o');}
 
}
 void grava_Freq(int freq_addr) // Grava frequencia - enderecos da 877a 0x00 - 0xFF (256bytes)
 {
 EEPROM_Write(freq_addr, frequencyH);
 EEPROM_Write(freq_addr+1, frequencyL);
 }
 void recup_freq(int freq_addr, int sint_yn) //recupera frequencia DA MEMORIA e sintoniza a mesma
 // 1 = le bytes da eprom e sintoniza , 0 = apenas le os bytes da eprom
 {
 
frequencyH= EEPROM_Read(freq_addr);
 frequencyL= EEPROM_Read(freq_addr+1);
 
if (sint_yn== 1)
 {
 Soft_I2C_Start();
 Soft_I2C_Write(0xC0); //endereço do chip FM - write mode
 Soft_I2C_Write(frequencyH); //byte1
 Soft_I2C_Write(frequencyL); //byte2
 Soft_I2C_Write(0xB0); //byte3
 Soft_I2C_Write(0x10); //byte4
 Soft_I2C_Write(0x00); //byte5
 Soft_I2C_Stop();
 }
 
}
 void display_mem(short int mem_fm)
 {
 Lcd_Cmd(_LCD_CLEAR);
 Lcd_Chr(2,1,'M');
 Lcd_Chr(2,2,'e');
 Lcd_Chr(2,3,'m');
 inttostr(mem_fm,txt);
 Lcd_Out(2, 8, txt);
 
recup_freq(0x00+(mem_fm+1), 0); //memoria 1
 
if (frequencyL == 0xFF) //memoria sem estacao gravada
 {
 Lcd_Chr(1,5,'-');
 Lcd_Chr(1,6,'-');
 Lcd_Chr(1,7,'-');
 Lcd_Chr(1,8,'.');
 Lcd_Chr(1,9,'-');
 Lcd_Out(1,10, "Mhz");
 }
 else //memoria COM estacao gravada
 {
 
freq_available=((frequencyH< 0xD0
 I2C1_Wr(address);
 I2C1_Repeated_Start();
 I2C1_Wr(0xd1);
 I2C1_Rd(0);
 I2C1_stop();
 }
 void write_ds1307(unsigned short address,unsigned short w_data)
 {
 I2C1_Start(); // issue I2C start signal
 I2C1_Wr(0xD0); // send byte via I2C (device address + W)
 I2C1_Wr(address); // send byte (address of DS1307 location)
 I2C1_Wr(w_data); // send data (data to be written)
 I2C1_Stop(); // issue I2C stop signal
 }
 //manipulacao de tipos para o relogio
 unsigned char BCD2UpperCh(unsigned char bcd)
 {
 return ((bcd >> 4) + '0');
 }
 
//manipulacao de tipos para o relogio
 unsigned char BCD2LowerCh(unsigned char bcd)
 {
 return ((bcd & 0x0F) + '0');
 }
void alarme()
{
 
//Lcd_Cmd(_LCD_CLEAR);
 //Delay_ms(5000);
 a_hour= EEPROM_Read(0xAA); // posicoes de memoria para hora e minuto
 a_min= EEPROM_Read(0XAF);
 xalarme= EEPROM_Read(0XB2);
 
if (a_hour == 0xFF) a_hour = 0; //se posicao de memoria vazia - zera variaveis
 if (a_min == 0xFF) a_min = 0;
 if (xalarme == 0xFF) xalarme = 0;
 
Lcd_Cmd(_LCD_CLEAR);
 
cnt2 = 0;
 
while(cnt2 < 100) { cnt2++; inttostr(a_hour,ddate2); Lcd_Chr(1, 8, ddate2[4]); Lcd_Chr(1, 9, ddate2[5]); Lcd_Chr(1, 10, ':'); inttostr(a_min,ddate2); Lcd_Chr(1, 11, ddate2[4]); Lcd_Chr(1, 12, ddate2[5]); inttostr(xalarme,ddate2); Lcd_Chr(1, 1, 'A');Lcd_Chr(1, 2, 'l');Lcd_Chr(1, 3, ':'); Lcd_Chr(1, 5, ddate2[4]); Lcd_Chr(1, 6, ddate2[5]); if(BUTTON_DOWN) { cnt2=0; a_hour++; Delay_ms(150); if (a_hour > 23) a_hour = 0;
 inttostr(a_hour,ddate2);
 Lcd_Chr(1, 8, ddate2[4]);
 Lcd_Chr(1, 9, ddate2[5]);
 }
 
if(BUTTON_UP)
 {
 cnt2=0;
 a_min++;
 Delay_ms(150);
 if (a_min > 60) a_min = 0;
 inttostr(a_min,ddate2);
 Lcd_Chr(1, 10, ddate2[4]);
 Lcd_Chr(1, 11, ddate2[5]);
 }
 if(BUTTON_SET2)
 {
 cnt2=0;
 xalarme++;
 Delay_ms(150);
 if (xalarme > 3) xalarme = 0;
 inttostr(xalarme,ddate2);
 Lcd_Chr(1, 1, 'A');Lcd_Chr(1, 2, 'l');Lcd_Chr(1, 3, ':');
 Lcd_Chr(1, 5, ddate2[4]);
 Lcd_Chr(1, 6, ddate2[5]);
 
}
 in_alarm =0; // rehabilita alarme
 EEPROM_Write(0xAA, a_hour);
 EEPROM_Write(0xAF, a_min);
 EEPROM_Write(0xB2, xalarme);
 }
 }
 
//acerta relogio - grava novo valor
void acerta_relogio (unsigned short xtipo)
{
 
unsigned short xlimite;
unsigned short xchart;
 
Lcd_Cmd(_LCD_CLEAR);
 
xchart = 0;
 
if (xtipo==2) {Lcd_Out(1, 1, "Hora:");xlimite=23;}
if (xtipo==1) {Lcd_Out(1, 1, "Min:");xlimite=59;}
if (xtipo==4) {Lcd_Out(1, 1, "Dia:");xlimite=31;}
if (xtipo==5) {Lcd_Out(1, 1, "Mes:");xlimite=12;}
if (xtipo==6) {Lcd_Out(1, 1, "Ano:");xlimite=20;}
if (xtipo==3) {Lcd_Out(1, 1, "Semana:");xlimite=7;}
 
for(;;)
{
 
inttostr(xchart,ddate2);
 
Lcd_Chr(1, 10, ddate2[4]);
Lcd_Chr(1, 11, ddate2[5]);
//Lcd_Out(2, 1, ddate2);
 
if(BUTTON_UP) // advance hour
{
VDelay_ms(150) ;
xchart++;
if (xchart>xlimite) xchart=0;
}
 
if(BUTTON_SET2) // valid
{
VDelay_ms(550) ;
write_ds1307(xtipo,dec2bcd(xchart)); //write hour
break ; // exit loop
}
}
}
void holdx()
{
 
while(BUTTON_SET1) //hold botão de SET1 - ajuste de hora
 {
 hold_bt++;
 
if (hold_bt == 440) Lcd_Out(2, 1, "Alarme ");
 
if (hold_bt == 800) Lcd_Out(2, 1, "Hora ");
 
VDelay_ms(5);
 }
 }
<pre>

 

segue tambem o esquema anexado

 

e desde já agradeço

Projeto parte 1.jpg

Projeto parte 2.jpg

Postado

O mais correto é que fale para ele que ha erros no código, e que ele faça as alterações. Dei uma olhada no código e o que ha na maioria é erros por falta de chaves, parêntesis e afins. Isto só pode ser corrigido por quem sabe precisamente a lógica do funcionamento.

Corrigir alguns erros de sintaxe é relativamente fácil, complicado é corrigir erros mantendo a lógica de quem fez o projeto, sem ter muita base sobre o projeto é complicado. Fiz umas alterações no código e ele compila sem erros no MikroC, mas duvido funcionar hahahaha. Realmente o certo é você ir falar com o dono para que ele revise o projeto.

 

Spoiler

// LCD module connections
 sbit LCD_RS at RB4_bit;
 sbit LCD_EN at RB5_bit;
 sbit LCD_D4 at RB0_bit;
 sbit LCD_D5 at RB1_bit;
 sbit LCD_D6 at RB2_bit;
 sbit LCD_D7 at RB3_bit;
 sbit LCD_RS_Direction at TRISB4_bit;
 sbit LCD_EN_Direction at TRISB5_bit;
 sbit LCD_D4_Direction at TRISB0_bit;
 sbit LCD_D5_Direction at TRISB1_bit;
 sbit LCD_D6_Direction at TRISB2_bit;
 sbit LCD_D7_Direction at TRISB3_bit;
 // End LCD module connections
 //DS1307 RTC Interfacing with PIC16F877A
 sbit I2C1_Scl at RC3_bit;
 sbit I2C1_Sda at RC4_bit;
 sbit I2C1_Scl_Direction at TRISC3_bit;
 sbit I2C1_Sda_Direction at TRISC4_bit;
 //I2C via software with PIC16F877A - via hardware deu erro para ler o Chip FM
 sbit Soft_I2C_Scl at RD2_bit;
 sbit Soft_I2C_Sda at RD3_bit;
 sbit Soft_I2C_Scl_Direction at TRISD2_bit;
 sbit Soft_I2C_Sda_Direction at TRISD3_bit;
 // End Software I2C connections

// Botoes de sintonia
 #define BUTTON_DOWN (PORTD.F0 == 0) //search down
 #define BUTTON_UP (PORTD.F1 == 0) //search up
 #define BUTTON_SET2 (PORTD.F4 == 0)
 #define BUTTON_SET1 (PORTD.F5 == 0)
 #define BUTTON_SNOOZE (PORTD.F7 == 0)
 #define mem_fm_qtd 25 //quantidade de posicoes de memoria para estacoes
 #define tempo_exposicao 50 // tempo exposicao da temperatura
 #define tempo_exposicao2 100 // tempo exposicao data

//Range de Frequencias Europa
 #define FREQ_HIGH 108
 #define FREQ_LOW 87.5

//nivel do sinal simbolo
 #define nivel_clear Lcd_Chr(1,1,' '); Lcd_Chr(1,2,' '); Lcd_Chr(1,3,' '); Lcd_Chr(1,4,' ')
 #define rele_on PORTB.F7 = 1
 #define rele_off PORTB.F7 = 0
 //define functions
 void Display_Temperature(unsigned int temp2write, unsigned int linha);
 void Sintoniza_freq(float frequex); //sintoniza frequ fixa
 void Le_freq(); //ler o chip FM carregando as variaveis
 void display_freq(float freqrep); //mostra frequencia
 void display_sinal(); // mostr ao nivel do sinal
 void recup_freq(int freq_addr, int sint_yn); //recupera freq da eprom e 0=nao sintoniza / 1=sintoniza
 void grava_Freq(int freq_addr); //grava 2 bytes da pll no eprom
 void display_mem(short int mem_fm); // mostra a frequencia de uma determ posic memoria =1,2,3,4,5
 void acerta_relogio (unsigned short xtipo);

void write_ds1307(unsigned short address,unsigned short w_data); //escreve hora
 unsigned short read_ds1307(unsigned short address); //le hora
 unsigned char BCD2UpperCh(unsigned char bcd); //usada no relogio
 unsigned char BCD2LowerCh(unsigned char bcd); //usada no relogio
 void holdx(); // testa tempo de pressao na tecla - vai para ajste alarme ou ajuste hora
 void alarme(); //ajusta alarme

//char bcd_to_bin(char bcd);
 //void checa_alarm();
 //end define functions

//variaveis do termometro
 unsigned char *tempC = "000.0";
 unsigned int tempinC;
 unsigned long temp_value;
 unsigned char txt[15];

//Variaveis do FM
 char frequencyH=0;
 char frequencyL=0;
 int frequencyB;
 long int frequency=0;
 char buffer[5];
 float freq_available=0;
 float freq_available2=0;
 short int showtime; //showtime variavel para shift no display : data x temp
 unsigned int cnt;
 short int flag_exp; //flag para shift display data x temper
 short int niv; //nivel do sinal
  short int niv2;
   short int niv4;
    short int niv12;
     short int niv8;
      short int address;
 short int st_flag; //informacao de stereo
 short int freq_eprom1; //byte1 da freq recuperado da eprom
 short int freq_eprom2; //byte2 da freq recuperado da eprom
 float freq_now;
 int memoria_fm;
 int hold_bt; //contador para apertar e segurar o botao - set hora
 int temp_min; //variaveis temps alarme
 int temp_hour; //variaveis temps alarme

//variaveis de acerto de relogio
 unsigned short xchar; //dois digitos do valor (hora, mes, dia..) para a funcao de acerto do rlogio

//variaveis do relogio
 //unsigned int sec;
 unsigned short int minute;
 unsigned short int hour;
 unsigned short int day;
 unsigned short int date;
 unsigned short int month;
 unsigned short int year;
 unsigned char time[9];
 unsigned char ddate[9];
 unsigned char ddate2[9]; //data temporaria para ajuste de hora

//variaveis do alarme
 unsigned short a_hour;
 unsigned short a_min;
 unsigned short cnt2;
 unsigned short xalarme; //alarme 0 = alarme off, 1, 2, 3 = qtd do snooze
 bit in_alarm; // se 1 o alarme esta acionado se 0 o alarme nao esta acionado

void main()
 {

TRISB = 0; // PORTB saida do display lcd

//termometro porta analogicas
 ADCON1 = 0b10000000; // 1- opcao osc, 0- left justif, 00-void, 0000 - vref+=vdd vref-=vss todas as portas an = A analogicasA
 TRISA = 0b00110011; //ra0/an0 e ra1/an1 inputs lm35
 TRISD =0xFF; // porta de sera input dos botoes
 CMCON = 0x07; // Disable Comparators

Lcd_Init(); // Initialize LCD
 Lcd_Cmd(_LCD_CLEAR); // Clear LCD display
 Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off

I2C1_Init(32768); //Inicia o DS1307 I2C e define a frequencia do xtal - xtal do tipo de relogio

Soft_I2C_Init();
 //Delay_ms(50);

//recupera e sintoniza ultima frequencia sintonizada
 recup_freq(0x00, 1);
 //Delay_ms(500);
 Le_freq(); //le freque inicial
 freq_now=freq_available2;
 display_freq(freq_now); //display frequencia

//teste do relogio
 //================================

write_ds1307(0,0x00);

//================= loop principal - inicio =================//
 //================= loop principal - inicio =================//
 //================= loop principal - inicio =================//

memoria_fm = 1;
 showtime = 1; //controla tempo de exibicao da hora x temperatura
 flag_exp = 0;
 in_alarm = 0; //alarme nao esta acionado

//le informacoes do alarme - hora, min, e snooze
 //a_hour= EEPROM_Read(0xAA); // posicoes de memoria para hora e minuto
 //a_min= EEPROM_Read(0XAF);
 while(1)
 {
 temp_value = ADC_Read(0); // le o sensor numero 1
 temp_value = temp_value*5000;//1077; //1168;
 tempinC = temp_value/1000;
 tempinC = tempinC*10;

if(showtime >= tempo_exposicao) if(showtime < tempo_exposicao2) //controle tempo de exposicao da hora x temperatura { VDelay_ms(15); if(flag_exp == 1) { Lcd_Out(2,1," "); Lcd_Chr(2,3,223); //imprime o grau celcius e o C Lcd_Chr(2,4,'C'); Display_Temperature(tempinC,2); flag_exp =0; //tratamento impressao do dia da semana ddate2[6] = BCD2UpperCh(day); ddate2[7] = BCD2LowerCh(day); ddate2[8] = '\0'; if(ddate2[7] == '1') {Lcd_Chr(2, 6, 'D');Lcd_Chr(2, 7, 'o');Lcd_Chr(2, 8, 'm');} if(ddate2[7] == '2') {Lcd_Chr(2, 6, 'S');Lcd_Chr(2, 7, 'e');Lcd_Chr(2, 8, 'g');} if(ddate2[7] == '3') {Lcd_Chr(2, 6, 'T');Lcd_Chr(2, 7, 'e');Lcd_Chr(2, 8, 'r');} if(ddate2[7] == '4') {Lcd_Chr(2, 6, 'Q');Lcd_Chr(2, 7, 'u');Lcd_Chr(2, 8, 'a');} if(ddate2[7] == '5') {Lcd_Chr(2, 6, 'Q');Lcd_Chr(2, 7, 'u');Lcd_Chr(2, 8, 'i');} if(ddate2[7] == '6') {Lcd_Chr(2, 6, 'S');Lcd_Chr(2, 7, 'e');Lcd_Chr(2, 8, 'x');} if(ddate2[7] == '7') {Lcd_Chr(2, 6, 'S');Lcd_Chr(2, 7, 'a');Lcd_Chr(2, 8, 'b');} } showtime++; } else { showtime= 1; } Delay_ms(50); //Acerto de Estacoes de FM //le hora e imprime //======================= //sec=read_ds1307(0); // read second minute=read_ds1307(1); // read minute hour=read_ds1307(2); // read hour day=read_ds1307(3); // read day date=read_ds1307(4); // read date month=read_ds1307(5); // read month year=read_ds1307(6); // read year time[0] = BCD2UpperCh(hour); time[1] = BCD2LowerCh(hour); time[2] = ':'; time[3] = BCD2UpperCh(minute); time[4] = BCD2LowerCh(minute); time[5] = '\0'; ddate[0] = BCD2UpperCh(date); ddate[1] = BCD2LowerCh(date); ddate[2] ='.'; ddate[3] = BCD2UpperCh(month); ddate[4] = BCD2LowerCh(month); ddate[5] ='.'; ddate[6] = BCD2UpperCh(year); ddate[7] = BCD2LowerCh(year); ddate[8] = '\0'; // checa alarme liga rele a_min= EEPROM_Read(0XAF); a_hour= EEPROM_Read(0xAA); xalarme= EEPROM_Read(0XB2); temp_min = minute; //conversoes de hora minuto temp_min = ((temp_min>>4)&0x0f)*10 + (temp_min&0x0f); //bcd to dec
 temp_hour = hour;
 temp_hour = ((temp_hour>>4)&0x0f)*10 + (temp_hour&0x0f); //bcd to dec

 if (xalarme >0) //alarme on - snooze maior que zero
 {
 if (temp_hour == a_hour && temp_min== a_min && !in_alarm) //dispara alarme
 {
 in_alarm = 1;
 rele_on;
 write_ds1307(7,0x10);
 xalarme--; //snooze menos 1
 if (xalarme== 59) {a_min=0; a_hour++; if (a_hour > 23) a_hour = 0;} //ajuste estouros

 EEPROM_Write(0xAA, a_hour); //regrava alarme
 EEPROM_Write(0xAF, a_min);
 EEPROM_Write(0xB2, xalarme);
 in_alarm =0; // rehabilita alarme
 }
 }


 if (xalarme >0) Lcd_Chr(2, 11, 'a'); else Lcd_Chr(2, 11, ' ');//indicador de alarme ligado

if(BUTTON_SNOOZE){ write_ds1307(7,0x00); PORTB.F7 = ~PORTB.F7; Vdelay_ms(500);} // botao snooze
 Lcd_Out(2,12,time);

 if(showtime < tempo_exposicao) //controle tempo de exposicao da data x temperatura { if(flag_exp == 0) { Lcd_Out(2,1," "); Lcd_Out(2,1,ddate); flag_exp =1; } showtime++; } if(BUTTON_DOWN) //search down { while(BUTTON_DOWN) // incrementa sem sintonizar { freq_now = freq_now - 0.1; display_freq(freq_now); VDelay_ms(50); } Sintoniza_freq(freq_now); VDelay_ms(100) ; Le_Freq(); } if(BUTTON_UP) //search up { while(BUTTON_UP) // incrementa decrem sem sintonizar { freq_now = freq_now + 0.1; display_freq(freq_now); VDelay_ms(50); } Sintoniza_freq(freq_now); VDelay_ms(100) ; Le_Freq(); } if(BUTTON_SET1) //menu de memorizacao de estacoes { hold_bt = 0; // pressionar e segurar o botao de SET- ajuste de hora holdx(); //ajuste de hora e alarme if (hold_bt > 800) // ajuste de hora
 {
 write_ds1307(0,0x80); //write sec stop oscilator
 acerta_relogio(2); //hour
 acerta_relogio(1); //minute
 acerta_relogio(4); //date
 acerta_relogio(5); //month
 acerta_relogio(6); //year
 acerta_relogio(3); //day
 write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator
 }

if (hold_bt > 440)
cnt=0;
 memoria_fm = 1;
 display_mem(memoria_fm);

while(cnt<550)
 {
 VDelay_ms(5); // COMENTADO PARA LIBERAR MEMORIA
 // if(BUTTON_DOWN) //decresce memoria
 // {
 // VDelay_ms(15) ;
 // cnt=0;
 //while(BUTTON_DOWN) // debounce button
 //{
 // memoria_fm = memoria_fm -2;
 // if (memoria_fm mem_fm_qtd) memoria_fm=1;
 display_mem(memoria_fm);
 VDelay_ms(100) ;

//}

if(BUTTON_SET2) //memoriza estação
 {
 VDelay_ms(15) ;
 //while(BUTTON_SET2)
 //{
 recup_freq(0x00,0); //recupera a frequencia atual atualiza variaveis
 Delay_ms(500);
 Le_freq(); // le frequencia do FM e atualiza variaveis
 grava_Freq(0x00+(memoria_fm+1));
 cnt=1000;
 //}
 }
 cnt++;
 }

Lcd_Cmd(_LCD_CLEAR);
 /*
 if (cnt == 1001) // saiu pois memorizou a estacao = mantem estacao e grava na memoria a mesma
 {
 Lcd_Cmd(_LCD_CLEAR);
 recup_freq(0x00,1); //recupera a frequencia atual atualiza variaveis
 freq_now=freq_available2;
 display_freq(freq_now); //display frequencia
 Le_freq(); // le frequencia do FM e atualiza variaveis
 }
 if (cnt == 550) //saiu por time out = sintoniza a estacao corrente da memoria
 {
 Lcd_Cmd(_LCD_CLEAR);
 display_freq(freq_now); //display frequencia
 Le_freq(); // le frequencia do FM e atualiza variaveis
 }
 */

 //end do if de set1 - memoriza estacoes
 if(BUTTON_SET2) //browse estacoes memorizadas
 {

cnt=0;
 display_mem(memoria_fm);

while(cnt<150)
 {

 VDelay_ms(15) ;
 if(BUTTON_DOWN) //acresce memoria
 {
 VDelay_ms(15) ;
 cnt=0;
 //while(BUTTON_DOWN) // debounce button
 // {
 memoria_fm = memoria_fm -2;
 if (memoria_fm && mem_fm_qtd) memoria_fm=1;
 display_mem(memoria_fm);
 VDelay_ms(100) ;
 recup_freq(0x00+(memoria_fm+1),1); //recupera a frequencia atual atualiza variaveis
 freq_now=freq_available2;
 display_freq(freq_now); //display frequencia
 Le_freq(); // le frequencia do FM e atualiza variaveis
 Sintoniza_freq(freq_now);

//}
 }

cnt++;
 }
  display_sinal(); // mostr ao nivel do sinal
 } //end do if de set2 - browse estacoes

} //end while
 //================= loop principal - final =================//
 //================= loop principal - final =================//
 //================= loop principal - final =================//
 } // end main

void Display_Temperature(unsigned int temp2write, unsigned int linha) {
 if (temp2write/10000)// convert Temp to characters// 48 is the decimal character code value for displaying 0 on LCD
 tempC[0] = temp2write/10000 + 48;
 else tempC[0] = ' ';
 tempC[1] = (temp2write/1000)%10 + 48; // Extract tens digit
 tempC[2] = (temp2write/100)%10 + 48; // Extract ones digit
 tempC[4] = (temp2write/10)%10 + 48; // Extract tens digit
 Lcd_Chr(linha,1,tempC[1]); // print temperature on LCD
 Lcd_Chr(linha,2,tempC[2]);
 }

void Sintoniza_freq(float frequex) { // Set frequencia fixa no FM

if (frequex < FREQ_LOW) { frequex = FREQ_HIGH; freq_now=FREQ_HIGH; } if (frequex > FREQ_HIGH)
 {
 frequex = FREQ_LOW;
 freq_now=FREQ_LOW;
 }

frequency=frequex*1000000; //starting frequency 89.7 novafm
 frequencyB=(4*(frequency+225000))/32768; //valor decimal da pll
 frequencyH=frequencyB>>8; // desloca 8 bytes e pega entao o primeiro byte = 00110010 - decimal 50
 frequencyL=frequencyB&0XFF; // pega o 2nd byte faz(AND) com 00000000 11111111 -> resultado 10000010 - dec 130
 Soft_I2C_Start();
 Soft_I2C_Write(0xC0); //endereço do chip FM - write mode
 Soft_I2C_Write(frequencyH); //byte1
 Soft_I2C_Write(frequencyL); //byte2
 Soft_I2C_Write(0xB0); //byte3
 Soft_I2C_Write(0x10); //byte4
 Soft_I2C_Write(0x00); //byte5
 Soft_I2C_Stop();

grava_Freq(0x00); //grava 1o e 2o bytes com a frequencia sintonizada
 //0x00 e 0x01 sao os enderecos para gravacao da ultima estacao

}

void Le_Freq() //atualiza variaveis de frequ e variaveis de sinal, fm
 {
 Soft_I2C_Start();
 Soft_I2C_Write(0xC1);
 buffer[0] = Soft_I2C_Read(1);
 buffer[1] = Soft_I2C_Read(1);
 buffer[2] = Soft_I2C_Read(1);
 buffer[3] = Soft_I2C_Read(1);
 buffer[4] = Soft_I2C_Read(1);
 Soft_I2C_Stop();

Delay_ms(50);
 freq_available=(buffer[0]&0x3F)<<4; // valor numerico do nivel do sinal
 display_sinal(); // mostr anivel do sinal
 //flag de stereo - acende o led
 st_flag = buffer[2]>>7;
 if (st_flag ==0) {Lcd_Chr(1,15,' ');Lcd_Chr(1,16,' ');}
 else {Lcd_Chr(1,15,'F');Lcd_Chr(1,16,'m');}

}

void display_freq(float freqrep)
 {
 long int i;
 if (freqrep < FREQ_LOW) { freqrep = FREQ_HIGH; freq_now=FREQ_HIGH; } if (freqrep > FREQ_HIGH)
 {
 freqrep = FREQ_LOW;
 freq_now= FREQ_LOW;
 }

i= (freqrep*1000000)-30000; //soma 50k para acertar arredondamento

longToStr(i, txt);

Lcd_Chr(1,5,txt[2]);
 Lcd_Chr(1,6,txt[3]);
 Lcd_Chr(1,7,txt[4]);
 Lcd_Chr(1,8,'.');
 Lcd_Chr(1,9,txt[5]);
 Lcd_Out(1,10, "Mhz");
 }
 void display_sinal() //imprime nivel do sinal graficamente
 {
 nivel_clear;
 if (niv=3 && niv4 && niv8 && niv12 ) {nivel_clear;Lcd_Chr(1,1,'o');Lcd_Chr(1,2,'o');Lcd_Chr(1,3,'o');Lcd_Chr(1,4,'o');}

}
 void grava_Freq(int freq_addr) // Grava frequencia - enderecos da 877a 0x00 - 0xFF (256bytes)
 {
 EEPROM_Write(freq_addr, frequencyH);
 EEPROM_Write(freq_addr+1, frequencyL);
 }
 void recup_freq(int freq_addr, int sint_yn) //recupera frequencia DA MEMORIA e sintoniza a mesma
 // 1 = le bytes da eprom e sintoniza , 0 = apenas le os bytes da eprom
 {

frequencyH= EEPROM_Read(freq_addr);
 frequencyL= EEPROM_Read(freq_addr+1);

if (sint_yn== 1)
 {
 Soft_I2C_Start();
 Soft_I2C_Write(0xC0); //endereço do chip FM - write mode
 Soft_I2C_Write(frequencyH); //byte1
 Soft_I2C_Write(frequencyL); //byte2
 Soft_I2C_Write(0xB0); //byte3
 Soft_I2C_Write(0x10); //byte4
 Soft_I2C_Write(0x00); //byte5
 Soft_I2C_Stop();
 }

}
 void display_mem(short int mem_fm)
 {
 Lcd_Cmd(_LCD_CLEAR);
 Lcd_Chr(2,1,'M');
 Lcd_Chr(2,2,'e');
 Lcd_Chr(2,3,'m');
 inttostr(mem_fm,txt);
 Lcd_Out(2, 8, txt);

recup_freq(0x00+(mem_fm+1), 0); //memoria 1

if (frequencyL == 0xFF) //memoria sem estacao gravada
 {
 Lcd_Chr(1,5,'-');
 Lcd_Chr(1,6,'-');
 Lcd_Chr(1,7,'-');
 Lcd_Chr(1,8,'.');
 Lcd_Chr(1,9,'-');
 Lcd_Out(1,10, "Mhz");
 }
 else //memoria COM estacao gravada
 {

freq_available=((frequencyH< 0xD0));
 I2C1_Wr(address);
 I2C1_Repeated_Start();
 I2C1_Wr(0xd1);
 I2C1_Rd(0);
 I2C1_stop();
 }
 }
 void write_ds1307(unsigned short address,unsigned short w_data)
 {
 I2C1_Start(); // issue I2C start signal
 I2C1_Wr(0xD0); // send byte via I2C (device address + W)
 I2C1_Wr(address); // send byte (address of DS1307 location)
 I2C1_Wr(w_data); // send data (data to be written)
 I2C1_Stop(); // issue I2C stop signal
 }
 //manipulacao de tipos para o relogio
 unsigned char BCD2UpperCh(unsigned char bcd)
 {
 return ((bcd >> 4) + '0');
 }

//manipulacao de tipos para o relogio
 unsigned char BCD2LowerCh(unsigned char bcd)
 {
 return ((bcd & 0x0F) + '0');
 }
void alarme()
{

//Lcd_Cmd(_LCD_CLEAR);
 //Delay_ms(5000);
 a_hour= EEPROM_Read(0xAA); // posicoes de memoria para hora e minuto
 a_min= EEPROM_Read(0XAF);
 xalarme= EEPROM_Read(0XB2);

if (a_hour == 0xFF) a_hour = 0; //se posicao de memoria vazia - zera variaveis
 if (a_min == 0xFF) a_min = 0;
 if (xalarme == 0xFF) xalarme = 0;

Lcd_Cmd(_LCD_CLEAR);

cnt2 = 0;

while(cnt2 < 100) { cnt2++; inttostr(a_hour,ddate2); Lcd_Chr(1, 8, ddate2[4]); Lcd_Chr(1, 9, ddate2[5]); Lcd_Chr(1, 10, ':'); inttostr(a_min,ddate2); Lcd_Chr(1, 11, ddate2[4]); Lcd_Chr(1, 12, ddate2[5]); inttostr(xalarme,ddate2); Lcd_Chr(1, 1, 'A');Lcd_Chr(1, 2, 'l');Lcd_Chr(1, 3, ':'); Lcd_Chr(1, 5, ddate2[4]); Lcd_Chr(1, 6, ddate2[5]); if(BUTTON_DOWN) { cnt2=0; a_hour++; Delay_ms(150); if (a_hour > 23) a_hour = 0;
 inttostr(a_hour,ddate2);
 Lcd_Chr(1, 8, ddate2[4]);
 Lcd_Chr(1, 9, ddate2[5]);
 }

if(BUTTON_UP)
 {
 cnt2=0;
 a_min++;
 Delay_ms(150);
 if (a_min > 60) a_min = 0;
 inttostr(a_min,ddate2);
 Lcd_Chr(1, 10, ddate2[4]);
 Lcd_Chr(1, 11, ddate2[5]);
 }
 if(BUTTON_SET2)
 {
 cnt2=0;
 xalarme++;
 Delay_ms(150);
 if (xalarme > 3) xalarme = 0;
 inttostr(xalarme,ddate2);
 Lcd_Chr(1, 1, 'A');Lcd_Chr(1, 2, 'l');Lcd_Chr(1, 3, ':');
 Lcd_Chr(1, 5, ddate2[4]);
 Lcd_Chr(1, 6, ddate2[5]);

}
 in_alarm =0; // rehabilita alarme
 EEPROM_Write(0xAA, a_hour);
 EEPROM_Write(0xAF, a_min);
 EEPROM_Write(0xB2, xalarme);
 }
 }

//acerta relogio - grava novo valor
void acerta_relogio (unsigned short xtipo)
{

unsigned short xlimite;
unsigned short xchart;

Lcd_Cmd(_LCD_CLEAR);

xchart = 0;

if (xtipo==2) {Lcd_Out(1, 1, "Hora:");xlimite=23;}
if (xtipo==1) {Lcd_Out(1, 1, "Min:");xlimite=59;}
if (xtipo==4) {Lcd_Out(1, 1, "Dia:");xlimite=31;}
if (xtipo==5) {Lcd_Out(1, 1, "Mes:");xlimite=12;}
if (xtipo==6) {Lcd_Out(1, 1, "Ano:");xlimite=20;}
if (xtipo==3) {Lcd_Out(1, 1, "Semana:");xlimite=7;}

for(;;)
{

inttostr(xchart,ddate2);

Lcd_Chr(1, 10, ddate2[4]);
Lcd_Chr(1, 11, ddate2[5]);
//Lcd_Out(2, 1, ddate2);

if(BUTTON_UP) // advance hour
{
VDelay_ms(150) ;
xchart++;
if (xchart>xlimite) xchart=0;
}

if(BUTTON_SET2) // valid
{
VDelay_ms(550) ;
write_ds1307(xtipo,dec2bcd(xchart)); //write hour
break ; // exit loop
}
}
}
void holdx()
{

while(BUTTON_SET1) //hold botão de SET1 - ajuste de hora
 {
 hold_bt++;

if (hold_bt == 440) Lcd_Out(2, 1, "Alarme ");

if (hold_bt == 800) Lcd_Out(2, 1, "Hora ");

VDelay_ms(5);
 }
 }

 

  • Membro VIP
Postado

melhor pedir o .hex pra ele ou o do gerado pelo amigo @mister nintendo 

Dica (pro forum). Veja isso...

Spoiler



           // LCD module connections
 sbit LCD_RS at RB4_bit;
 sbit LCD_EN at RB5_bit;
 sbit LCD_D4 at RB0_bit;
 sbit LCD_D5 at RB1_bit;
 sbit LCD_D6 at RB2_bit;
 sbit LCD_D7 at RB3_bit;
 sbit LCD_RS_Direction at TRISB4_bit;
 sbit LCD_EN_Direction at TRISB5_bit;
 sbit LCD_D4_Direction at TRISB0_bit;
 sbit LCD_D5_Direction at TRISB1_bit;
 sbit LCD_D6_Direction at TRISB2_bit;
 sbit LCD_D7_Direction at TRISB3_bit;
 // End LCD module connections
 //DS1307 RTC Interfacing with PIC16F877A
 sbit I2C1_Scl at RC3_bit;
 sbit I2C1_Sda at RC4_bit;
 sbit I2C1_Scl_Direction at TRISC3_bit;
 sbit I2C1_Sda_Direction at TRISC4_bit;
 //I2C via software with PIC16F877A - via hardware deu erro para ler o Chip FM
 sbit Soft_I2C_Scl at RD2_bit;
 sbit Soft_I2C_Sda at RD3_bit;
 sbit Soft_I2C_Scl_Direction at TRISD2_bit;
 sbit Soft_I2C_Sda_Direction at TRISD3_bit;
 // End Software I2C connections

// Botoes de sintonia
 #define BUTTON_DOWN (PORTD.F0 == 0) //search down
 #define BUTTON_UP (PORTD.F1 == 0) //search up
 #define BUTTON_SET2 (PORTD.F4 == 0)
 #define BUTTON_SET1 (PORTD.F5 == 0)
 #define BUTTON_SNOOZE (PORTD.F7 == 0)
 #define mem_fm_qtd 25 //quantidade de posicoes de memoria para estacoes
 #define tempo_exposicao 50 // tempo exposicao da temperatura
 #define tempo_exposicao2 100 // tempo exposicao data

//Range de Frequencias Europa
 #define FREQ_HIGH 108
 #define FREQ_LOW 87.5

//nivel do sinal simbolo
 #define nivel_clear Lcd_Chr(1,1,' '); Lcd_Chr(1,2,' '); Lcd_Chr(1,3,' '); Lcd_Chr(1,4,' ')
 #define rele_on PORTB.F7 = 1
 #define rele_off PORTB.F7 = 0
 //define functions
 void Display_Temperature(unsigned int temp2write, unsigned int linha);
 void Sintoniza_freq(float frequex); //sintoniza frequ fixa
 void Le_freq(); //ler o chip FM carregando as variaveis
 void display_freq(float freqrep); //mostra frequencia
 void display_sinal(); // mostr ao nivel do sinal
 void recup_freq(int freq_addr, int sint_yn); //recupera freq da eprom e 0=nao sintoniza / 1=sintoniza
 void grava_Freq(int freq_addr); //grava 2 bytes da pll no eprom
 void display_mem(short int mem_fm); // mostra a frequencia de uma determ posic memoria =1,2,3,4,5
 void acerta_relogio (unsigned short xtipo);

void write_ds1307(unsigned short address,unsigned short w_data); //escreve hora
 unsigned short read_ds1307(unsigned short address); //le hora
 unsigned char BCD2UpperCh(unsigned char bcd); //usada no relogio
 unsigned char BCD2LowerCh(unsigned char bcd); //usada no relogio
 void holdx(); // testa tempo de pressao na tecla - vai para ajste alarme ou ajuste hora
 void alarme(); //ajusta alarme

//char bcd_to_bin(char bcd);
 //void checa_alarm();
 //end define functions

//variaveis do termometro
 unsigned char *tempC = "000.0";
 unsigned int tempinC;
 unsigned long temp_value;
 unsigned char txt[15];

//Variaveis do FM
 char frequencyH=0;
 char frequencyL=0;
 int frequencyB;
 long int frequency=0;
 char buffer[5];
 float freq_available=0;
 float freq_available2=0;
 short int showtime; //showtime variavel para shift no display : data x temp
 unsigned int cnt;
 short int flag_exp; //flag para shift display data x temper
 short int niv; //nivel do sinal
  short int niv2;
   short int niv4;
    short int niv12;
     short int niv8;
      short int address;
 short int st_flag; //informacao de stereo
 short int freq_eprom1; //byte1 da freq recuperado da eprom
 short int freq_eprom2; //byte2 da freq recuperado da eprom
 float freq_now;
 int memoria_fm;
 int hold_bt; //contador para apertar e segurar o botao - set hora
 int temp_min; //variaveis temps alarme
 int temp_hour; //variaveis temps alarme

//variaveis de acerto de relogio
 unsigned short xchar; //dois digitos do valor (hora, mes, dia..) para a funcao de acerto do rlogio

//variaveis do relogio
 //unsigned int sec;
 unsigned short int minute;
 unsigned short int hour;
 unsigned short int day;
 unsigned short int date;
 unsigned short int month;
 unsigned short int year;
 unsigned char time[9];
 unsigned char ddate[9];
 unsigned char ddate2[9]; //data temporaria para ajuste de hora

//variaveis do alarme
 unsigned short a_hour;
 unsigned short a_min;
 unsigned short cnt2;
 unsigned short xalarme; //alarme 0 = alarme off, 1, 2, 3 = qtd do snooze
 bit in_alarm; // se 1 o alarme esta acionado se 0 o alarme nao esta acionado

void main()
 {

TRISB = 0; // PORTB saida do display lcd

//termometro porta analogicas
 ADCON1 = 0b10000000; // 1- opcao osc, 0- left justif, 00-void, 0000 - vref+=vdd vref-=vss todas as portas an = A analogicasA
 TRISA = 0b00110011; //ra0/an0 e ra1/an1 inputs lm35
 TRISD =0xFF; // porta de sera input dos botoes
 CMCON = 0x07; // Disable Comparators

Lcd_Init(); // Initialize LCD
 Lcd_Cmd(_LCD_CLEAR); // Clear LCD display
 Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off

I2C1_Init(32768); //Inicia o DS1307 I2C e define a frequencia do xtal - xtal do tipo de relogio

Soft_I2C_Init();
 //Delay_ms(50);

//recupera e sintoniza ultima frequencia sintonizada
 recup_freq(0x00, 1);
 //Delay_ms(500);
 Le_freq(); //le freque inicial
 freq_now=freq_available2;
 display_freq(freq_now); //display frequencia

//teste do relogio
 //================================

write_ds1307(0,0x00);

//================= loop principal - inicio =================//
 //================= loop principal - inicio =================//
 //================= loop principal - inicio =================//

memoria_fm = 1;
 showtime = 1; //controla tempo de exibicao da hora x temperatura
 flag_exp = 0;
 in_alarm = 0; //alarme nao esta acionado

//le informacoes do alarme - hora, min, e snooze
 //a_hour= EEPROM_Read(0xAA); // posicoes de memoria para hora e minuto
 //a_min= EEPROM_Read(0XAF);
 while(1)
 {
 temp_value = ADC_Read(0); // le o sensor numero 1
 temp_value = temp_value*5000;//1077; //1168;
 tempinC = temp_value/1000;
 tempinC = tempinC*10;

if(showtime >= tempo_exposicao) if(showtime < tempo_exposicao2) //controle tempo de exposicao da hora x temperatura { VDelay_ms(15); if(flag_exp == 1) { Lcd_Out(2,1," "); Lcd_Chr(2,3,223); //imprime o grau celcius e o C Lcd_Chr(2,4,'C'); Display_Temperature(tempinC,2); flag_exp =0; //tratamento impressao do dia da semana ddate2[6] = BCD2UpperCh(day); ddate2[7] = BCD2LowerCh(day); ddate2[8] = '\0'; if(ddate2[7] == '1') {Lcd_Chr(2, 6, 'D');Lcd_Chr(2, 7, 'o');Lcd_Chr(2, 8, 'm');} if(ddate2[7] == '2') {Lcd_Chr(2, 6, 'S');Lcd_Chr(2, 7, 'e');Lcd_Chr(2, 8, 'g');} if(ddate2[7] == '3') {Lcd_Chr(2, 6, 'T');Lcd_Chr(2, 7, 'e');Lcd_Chr(2, 8, 'r');} if(ddate2[7] == '4') {Lcd_Chr(2, 6, 'Q');Lcd_Chr(2, 7, 'u');Lcd_Chr(2, 8, 'a');} if(ddate2[7] == '5') {Lcd_Chr(2, 6, 'Q');Lcd_Chr(2, 7, 'u');Lcd_Chr(2, 8, 'i');} if(ddate2[7] == '6') {Lcd_Chr(2, 6, 'S');Lcd_Chr(2, 7, 'e');Lcd_Chr(2, 8, 'x');} if(ddate2[7] == '7') {Lcd_Chr(2, 6, 'S');Lcd_Chr(2, 7, 'a');Lcd_Chr(2, 8, 'b');} } showtime++; } else { showtime= 1; } Delay_ms(50); //Acerto de Estacoes de FM //le hora e imprime //======================= //sec=read_ds1307(0); // read second minute=read_ds1307(1); // read minute hour=read_ds1307(2); // read hour day=read_ds1307(3); // read day date=read_ds1307(4); // read date month=read_ds1307(5); // read month year=read_ds1307(6); // read year time[0] = BCD2UpperCh(hour); time[1] = BCD2LowerCh(hour); time[2] = ':'; time[3] = BCD2UpperCh(minute); time[4] = BCD2LowerCh(minute); time[5] = '\0'; ddate[0] = BCD2UpperCh(date); ddate[1] = BCD2LowerCh(date); ddate[2] ='.'; ddate[3] = BCD2UpperCh(month); ddate[4] = BCD2LowerCh(month); ddate[5] ='.'; ddate[6] = BCD2UpperCh(year); ddate[7] = BCD2LowerCh(year); ddate[8] = '\0'; // checa alarme liga rele a_min= EEPROM_Read(0XAF); a_hour= EEPROM_Read(0xAA); xalarme= EEPROM_Read(0XB2); temp_min = minute; //conversoes de hora minuto temp_min = ((temp_min>>4)&0x0f)*10 + (temp_min&0x0f); //bcd to dec
 temp_hour = hour;
 temp_hour = ((temp_hour>>4)&0x0f)*10 + (temp_hour&0x0f); //bcd to dec

 if (xalarme >0) //alarme on - snooze maior que zero
 {
 if (temp_hour == a_hour && temp_min== a_min && !in_alarm) //dispara alarme
 {
 in_alarm = 1;
 rele_on;
 write_ds1307(7,0x10);
 xalarme--; //snooze menos 1
 if (xalarme== 59) {a_min=0; a_hour++; if (a_hour > 23) a_hour = 0;} //ajuste estouros

 EEPROM_Write(0xAA, a_hour); //regrava alarme
 EEPROM_Write(0xAF, a_min);
 EEPROM_Write(0xB2, xalarme);
 in_alarm =0; // rehabilita alarme
 }
 }


 if (xalarme >0) Lcd_Chr(2, 11, 'a'); else Lcd_Chr(2, 11, ' ');//indicador de alarme ligado

if(BUTTON_SNOOZE){ write_ds1307(7,0x00); PORTB.F7 = ~PORTB.F7; Vdelay_ms(500);} // botao snooze
 Lcd_Out(2,12,time);

 if(showtime < tempo_exposicao) //controle tempo de exposicao da data x temperatura { if(flag_exp == 0) { Lcd_Out(2,1," "); Lcd_Out(2,1,ddate); flag_exp =1; } showtime++; } if(BUTTON_DOWN) //search down { while(BUTTON_DOWN) // incrementa sem sintonizar { freq_now = freq_now - 0.1; display_freq(freq_now); VDelay_ms(50); } Sintoniza_freq(freq_now); VDelay_ms(100) ; Le_Freq(); } if(BUTTON_UP) //search up { while(BUTTON_UP) // incrementa decrem sem sintonizar { freq_now = freq_now + 0.1; display_freq(freq_now); VDelay_ms(50); } Sintoniza_freq(freq_now); VDelay_ms(100) ; Le_Freq(); } if(BUTTON_SET1) //menu de memorizacao de estacoes { hold_bt = 0; // pressionar e segurar o botao de SET- ajuste de hora holdx(); //ajuste de hora e alarme if (hold_bt > 800) // ajuste de hora
 {
 write_ds1307(0,0x80); //write sec stop oscilator
 acerta_relogio(2); //hour
 acerta_relogio(1); //minute
 acerta_relogio(4); //date
 acerta_relogio(5); //month
 acerta_relogio(6); //year
 acerta_relogio(3); //day
 write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator
 }

if (hold_bt > 440)
cnt=0;
 memoria_fm = 1;
 display_mem(memoria_fm);

while(cnt<550)
 {
 VDelay_ms(5); // COMENTADO PARA LIBERAR MEMORIA
 // if(BUTTON_DOWN) //decresce memoria
 // {
 // VDelay_ms(15) ;
 // cnt=0;
 //while(BUTTON_DOWN) // debounce button
 //{
 // memoria_fm = memoria_fm -2;
 // if (memoria_fm mem_fm_qtd) memoria_fm=1;
 display_mem(memoria_fm);
 VDelay_ms(100) ;

//}

if(BUTTON_SET2) //memoriza estação
 {
 VDelay_ms(15) ;
 //while(BUTTON_SET2)
 //{
 recup_freq(0x00,0); //recupera a frequencia atual atualiza variaveis
 Delay_ms(500);
 Le_freq(); // le frequencia do FM e atualiza variaveis
 grava_Freq(0x00+(memoria_fm+1));
 cnt=1000;
 //}
 }
 cnt++;
 }

Lcd_Cmd(_LCD_CLEAR);
 /*
 if (cnt == 1001) // saiu pois memorizou a estacao = mantem estacao e grava na memoria a mesma
 {
 Lcd_Cmd(_LCD_CLEAR);
 recup_freq(0x00,1); //recupera a frequencia atual atualiza variaveis
 freq_now=freq_available2;
 display_freq(freq_now); //display frequencia
 Le_freq(); // le frequencia do FM e atualiza variaveis
 }
 if (cnt == 550) //saiu por time out = sintoniza a estacao corrente da memoria
 {
 Lcd_Cmd(_LCD_CLEAR);
 display_freq(freq_now); //display frequencia
 Le_freq(); // le frequencia do FM e atualiza variaveis
 }
 */

 //end do if de set1 - memoriza estacoes
 if(BUTTON_SET2) //browse estacoes memorizadas
 {

cnt=0;
 display_mem(memoria_fm);

while(cnt<150)
 {

 VDelay_ms(15) ;
 if(BUTTON_DOWN) //acresce memoria
 {
 VDelay_ms(15) ;
 cnt=0;
 //while(BUTTON_DOWN) // debounce button
 // {
 memoria_fm = memoria_fm -2;
 if (memoria_fm && mem_fm_qtd) memoria_fm=1;
 display_mem(memoria_fm);
 VDelay_ms(100) ;
 recup_freq(0x00+(memoria_fm+1),1); //recupera a frequencia atual atualiza variaveis
 freq_now=freq_available2;
 display_freq(freq_now); //display frequencia
 Le_freq(); // le frequencia do FM e atualiza variaveis
 Sintoniza_freq(freq_now);

//}
 }

cnt++;
 }
  display_sinal(); // mostr ao nivel do sinal
 } //end do if de set2 - browse estacoes

} //end while
 //================= loop principal - final =================//
 //================= loop principal - final =================//
 //================= loop principal - final =================//
 } // end main

void Display_Temperature(unsigned int temp2write, unsigned int linha) {
 if (temp2write/10000)// convert Temp to characters// 48 is the decimal character code value for displaying 0 on LCD
 tempC[0] = temp2write/10000 + 48;
 else tempC[0] = ' ';
 tempC[1] = (temp2write/1000)%10 + 48; // Extract tens digit
 tempC[2] = (temp2write/100)%10 + 48; // Extract ones digit
 tempC[4] = (temp2write/10)%10 + 48; // Extract tens digit
 Lcd_Chr(linha,1,tempC[1]); // print temperature on LCD
 Lcd_Chr(linha,2,tempC[2]);
 }

void Sintoniza_freq(float frequex) { // Set frequencia fixa no FM

if (frequex < FREQ_LOW) { frequex = FREQ_HIGH; freq_now=FREQ_HIGH; } if (frequex > FREQ_HIGH)
 {
 frequex = FREQ_LOW;
 freq_now=FREQ_LOW;
 }

frequency=frequex*1000000; //starting frequency 89.7 novafm
 frequencyB=(4*(frequency+225000))/32768; //valor decimal da pll
 frequencyH=frequencyB>>8; // desloca 8 bytes e pega entao o primeiro byte = 00110010 - decimal 50
 frequencyL=frequencyB&0XFF; // pega o 2nd byte faz(AND) com 00000000 11111111 -> resultado 10000010 - dec 130
 Soft_I2C_Start();
 Soft_I2C_Write(0xC0); //endereço do chip FM - write mode
 Soft_I2C_Write(frequencyH); //byte1
 Soft_I2C_Write(frequencyL); //byte2
 Soft_I2C_Write(0xB0); //byte3
 Soft_I2C_Write(0x10); //byte4
 Soft_I2C_Write(0x00); //byte5
 Soft_I2C_Stop();

grava_Freq(0x00); //grava 1o e 2o bytes com a frequencia sintonizada
 //0x00 e 0x01 sao os enderecos para gravacao da ultima estacao

}

void Le_Freq() //atualiza variaveis de frequ e variaveis de sinal, fm
 {
 Soft_I2C_Start();
 Soft_I2C_Write(0xC1);
 buffer[0] = Soft_I2C_Read(1);
 buffer[1] = Soft_I2C_Read(1);
 buffer[2] = Soft_I2C_Read(1);
 buffer[3] = Soft_I2C_Read(1);
 buffer[4] = Soft_I2C_Read(1);
 Soft_I2C_Stop();

Delay_ms(50);
 freq_available=(buffer[0]&0x3F)<<4; // valor numerico do nivel do sinal
 display_sinal(); // mostr anivel do sinal
 //flag de stereo - acende o led
 st_flag = buffer[2]>>7;
 if (st_flag ==0) {Lcd_Chr(1,15,' ');Lcd_Chr(1,16,' ');}
 else {Lcd_Chr(1,15,'F');Lcd_Chr(1,16,'m');}

}

void display_freq(float freqrep)
 {
 long int i;
 if (freqrep < FREQ_LOW) { freqrep = FREQ_HIGH; freq_now=FREQ_HIGH; } if (freqrep > FREQ_HIGH)
 {
 freqrep = FREQ_LOW;
 freq_now= FREQ_LOW;
 }

i= (freqrep*1000000)-30000; //soma 50k para acertar arredondamento

longToStr(i, txt);

Lcd_Chr(1,5,txt[2]);
 Lcd_Chr(1,6,txt[3]);
 Lcd_Chr(1,7,txt[4]);
 Lcd_Chr(1,8,'.');
 Lcd_Chr(1,9,txt[5]);
 Lcd_Out(1,10, "Mhz");
 }
 void display_sinal() //imprime nivel do sinal graficamente
 {
 nivel_clear;
 if (niv=3 && niv4 && niv8 && niv12 ) {nivel_clear;Lcd_Chr(1,1,'o');Lcd_Chr(1,2,'o');Lcd_Chr(1,3,'o');Lcd_Chr(1,4,'o');}

}
 void grava_Freq(int freq_addr) // Grava frequencia - enderecos da 877a 0x00 - 0xFF (256bytes)
 {
 EEPROM_Write(freq_addr, frequencyH);
 EEPROM_Write(freq_addr+1, frequencyL);
 }
 void recup_freq(int freq_addr, int sint_yn) //recupera frequencia DA MEMORIA e sintoniza a mesma
 // 1 = le bytes da eprom e sintoniza , 0 = apenas le os bytes da eprom
 {

frequencyH= EEPROM_Read(freq_addr);
 frequencyL= EEPROM_Read(freq_addr+1);

if (sint_yn== 1)
 {
 Soft_I2C_Start();
 Soft_I2C_Write(0xC0); //endereço do chip FM - write mode
 Soft_I2C_Write(frequencyH); //byte1
 Soft_I2C_Write(frequencyL); //byte2
 Soft_I2C_Write(0xB0); //byte3
 Soft_I2C_Write(0x10); //byte4
 Soft_I2C_Write(0x00); //byte5
 Soft_I2C_Stop();
 }

}
 void display_mem(short int mem_fm)
 {
 Lcd_Cmd(_LCD_CLEAR);
 Lcd_Chr(2,1,'M');
 Lcd_Chr(2,2,'e');
 Lcd_Chr(2,3,'m');
 inttostr(mem_fm,txt);
 Lcd_Out(2, 8, txt);

recup_freq(0x00+(mem_fm+1), 0); //memoria 1

if (frequencyL == 0xFF) //memoria sem estacao gravada
 {
 Lcd_Chr(1,5,'-');
 Lcd_Chr(1,6,'-');
 Lcd_Chr(1,7,'-');
 Lcd_Chr(1,8,'.');
 Lcd_Chr(1,9,'-');
 Lcd_Out(1,10, "Mhz");
 }
 else //memoria COM estacao gravada
 {

freq_available=((frequencyH< 0xD0));
 I2C1_Wr(address);
 I2C1_Repeated_Start();
 I2C1_Wr(0xd1);
 I2C1_Rd(0);
 I2C1_stop();
 }
 }
 void write_ds1307(unsigned short address,unsigned short w_data)
 {
 I2C1_Start(); // issue I2C start signal
 I2C1_Wr(0xD0); // send byte via I2C (device address + W)
 I2C1_Wr(address); // send byte (address of DS1307 location)
 I2C1_Wr(w_data); // send data (data to be written)
 I2C1_Stop(); // issue I2C stop signal
 }
 //manipulacao de tipos para o relogio
 unsigned char BCD2UpperCh(unsigned char bcd)
 {
 return ((bcd >> 4) + '0');
 }

//manipulacao de tipos para o relogio
 unsigned char BCD2LowerCh(unsigned char bcd)
 {
 return ((bcd & 0x0F) + '0');
 }
void alarme()
{

//Lcd_Cmd(_LCD_CLEAR);
 //Delay_ms(5000);
 a_hour= EEPROM_Read(0xAA); // posicoes de memoria para hora e minuto
 a_min= EEPROM_Read(0XAF);
 xalarme= EEPROM_Read(0XB2);

if (a_hour == 0xFF) a_hour = 0; //se posicao de memoria vazia - zera variaveis
 if (a_min == 0xFF) a_min = 0;
 if (xalarme == 0xFF) xalarme = 0;

Lcd_Cmd(_LCD_CLEAR);

cnt2 = 0;

while(cnt2 < 100) { cnt2++; inttostr(a_hour,ddate2); Lcd_Chr(1, 8, ddate2[4]); Lcd_Chr(1, 9, ddate2[5]); Lcd_Chr(1, 10, ':'); inttostr(a_min,ddate2); Lcd_Chr(1, 11, ddate2[4]); Lcd_Chr(1, 12, ddate2[5]); inttostr(xalarme,ddate2); Lcd_Chr(1, 1, 'A');Lcd_Chr(1, 2, 'l');Lcd_Chr(1, 3, ':'); Lcd_Chr(1, 5, ddate2[4]); Lcd_Chr(1, 6, ddate2[5]); if(BUTTON_DOWN) { cnt2=0; a_hour++; Delay_ms(150); if (a_hour > 23) a_hour = 0;
 inttostr(a_hour,ddate2);
 Lcd_Chr(1, 8, ddate2[4]);
 Lcd_Chr(1, 9, ddate2[5]);
 }

if(BUTTON_UP)
 {
 cnt2=0;
 a_min++;
 Delay_ms(150);
 if (a_min > 60) a_min = 0;
 inttostr(a_min,ddate2);
 Lcd_Chr(1, 10, ddate2[4]);
 Lcd_Chr(1, 11, ddate2[5]);
 }
 if(BUTTON_SET2)
 {
 cnt2=0;
 xalarme++;
 Delay_ms(150);
 if (xalarme > 3) xalarme = 0;
 inttostr(xalarme,ddate2);
 Lcd_Chr(1, 1, 'A');Lcd_Chr(1, 2, 'l');Lcd_Chr(1, 3, ':');
 Lcd_Chr(1, 5, ddate2[4]);
 Lcd_Chr(1, 6, ddate2[5]);

}
 in_alarm =0; // rehabilita alarme
 EEPROM_Write(0xAA, a_hour);
 EEPROM_Write(0xAF, a_min);
 EEPROM_Write(0xB2, xalarme);
 }
 }

//acerta relogio - grava novo valor
void acerta_relogio (unsigned short xtipo)
{

unsigned short xlimite;
unsigned short xchart;

Lcd_Cmd(_LCD_CLEAR);

xchart = 0;

if (xtipo==2) {Lcd_Out(1, 1, "Hora:");xlimite=23;}
if (xtipo==1) {Lcd_Out(1, 1, "Min:");xlimite=59;}
if (xtipo==4) {Lcd_Out(1, 1, "Dia:");xlimite=31;}
if (xtipo==5) {Lcd_Out(1, 1, "Mes:");xlimite=12;}
if (xtipo==6) {Lcd_Out(1, 1, "Ano:");xlimite=20;}
if (xtipo==3) {Lcd_Out(1, 1, "Semana:");xlimite=7;}

for(;;)
{

inttostr(xchart,ddate2);

Lcd_Chr(1, 10, ddate2[4]);
Lcd_Chr(1, 11, ddate2[5]);
//Lcd_Out(2, 1, ddate2);

if(BUTTON_UP) // advance hour
{
VDelay_ms(150) ;
xchart++;
if (xchart>xlimite) xchart=0;
}

if(BUTTON_SET2) // valid
{
VDelay_ms(550) ;
write_ds1307(xtipo,dec2bcd(xchart)); //write hour
break ; // exit loop
}
}
}
void holdx()
{

while(BUTTON_SET1) //hold botão de SET1 - ajuste de hora
 {
 hold_bt++;

if (hold_bt == 440) Lcd_Out(2, 1, "Alarme ");

if (hold_bt == 800) Lcd_Out(2, 1, "Hora ");

VDelay_ms(5);
 }
 }

 

 

Procedimento antipoluição. Selecione um longo texto e clique em spoiler...

Abç

 

 

 

  • Curtir 1
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...