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;
}
//–––––––––––––––––––––––––-//
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Computer de Bord Auto (ID: 149631)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
