Computer de Bord Auto

/*Proiect COMPUTER de BORD AUTO |

-afiseaza tensiunea de incarcare cu averizari la valori anormale; |

-afiseaza temperatura exterioara cu avertizare la inghet (temp. < 5 grade C); |

-afiseaza temperatura apei din motor; |

-afiseaza temperatura uleiului din motor; |

-comanda aprinderea unui LED rosu si pornirea unui COOLER atunci cand val_digitala. APA sau ULEI > 90 grade; |

-afieaza in procente si printr-un bargraph luminozitatea ambianta; |

-comanda aprinderea unui LED albastru(avertizare) si a luminilor (LED alb) la intenitate luminoasa scazuta; |

-afiseaza numarul de litri din rezervor cu avertizare pe LCD atunci cand nivelul este sub 7 litri; |

-afiseaza autonomia autovehicolului pe baza numarului de litri de combustibil ramasi |

–––––––––––SETARI DE LUCRU–––––––––––––––––––––

1.a. INPUT-URI ANALOGICE

RA0/AN0 -> input analogic citire tensiune de incarcare;

RA1/AN1 -> input analogic citire temperatura exterior;

RA2/AN2 -> input analogic citire temperatura apa motor ;

RA3/AN3 -> input analogic citire temperatura ulei motor;

RA5/AN4 -> input analogic citire intensitate luminoasa;

RE0/AN5 -> input analogic citire nivel functie_calcul_benzina;

RB3/AN9 -> input analogic citire valoare umiditate;

1.b. INPUT-URI DIGITALE

RB4 -> input digital citire tasta JOS;

RB5 -> input digital citire tasta SUS;

2. OUTPUT-URI

RE1 -> LED SMD de avertizare de culoare albastra;

RE2 -> LED SMD de avertizare de culoare rosie;

RB0 -> LED SMD de culare alba pentru simularea farurilor;

RD1 -> actionare COOLER BLDC;

RD4 -> LED rosu de avertizare la umiditate crescuta;

3. CONFIGURARE LCD ALFANUMERIC

PIN NUMBER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

DESCRIPTION Vss Vdd Vo Rs R/W En D0 D1 D2 D3 D4 D5 D6 D7 BA(+) BLK-()

PIC16F887 Vss Vdd Pot RD7 RD6 RD5 RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 Vdd(R) Vss

*/

int i =0, j=0; // contor general

int cntr = 0; // contor in intrerupere

int cntr_function = 0; // contor pentru function in intrerupere

int lum_function_chec =0; // checking for interruption function

int check_temp = 0; // check for temperature

int check = 0; // check la meniu in intrerupere

int set_t = 0, set_t1 = 0; // checks

int temp1 = 0, temp2 = 0; // variabile temporare

int meniu_1 = 0; // stare meniu numarul 1 (evaluare in meniu principal-setare in intrerupere)

int meniu_2 = 0; // stare meniu numarul 2 (evaluare in meniu principal-setare in intrerupere)

int meniu_3 = 0; // stare meniu numarul 3 (evaluare in meniu principal-setare in intrerupere)

int meniu_4 = 0; // stare meniu numarul 4 (evaluare in meniu principal-setare in intrerupere)

int meniu_5 = 0; // stare meniu numarul 5 (evaluare in meniu principal-setare in intrerupere)

int meniu_6 = 0; // stare meniu numarul 6 (evaluare in meniu principal-setare in intrerupere)

int val_digitala = 0; // buffer valoare bruta ADC

int valoare_in_mV = 0; // valoare ADC transformata in mV

int zeci_de_volti = 0; // calcul zeci de volti;

int unitati_de_volt = 0; // calcul unitati de volt

int zecimale_de_volt = 0; // calcul zecimi de volt

int sute_de_grade_C = 0; // calcul sute de grade celsius

int zeci_de_grade_C = 0; // calcul zeci de grade celsius

int unitati_de_grade_C = 0; // calcul unitati de grade celsius

int zecimale_de_grade_C = 0; // calcul zecimale de grade celsius

int sute_procente_lum = 0; // suta de procente la calcul intensitate luminoasa

int zeci_procente_lum = 0; // zeci de procente la calcul intensitate luminoasa

int unitati_procente_lum = 0;// unitati de procente la calcul intensitate luminoasa

int indice_LCD_bargraph = 0; // indice afisare pe LCD

int autonomie = 0; // calcul autonomie functie_calcul_benzina

int lumina_pwm = 0; // variabila pentru generare semnal PWM pentru lumini

int cntr_pwm = 0; // contor pentru generare semnal PWM pentru lumini

char text[20]; // vector la afisare de catactere pe LCD

//––––––––––-mesaje pe LCD––––––––––-//

const char *mesg1="AUTOMOTIVE";

const char *mesg2="PROJECT";

const char *mesg3="Loading signals";

const char *mesg4=" scanning done ";

const char *mesg5="-ALL SYSTEMS OK-";

const char *mesg6="exterior";

const char *mesg7="TMP-apa";

const char *mesg8="TMP-ulei";

const char *mesg9="!! TEMP MOTOR !!";

const char *mesg10="-LOW VISIBILITY-";

const char *mesg11="ROT/MIN";

const char *mesg12="LITRI";

const char *mesg13="autonom";

const char *mesg14=" !!!LOW FUEL!!! ";

const char *mesg01="supra";

const char *mesg02="optimum";

const char *mesg03="OK";

const char *mesg04="caution";

const char *mesg05="low";

const char *mesg06="under";

const char *mesg07="defect";

const char *mesg08=" *INGHET* ";

const char *mesg09="–umiditate–-";

const char *mesg010="-STERGATOARE ON-";

//–––––––––––––––––––––––––-//

//–––––––––-CUSTOM CHARS pe LCD––––––––––//

const char character0[] = {31,31,31,31,31,31,31,31}; //FULL custom character on LCD (bulding bargraph)

const char character1[] = {28,20,28,0,7,4,4,7}; //Celsius degree custom character

const char character5[] = {14,14,31,31,31,31,31,31}; //FULL BATERRIE 14.4 v

const char character6[] = {14,10,27,31,31,31,31,31}; //Vbat V > 12.5V

const char character7[] = {14,10,17,17,31,31,31,31}; //Vbat V < 12.5V

const char character8[] = {14,10,17,17,17,17,31,31}; //Vbat V = 10V

const char character9[] = {14,10,17,17,17,17,17,31}; //Vbat V < 10V

const char character12[] = {31,17,17,17,17,17,17,31};//LOADING function EMPTY CHAR

//–––––––––––––––––––––––––-//

//–––––––––-FUNCTION DECLARATIONS–––––––––//

void functie_tensiune_de_incarcare();

void functie_temperatura_exterior();

void functie_temperatura_apa();

void functie_temperatura_ulei();

void functie_umiditate_meniu_principal();

void functie_calcul_benzina ();

void functie_lumina_meniu_principal();

void functie_lumina_background();

void functie_loading();

void strConstCpy(char *dest, const char *source);

//–––––––––––––––––––––––––-//

//––––––ROM-RAM COPY FUNTION FOR ERROR FREE ON LCD––––––//

void strConstCpy(char *dest, const char *source) {

while(*source)

*dest++ = *source++ ;

*dest = 0 ;

}

//–––––––––––––––––––––––––-//

//––––––CUSTOM CHAR GENERATION FOR LCD––––––––––//

void CustomChar(const char *def, unsigned char n, char pos_row, char pos_char)

{

char i ;

LCD8_Cmd(64 + n * 8) ;

for(i = 0 ; i<=7 ; i++)

{

LCD8_Chr_Cp(def[i]) ;

}

LCD8_Cmd(LCD_RETURN_HOME) ;

LCD8_Chr(pos_row, pos_char, n) ;

}

//–––––––––––––––––––––––––-//

void main(){

ANSEL = 0b00111111; // Selection of analogic channels 1=ON / 0=OFF (AN0 to AN7)

ANSELH =0b00000010; // Selection of analogic channels 1=ON / 0=OFF (AN0 to AN7 to AN13)

TRISA = 0b00101111; // I/O functions set (directivity)

TRISB = 0b00111000; // I/O functions set (directivity)

TRISC = 0b00000000; // I/O functions set (directivity)

TRISD = 0b00000000; // I/O functions set (directivity)

TRISE = 0b00000001; // I/O functions set (directivity)

PORTA = 0; // Clear output values on pins

PORTB = 0; // Clear output values on pins

PORTC = 0; // Clear output values on pins

PORTD = 0; // Clear output values on pins

PORTE = 0; // Clear output values on pins

//–––––––––TIMER1 INTERRUPT–––––––––––-//

INTCON.GIE = 1; //enable all un-masked interrupts

INTCON.PEIE = 1; //Set PEIE

T1CON = 1; //enable Timer1

PIR1.TMR1IF = 0; //Clear TMR1IF -> interrupt flag

TMR1H = 0b11111110; //Start value storing 16bit -> HIGH register for T1

TMR1L = 0b00001011; //Start value storing 16bit -> LOW register for T1

PIE1.TMR1IE = 0; //Disable / Enable Timer1 interrupt

//–––––––––––––––––––––––––-//

//–––––––––TIMER2 INTERRUPT–––––––––––-//

//T2CON = 0b00000100; // Timer2 settings |bit 6-3= postscale| |bit2=T2 activate||bit 1-0 = prescaller| // for 0b00000100 = prescaler 1:1 and postscaler 1:1 = max freq = 280 us;

//TMR2 = 0; // Initialize Timer2 register

//PIE1.TMR2IE = 1; // Disable / enable interupt

//–––––––––––––––––––––––––-//

//––––––––LCD16x2 CONFIGURATION––––––––––-//

Lcd8_Config(&PORTD,&PORTC,7,5,6,0,1,2,3,4,5,6,7);

//–––––––––START SEQUENCE––––––––––––//

Lcd8_Cmd(Lcd_CLEAR) ;

strConstCpy(text,mesg1);

Lcd8_Out(1,3,text);

strConstCpy(text,mesg2);

Lcd8_Out(2,5,text);

Delay_ms(4000);

Lcd8_Cmd(Lcd_CLEAR) ;

Delay_ms(600); // Start sequence disabled on tests

functie_loading();

strConstCpy(text,mesg4);

Lcd8_Out(1,1,text);

Delay_ms(3000);

Lcd8_Cmd(Lcd_CLEAR) ;

strConstCpy(text,mesg5);

Lcd8_Out(1,1,text);

Delay_ms(1000);

Lcd8_Cmd(Lcd_CLEAR) ;

PIE1.TMR1IE = 1; // After start sequence -> activating T1

//–––––––––-MAIN WORK–––––––––––––//

for (;;){

if(meniu_1 == 1){ // meniu 1

functie_temperatura_exterior();

functie_lumina_background();

functie_tensiune_de_incarcare();

}

if(meniu_2 == 1){ // meniu 2

functie_temperatura_apa();

functie_temperatura_ulei();

functie_lumina_background();

}

if( meniu_3 == 1){ //meniu 3

functie_lumina_meniu_principal();

}

if( meniu_4 == 1 ){ //meniu 4

functie_calcul_benzina ();

functie_lumina_background();

}

if( meniu_5 == 1 ){ //meniu 5

functie_umiditate_meniu_principal();

functie_lumina_background();

}

}

}

//–––––––––––––––––––––––––-//

void functie_tensiune_de_incarcare(){

Lcd8_Chr(1,2, ' ');

Lcd8_Chr(1,14,' ');

val_digitala = Adc_Read(0);

valoare_in_mV=15*val_digitala + 5* val_digitala/10 + 9*val_digitala/130; // CONSISTENT = testat si masurat

if (valoare_in_mV >= 10000){ // cu multimetru

zeci_de_volti=valoare_in_mV/10000;

while(valoare_in_mV>=10000){

valoare_in_mV=valoare_in_mV-10000;

}

}

else

zeci_de_volti=0;

if (valoare_in_mV >= 1000){

unitati_de_volt=valoare_in_mV/1000;

while(valoare_in_mV>=1000){

valoare_in_mV=valoare_in_mV-1000;

}

}

else

unitati_de_volt=0;

if (valoare_in_mV >= 100){

zecimale_de_volt=valoare_in_mV/100;

while(valoare_in_mV>=100){

valoare_in_mV=valoare_in_mV-100;

}

}

else

zecimale_de_volt=0;

if (zeci_de_volti==0)

Lcd8_Chr(1, 10, ' ');

else

Lcd8_Chr(1, 10, 0b00110000+zeci_de_volti);

Lcd8_Chr(1, 11, 0b00110000+unitati_de_volt);

Lcd8_Chr(1, 12,'.');

Lcd8_Chr(1, 13, 0b00110000+zecimale_de_volt);

Lcd8_Chr(1, 16, 'V');

if ((zeci_de_volti==1) && (unitati_de_volt == 4) && (zecimale_de_volt > 4)){

CustomChar(character5,0,1,1);

strConstCpy(text,mesg01);

Lcd8_Out(1,3,text);

for(i=8; i<=9; i++){

Lcd8_Chr(1, i,' ');

}

}

if ((zeci_de_volti==1) && (unitati_de_volt == 4) && (zecimale_de_volt <= 4)){

CustomChar(character5,0,1,1);

strConstCpy(text,mesg02);

Lcd8_Out(1,3,text);

for(i=8; i<=9; i++){

Lcd8_Chr(1, i,' ');

}

}

if ((zeci_de_volti==1) && (unitati_de_volt == 3) && (zecimale_de_volt >= 7)){

CustomChar(character5,0,1,1);

strConstCpy(text,mesg03);

Lcd8_Out(1,3,text);

for(i=5; i<=9; i++){

Lcd8_Chr(1, i,' ');

}

}

if ((zeci_de_volti==1) && (unitati_de_volt == 2) && (zecimale_de_volt >= 5)){

CustomChar(character6,0,1,1);

strConstCpy(text,mesg04);

Lcd8_Out(1,3,text);

}

if ((zeci_de_volti==1) && (unitati_de_volt == 2) && (zecimale_de_volt < 5)){

CustomChar(character7,0,1,1);

strConstCpy(text,mesg05);

Lcd8_Out(1,3,text);

for(i=6; i<=9; i++){

Lcd8_Chr(1, i,' ');

}

}

if ((zeci_de_volti==1) && (unitati_de_volt == 0)){

CustomChar(character8,0,1,1);

strConstCpy(text,mesg06);

Lcd8_Out(1,3,text);

for(i=8; i<=9; i++){

Lcd8_Chr(1, i,' ');

}

}

if (zeci_de_volti == 0){

CustomChar(character9,0,1,1);

strConstCpy(text,mesg07);

Lcd8_Out(1,3,text);

for(i=9; i<=9; i++){

Lcd8_Chr(1, i,' ');

}

}

}

//–––––––––––––––––––––––––-//

void functie_lumina_background(){

val_digitala = Adc_Read(4)/10;

if (val_digitala <= 30){

lum_function_chec = 1; // check and uncheck for not interferring with interrupt LED state

PORTB.f0 = 1;

PORTE.f1 = 1;

}

else{

lum_function_chec = 0;

PORTB.f0 = 0;

PORTE.f1 = 0;

}

}

//–––––––––––––––––––––––––-//

void functie_temperatura_exterior(){

val_digitala = 0; //calcul temp. prin filtru de mediere

for (j=0; j<30; j++){ //calcul temp. prin filtru de mediere

val_digitala = Adc_Read(1)+val_digitala; //calcul temp. prin filtru de mediere

} //calcul temp. prin filtru de mediere

val_digitala = (val_digitala-3060)/30; //calcul temp. prin filtru de mediere

val_digitala= 4*val_digitala + 8*val_digitala/10+ 8*val_digitala/100;

if (val_digitala>=1000){

sute_de_grade_C=val_digitala/1000;

while (val_digitala>=1000){

val_digitala-=1000;

}

}

else{

sute_de_grade_C=0;

}

if (val_digitala>=100){

zeci_de_grade_C=val_digitala/100;

while (val_digitala>=100){

val_digitala-=100;

}

}

else

zeci_de_grade_C=0;

if (val_digitala>=10){

unitati_de_grade_C=val_digitala/10;

while (val_digitala>=10){

val_digitala-=10;

}

}

else

unitati_de_grade_C=0;

zecimale_de_grade_C=val_digitala;

if ( unitati_de_grade_C<=4 && !zeci_de_grade_C && !sute_de_grade_C){ // test inghet

strConstCpy(text,mesg08); //afisare mesaj "INGHET" (temp < 5C)

Lcd8_Out(2,1,text); //afisare mesaj "INGHET" (temp < 5C)

} //afisare mesaj "INGHET" (temp < 5C)

else {

Lcd8_Chr(2,14,' '); //afisare in mod normal temperatura (5-150C)

CustomChar(character1,1,2,16); //afisare in mod normal temperatura (5-150C)

strConstCpy(text,mesg6); //afisare in mod normal temperatura (5-150C)

Lcd8_Out(2,1,text); //afisare in mod normal temperatura (5-150C)

Lcd8_Chr(2, 15, ' ');

if (sute_de_grade_C==0)

Lcd8_Chr(2, 9, ' '); // caracterul liber

else

Lcd8_Chr(2, 9, 0b00110000+sute_de_grade_C); // caracterul 0 din CGROM+val.din coonversie

Lcd8_Chr(2, 10, 0b00110000+zeci_de_grade_C);

Lcd8_Chr(2,11, 0b00110000+unitati_de_grade_C);

Lcd8_Chr(2, 12,'.');

Lcd8_Chr(2, 13, 0b00110000+zecimale_de_grade_C);

}

}

//–––––––––––––––––––––––––-//

void functie_temperatura_apa(){

Lcd8_Chr(1,14,' ');

val_digitala = 0; //calcul temp. prin filtru de mediere

for (j=0; j<30; j++){ //calcul temp. prin filtru de mediere

val_digitala = Adc_Read(2)+val_digitala; //calcul temp. prin filtru de mediere

} //calcul temp. prin filtru de mediere

val_digitala = (val_digitala-3060)/30; //calcul temp. prin filtru de mediere

val_digitala= 4*val_digitala + 8*val_digitala/10+ 8*val_digitala/100;

if (val_digitala>=1000){

sute_de_grade_C=val_digitala/1000;

while (val_digitala>=1000){

val_digitala-=1000;

}

}

else{

sute_de_grade_C=0;

}

if (val_digitala>=100){

zeci_de_grade_C=val_digitala/100;

while (val_digitala>=100){

val_digitala-=100;

}

}

else

zeci_de_grade_C=0;

if (val_digitala>=10){

unitati_de_grade_C=val_digitala/10;

while (val_digitala>=10){

val_digitala-=10;

}

}

else

unitati_de_grade_C=0;

zecimale_de_grade_C=val_digitala;

if ((sute_de_grade_C == 0) && (zeci_de_grade_C < 9)){

set_t = 0; // for continouse LED allerting mode

check_temp = 0; // for not interffering in interrupt and for full LED light when pressing button

Lcd8_Chr(1,15, ' ');

Lcd8_Chr(1,8, ' ');

CustomChar(character1,1,1,16); // caracter grade celsius CGRAM 1

strConstCpy(text,mesg7);

Lcd8_Out(1,1,text);

if (set_t1){

PORTD.f1 = 1; // cooler depasire val_digitala

PORTE.f2 = 1; // LED la depasire val_digitala

}

if (!set_t1 && !PORTB.f4 && !PORTB.f5){

PORTD.f1 = 0; // cooler depasire val_digitala

PORTE.f2 = 0; // LED la depasire val_digitala

}

if (sute_de_grade_C==0 )

Lcd8_Chr(1, 9, ' '); // caracterul liber

else

Lcd8_Chr(1, 9, 0b00110000+sute_de_grade_C); // caracterul 0 din CGROM+val.din coonversie

Lcd8_Chr(1, 10, 0b00110000+zeci_de_grade_C);

Lcd8_Chr(1,11, 0b00110000+unitati_de_grade_C);

Lcd8_Chr(1, 12,'.');

Lcd8_Chr(1, 13, 0b00110000+zecimale_de_grade_C);

}

if ( (zeci_de_grade_C >= 9) || (sute_de_grade_C == 1)){

check_temp = 1;

set_t = 1;

PORTD.f1 = 1; // cooler depasire val_digitala

PORTE.f2 = 1; // LED la depasire val_digitala

for (i=1; i<=16; i++) // toggle mesaj 'val_digitala motor'

Lcd8_Chr(1,i,' ');

Delay_ms(170);

strConstCpy(text,mesg9);

Lcd8_Out(1,1,text);

Delay_ms(170);

}

}

//–––––––––––––––––––––––––-//

void functie_temperatura_ulei(){

Lcd8_Chr(2,14,' ');

val_digitala = 0; //calcul temp. prin filtru de mediere

for (j=0; j<30; j++){ //calcul temp. prin filtru de mediere

val_digitala = Adc_Read(3)+val_digitala; //calcul temp. prin filtru de mediere

} //calcul temp. prin filtru de mediere

val_digitala = (val_digitala-3060)/30; //calcul temp. prin filtru de mediere

val_digitala= 4*val_digitala + 8*val_digitala/10+ 8*val_digitala/100;

if (val_digitala>=1000){

sute_de_grade_C=val_digitala/1000;

while (val_digitala>=1000){

val_digitala-=1000;

}

}

else{

sute_de_grade_C=0;

}

if (val_digitala>=100){

zeci_de_grade_C=val_digitala/100;

while (val_digitala>=100){

val_digitala-=100;

}

}

else

zeci_de_grade_C=0;

if (val_digitala>=10){

unitati_de_grade_C=val_digitala/10;

while (val_digitala>=10){

val_digitala-=10;

}

}

else

unitati_de_grade_C=0;

zecimale_de_grade_C=val_digitala;

if ((sute_de_grade_C == 0) && (zeci_de_grade_C < 9)){

set_t1 = 0; // for continouse LED allerting mode

check_temp = 0; // for not interffering in interrupt and for full LED light when pressing button

Lcd8_Chr(2,15, ' ');

CustomChar(character1,1,2,16); // caracter grade celsius CGRAM 1

strConstCpy(text,mesg8);

Lcd8_Out(2,1,text);

if (set_t){

PORTD.f1 = 1; // cooler depasire val_digitala

PORTE.f2 = 1; // LED avertizare

}

if (!set_t && !PORTB.f4 && !PORTB.f5){

PORTD.f1 = 0; // cooler depasire val_digitala

PORTE.f2 = 0;

}

if (sute_de_grade_C==0 )

Lcd8_Chr(2, 9, ' '); // caracterul liber

else

Lcd8_Chr(2, 9, 0b00110000+sute_de_grade_C); // caracterul 0 din CGROM+val.din coonversie

Lcd8_Chr(2, 10, 0b00110000+zeci_de_grade_C);

Lcd8_Chr(2,11, 0b00110000+unitati_de_grade_C);

Lcd8_Chr(2, 12,'.');

Lcd8_Chr(2, 13, 0b00110000+zecimale_de_grade_C);

}

if ((zeci_de_grade_C >= 9)||(sute_de_grade_C == 1)){

check_temp = 1;

set_t1 = 1;

PORTD.f1 = 1; // cooler depasire val_digitala

PORTE.f2 = 1; // cooler depasire val_digitala

for (i=1; i<=16; i++) // toggle mesaj 'val_digitala motor'

Lcd8_Chr(2,i,' ');

Delay_ms(170);

strConstCpy(text,mesg9);

Lcd8_Out(2,1,text);

Delay_ms(170);

}

}

//–––––––––––––––––––––––––-//

void functie_lumina_meniu_principal(){

Lcd8_Chr(1,5,' ');

Lcd8_Chr(1, 4, '%');

val_digitala = Adc_Read(4);

lumina_pwm = Adc_Read(4)/10;

if (lumina_pwm >= 100)

lumina_pwm = 100;

val_digitala =val_digitala/10;

if (val_digitala >=100)

sute_procente_lum=1;

else

sute_procente_lum=0;

if (val_digitala>=10){

zeci_procente_lum=val_digitala/10;

while (val_digitala>=10){

val_digitala-=10;

}

}

else{

zeci_procente_lum=0;

}

unitati_procente_lum=val_digitala;

if (sute_procente_lum==0){

Lcd8_Chr(1, 1, ' '); // caracterul liber

Lcd8_Chr(1, 2, 0b00110000+zeci_procente_lum);

Lcd8_Chr(1, 3, 0b00110000+unitati_procente_lum);

}

else{

Lcd8_Chr(1, 1, '1');

Lcd8_Chr(1, 2, '0');

Lcd8_Chr(1, 3, '0');

}

indice_LCD_bargraph=zeci_procente_lum+6;

for (i=6;i<=indice_LCD_bargraph;i++){

if ((!zeci_procente_lum) && (!unitati_procente_lum))

CustomChar(character12,2,1,i); // caracter 0 functie_loading empty

else

CustomChar(character0,3,1,i);

}

for (i=indice_LCD_bargraph+1;i<=16;i++){

CustomChar(character12,2,1,i);

}

if (zeci_procente_lum<=3){

strConstCpy(text,mesg10);

Lcd8_Out(2,1,text);

lum_function_chec = 1; // check and uncheck for not interferring with interrupt LED state

PORTB.f0 = 1;

PORTE.f1 = 1; // LED avertizare

}

else{

lum_function_chec = 0; // check and uncheck for not interferring with interrupt LED state

PORTB.f0 = 0;

PORTE.f1 = 0; // LED avertizare

for (i=1; i<=16; i++)

Lcd8_Chr(2,i,' ');

}

}

//–––––––––––––––––––––––––-//

void functie_umiditate_meniu_principal(){

Lcd8_Chr(1,5,' ');

Lcd8_Chr(1, 4, '%');

val_digitala = Adc_Read(9);

if (val_digitala >=100)

sute_procente_lum=1;

else

sute_procente_lum=0;

if (val_digitala>=10){

zeci_procente_lum=val_digitala/10;

while (val_digitala>=10){

val_digitala-=10;

}

}

else{

zeci_procente_lum=0;

}

unitati_procente_lum=val_digitala;

if (sute_procente_lum==0){

Lcd8_Chr(1, 1, ' '); // caracterul liber

Lcd8_Chr(1, 2, 0b00110000+zeci_procente_lum);

Lcd8_Chr(1, 3, 0b00110000+unitati_procente_lum);

}

else{

Lcd8_Chr(1, 1, '1');

Lcd8_Chr(1, 2, '0');

Lcd8_Chr(1, 3, '0');

}

indice_LCD_bargraph=zeci_procente_lum+6;

for (i=6;i<=indice_LCD_bargraph;i++){

if ((!zeci_procente_lum) && (!unitati_procente_lum))

CustomChar(character12,2,1,i); // caracter 0 functie_loading empty

else

CustomChar(character0,3,1,i);

}

for (i=indice_LCD_bargraph+1;i<=16;i++){

CustomChar(character12,2,1,i);

}

if ((zeci_procente_lum<=3) &&(sute_procente_lum == 0)){ // analiza valoare umiditate(<=30%)

PORTD.f4 = 0; // LED avertizare umiditate

strConstCpy(text,mesg09); // afisare mesaj "umiditate"

Lcd8_Out(2,1,text); // LED avertizare

}

if ((zeci_procente_lum>3) || (sute_procente_lum == 1)){ // analiza valoare umiditate (>30%)

PORTD.f4 = 1; // LED avertizare umiditate > 30%

strConstCpy(text,mesg010); // afisare mesaj "stergatoare on"

Lcd8_Out(2,1,text);

}

}

//–––––––––––––––––––––––––-//

void functie_calcul_benzina(){

val_digitala = Adc_Read(5);

val_digitala =val_digitala/20;

if (val_digitala>=10){

zeci_procente_lum=val_digitala/10;

while (val_digitala>=10){

val_digitala-=10;

}

}

else

zeci_procente_lum=0;

unitati_procente_lum=val_digitala;

if (!zeci_procente_lum && unitati_procente_lum <= 7){

Lcd8_Cmd(Lcd_CLEAR) ;

Delay_ms(600);

strConstCpy(text,mesg14);

Lcd8_Out(1,1,text);

Delay_ms(600);

}

else{

Lcd8_Chr(2,14,' ');

Lcd8_Chr(2,8,' ');

Lcd8_Chr(2,9,' ');

for (i=3;i<=11;i++)

Lcd8_Chr(1,i,' ');

strConstCpy(text,mesg12);

Lcd8_Out(1,12,text);

strConstCpy(text,mesg13);

Lcd8_Out(2,1,text);

Lcd8_Chr(1, 1, 0b00110000+zeci_procente_lum);

Lcd8_Chr(1, 2, 0b00110000+unitati_procente_lum);

autonomie = (zeci_procente_lum * 10) + unitati_procente_lum;

temp1 = autonomie/8;

temp2 = autonomie % 8;

Lcd8_Chr(2, 10, 0b00110000+temp1);

Lcd8_Chr(2, 11, 0b00110000+temp2);

Lcd8_Chr(2, 12, '0');

Lcd8_Chr(2, 13, ' ');

Lcd8_Chr(2, 15, 'K');

Lcd8_Chr(2, 16, 'm');

}

}

//–––––––––––––––––––––––––-//

void functie_loading(){

strConstCpy(text,mesg3);

Lcd8_Out(1,1,text);

CustomChar(character0,0,2,1);

Delay_ms (80);

CustomChar(character0,0,2,2);

Delay_ms (80);

CustomChar(character0,0,2,3);

Delay_ms (380);

CustomChar(character0,0,2,4);

Delay_ms (500);

CustomChar(character0,0,2,5);

Delay_ms (260);

CustomChar(character0,0,2,6);

Delay_ms (150);

CustomChar(character0,0,2,7);

Delay_ms (200);

CustomChar(character0,0,2,8);

Delay_ms (160);

CustomChar(character0,0,2,9);

Delay_ms (115);

CustomChar(character0,0,2,10);

Delay_ms (280);

CustomChar(character0,0,2,11);

Delay_ms (500);

CustomChar(character0,0,2,12);

Delay_ms (500);

CustomChar(character0,0,2,13);

Delay_ms (200);

CustomChar(character0,0,2,14);

Delay_ms (80);

CustomChar(character0,0,2,15);

Delay_ms (80);

CustomChar(character0,0,2,16);

Delay_ms (530);

Lcd8_Cmd(Lcd_CLEAR) ;

}

//–––––––––––––––––––––––––-//

void interrupt (){

cntr = cntr + 1; // contor for meniu and function LED

if (cntr >= 1 && cntr <= 50) // ON LED state for short period of time (blue LED)

PORTE.f1 = 1;

else if (!lum_function_chec) // check from LUMINA functions that LED is not ON for not interferring

PORTE.f1 = 0; // OFF LED state for short period of time

if (cntr >= 3000) // counter reset

cntr = 0;

if (PORTB.f4 || PORTB.f5) // LED ON when press menu button (red)

PORTE.f2 = 1;

if (!PORTB.f4 && !PORTB.f5 && !check_temp)

PORTE.f2 = 0; // LED ON when press menu button (red)

if (!PORTB.f4 && !PORTB.f5 && !check ){ // meniu idle

meniu_1 = 1;

meniu_2 = 0;

meniu_3 = 0;

meniu_4 = 0;

meniu_5 = 0;

goto endint; // Speeding execution

}

if (PORTB.f4 && check == 0){ // meniu 1-2

cntr = 0;

check = 1;

meniu_1 = 0;

meniu_2 = 1;

meniu_3 = 0;

meniu_4 = 0;

meniu_5 = 0;

goto endint; // Speeding execution

}

if (PORTB.f5 && check == 1 && cntr>= 500){ // meniu 2-1

cntr = 0;

check = 0;

meniu_1 = 1;

meniu_2 = 0;

meniu_3 = 0;

meniu_4 = 0;

meniu_5 = 0;

goto endint; // Speeding execution

}

if (PORTB.f4 && check == 1 && cntr>= 500){ // meniu 2-3

cntr = 0;

check = 3;

meniu_1 = 0;

meniu_2 = 0;

meniu_3 = 1;

meniu_4 = 0;

meniu_5 = 0;

goto endint; // Speeding execution

}

if (PORTB.f5 && check == 3 && cntr>= 500){ // meniu 3-2

cntr = 0;

check = 1;

meniu_1 = 0;

meniu_2 = 1;

meniu_3 = 0;

meniu_4 = 0;

meniu_5 = 0;

goto endint; // Speeding execution

}

if (PORTB.f4 && check == 3 && cntr>= 500){ // meniu 3-4

cntr = 0;

check = 4;

meniu_1 = 0;

meniu_2 = 0;

meniu_3 = 0;

meniu_4 = 1;

meniu_5 = 0;

goto endint; // Speeding execution

}

if (PORTB.f5 && check == 4 && cntr>= 500){ // meniu 4-3

cntr = 0;

check = 3;

meniu_1 = 0;

meniu_2 = 0;

meniu_3 = 1;

meniu_4 = 0;

meniu_5 = 0;

goto endint; // Speeding execution

}

if (PORTB.f4 && check == 4 && cntr>= 500){ // meniu 4-5

cntr = 0;

check = 7;

meniu_1 = 0;

meniu_2 = 0;

meniu_3 = 0;

meniu_4 = 0;

meniu_5 = 1;

goto endint; // Speeding execution

}

if (PORTB.f5 && check == 7 && cntr>= 500){ // meniu 5-4

cntr = 0;

check = 4;

meniu_1 = 0;

meniu_2 = 0;

meniu_3 = 0;

meniu_4 = 1;

meniu_5 = 0;

goto endint; // Speeding execution

}

if (PORTB.f4 && check == 7 && cntr>= 500){ // meniu 5-6

cntr = 0;

check = 8;

meniu_1 = 0;

meniu_2 = 0;

meniu_3 = 0;

meniu_4 = 0;

meniu_5 = 0;

meniu_6 = 1;

goto endint; // Speeding execution

}

if (PORTB.f5 && check == 8 && cntr>= 500){ // meniu 6-5

cntr = 0;

check = 7;

meniu_1 = 0;

meniu_2 = 0;

meniu_3 = 0;

meniu_4 = 0;

meniu_5 = 1;

meniu_6 = 0;

goto endint; // Speeding execution

}

//––––––RESET T1 INTERRUPT FLAG + SET START VALUE ––––––//

endint :

PIR1.TMR1IF = 0;

TMR1H = 0b11111110; // setat la 500*0.5u = 250us

TMR1L = 0b00001011;

}

//–––––––––––––––––––––––––-//

Similar Posts