Sunteți pe pagina 1din 22

Catalin SERBAN

Grupa 321AB Universitatea Polithenica din Bucuresti


1


Afisare informatii personalizate pe ecran LCD folosind AVR
microcontroler (ATmega 16)

SUMAR
In cadrul acestui proiect s-a realizat implementarea unui ceas digital complet ce permite
pe langa afisarea ceasului normal si afisarea datei calendaristice si ziua corespunzatoare a
saptamanii si un termometru digital, cu ajutorul unui microcontroller AVRAtmel ATMega16
si un afisaj alfanumeric cu cristale lichide, 16x2 caractere.








DESCRIERE

Dispozitivul a fost proiectat pentru a fi montat in interiorul unui autoturism pentru
afisarea informatiilor mentionate in sumar, dar poate fi utilizat cu usurinta in diverse alte
locuri cu aceeasi functionalitate.
Caracteristici de functionare:
Intreg montajul fiind proiectat pentru un autoturism, LCD-ul este activ atata
timp cat motorul autovehiculului este pornit, la fiecare pornire, ecranul
initializandu-se prin afisarea unui mesaj de START , revenind apoi la afisarea
standard(ceas, temperatura, data, ziua saptamanii);



Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
2

Afisarea se face dupa cum urmeaza: pe primul rand se afiseaza alternativ, la
interval de 5 secunde, ziua saptamanii impreuna cu data calendaristica si apoi
temperatura in grade Celsius; pe cel de-al doilea rand al ecranului se afiseaza
in permanenta ceasul in format hh:mm:ss ;
Dispozitivul este prevazut cu un panou de butoane ce permite setarea
ceasului,a datei si a zilei saptamanii, cu ajutorul meniului de setare. Panoul de
butoane este prezentat in imaginea de mai jos, cu semnificatia aferenta
fiecarui buton:



















Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
3


SCHEMA CIRCUITUILUI



Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
4


MONTAJ ELECTRONIC






COMPONENTE


Microcontroler ATmega16
ATmega16 este un microcontroler de 8-biti de inalta performanta din
familia AtmelAVR Mega cu un consum redus de energie. Atmega16 se bazeaza pe cresterea
arhitecturii RISC (Reduced Instruction Set Computing), arhitectura cu 131 instructiuni
puternice. Cele mai multe dintre instructiunile sale se executa intr-un singur ciclu de ceas.
Atmega16 poate lucra pe o frecventa maxim de 16MHz.
ATmega16 are 16 KB de memorie flash programabila, 1 KB de memoria RAM static
si 512 Bytes EEPROM. Numarul de cicluri de viata pentru memoria flash si EEPROM sunt
10.000 si respective 100.000.
Este un microcontroler cu 40 de pini. Exist 32 de pini de I / O (intrare / iesire). Pinii
sunt impartiti 4 linii a cate 8 biti:porturile desemnate ca PORTA, PORTB, PORTC
si PORTD. Are diverse componente periferice inglobate: USART, ADC, Analog
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
5

Comparator, SPI, JTAG etc. Fiecare pin de I/O are o sarcina alternativa in functie de aceste
component periferice.

Convertorul de nivel MAX232
Rolul acestuia este sa converteasca nivelurile TTL (0..5V) in niveluri
RS232, si viceversa; practic, tensiunile +10V si -10V se obtin prin
dublarea tensiunii de alimentare a circuitului, folosind un convertor
intern cu capacitati comutate, care folosete condensatoarele externe C6-
C9. Acest circuit integrat este folosit pentru programarea microcontroler-
ului, ajutand la comunicarea seriala intre placuta de circuit si PC.
Programarea clasica a procesorului foloseste fie un programator dedicat, fie conectorul ISP
la care se conecteaza un programator. O varianta mai ieftina si mai comoda este sa nu se
foloseasca nici un fel de programator !
Pentru aceasta, in flash-ul procesorului se incarca mai intai un soft numit bootloader
(evident, pentru aceasta trebuie un programator, dar operatia se face o singura data). Dupa
aceea, bootloader-ul comunica prin serial cu un program de PC numit PC-loader pentru a
transfera softul de aplicatie si a-l programa in flash. Prin urmare, odata bootloader-ul
incarcat, tot ce mai este necesar este un port serial, iar dispozitivul are deja un port serial
construit si conectat la pinii procesorului! J2 este conectorul de programare ISP (In-
System Programming) .



Senzor de temperatura LM35

Senzorul LM35 utilizat in acest proiect este un sensor de precizie pentru masurat
temperatura care o iesire de tensiune analogica. Poate masura temperaturi intre -55C si
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
6

+150C cu o precizie de 0.5C. Tensiunea de iesire este de 10 mV/ C si este convertita de
convertorul analog-digital al controler-ului ATmega16.

LM7805 - 3-Terminal 1A Positive Voltage Regulator

Acest stabilizator de tensiune este folosit pentru a produce tensiunea de 5 V,
dispozitivul fiind alimentat de la un acumulator auto cu tensiunea de 12 V. Aceasta tensiune
de 5 V reprezinta tensiunea de alimentare pentru toate componentele de pe placa: procesor,
LCD, senzor de temperature, MAX232.
Pe placa sunt montate doua astfel de stabilizatoare: unul alimentand microcontrolerul,
integratul MAX232, senzorul de temperatura si LCD-ul, insa fara lumina de fundal
(backlight), aceasta fiind alimentata de ce cel de-al doilea stabilizator de tensiune cu ajutorul
caruia se detecteaza functionarea motorului autovehicului, controland astfel pornirea/oprirea
ecranului LCD.


COD SURSA

Fisierele lcd.h si lcd.c sunt folosite pentru legatura dintre LCD si microcontroler si pot fi
descarcate de pe http://jump.to/fleury .

// AVR ATMEGA32 - INTERNAL 4MHz CLK

// Include Files
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <util/delay.h>
#include <string.h>
#include "lcd.h" // THE LCD HEADER FILE TO INCLUDE


// For Bitvise Operation Simplification Defines
#define CLR(port,pin) PORT ## port &= ~(1<<pin)
#define SET(port,pin) PORT ## port |= (1<<pin)
#define TOGL(port,pin) PORT ## port ^= (1<<pin)
#define READ(port,pin) PIN ## port & (1<<pin)
#define OUT(port,pin) DDR ## port |= (1<<pin)
#define IN(port,pin) DDR ## port &= ~(1<<pin)


///////////////////////////////////////////////////////////////////
//SETARI PENTRU AFISARE CEAS ATMEGA////////////////////////////////
#define F_CPU 4000000UL
#define LCD_CNTRL_PORT PORTC
#define LCD_CNTRL_DDR DDRC
#define LCD_CNTRL_PIN PINC


#define UP 0
#define DOWN 5
#define MENIU 1
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
7

#define STANGA 4
#define DREAPTA 3
#define SELECT 2


unsigned char hours=0;
unsigned char minutes=0;
unsigned char seconds=0;
char time[]="00:00:00";
////////=======================================

unsigned char day=1;
unsigned char month=1;
unsigned char year=12;




//date despre meniu..selected=pozitia pe care se afla cursorul
// start= pozitia de start pentru afisarea optiunilor din meniu
int selected=0,start=0;
int clockon=1;//1 afiseaza ceasul la pornire
//0 opreste afisarea ceasului la intrarea in meniu
int set_clock=0; //1 - meniu activ pentru setarea ceasului
//0 - meniu inactiv pentru setearea ceasului
char *semne[5]={"ora","min","zi ","luna","an "};
char *zile[8]={"Luni","Marti","Mierc","Joi","Vineri","Smbata","Dum"};
char *zile_setare[8]={"Luni","Marti","Miercuri","Joi","Vineri","Sambata","Duminica"};
int month_day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int day_cnt=0; // contor pentru memorarea zilelor saptamanii
int disp_5_sec=0;//contor pentru afisarea alternativa pe ecran a datelor la interval de 5 secunde
int adc_result; //rezultatul temperaturii
int contact_reading;

int contor=0,set_clock_disp=0,set_day=0,set_date=0,display_status=1,contact_delay=0;

ISR(TIMER1_COMPA_vect);
void setare_ceas();
void setare_zi_sapt();
void setare_data();


//////////////////////////////////////////////////////////////////
static const PROGMEM unsigned char sageata[]={0x1,0x3,0x7,0xf,0x7,0x3,0x1,0x00,
// spre stanga
0x10,
0x18, 0x1c, 0x1e, 0x1c, 0x18, 0x10,0x00, // spre dreapta

0x1c,0x14,0x1c,0x00,0x00,0x00,0x00,0x00 }; //semn de grad



static const PROGMEM unsigned char progressbar[]=//define 8 custom LCD chars
{
0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x1f, // 1/5 progress bar
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
8

0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, // 2/5 progress bar
0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1f, 0x1f, // 3/5 progress bar
0x1f, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, // 4/5 progress bar
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, // 5/5 progress bar
0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, //empty cell loading
};

struct variabiles
{
char *text;
int pos;
};

volatile struct variabiles meniu[20]={{"Setare ceas",0},{"Data",0},{"Ziua",0},{"optiune
4",0},{"optiune 5",0}};

void LCD_update();

void initialscreen()
{
lcd_clrscr();
lcd_puts("Standby");
}

/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////ADC CONVERSION////////////////////////////////////////
/***********************************ADC READ
FUNCTION**********************************************/
uint16_t adc_read_new_version(unsigned char ch)
{
ADMUX=(0x40|ch);
ADCSRA|=(1<<ADSC);
while(!(ADCSRA&(1<<ADIF)));
ADCSRA|=(1<<ADIF);
return ADC;
}











uint16_t read_adc(uint8_t adc_input)
{
if (adc_input < 1) {
ADMUX = adc_input;
ADMUX=(1<<REFS0);
}
else {
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
9

ADMUX = (1<<REFS0) | adc_input;
}

ADCSRA |= (1<<ADEN)|(1<<ADSC)|(1<<ADATE);
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADC;
}


void InitADC()
{
ADMUX=(1<<REFS0); // For Aref=AVcc;


// ADCSRA=(1<<ADEN)|(1<<ADPS2)|(ADPS1)|(1<<ADPS0); //Rrescalar div factor =128
ADCSRA=0x85;

}

uint16_t ReadADC(uint8_t ch)
{
//Select ADC Channel ch must be 0-7
ch=ch&0b00000111;
ADMUX|=ch;

//Start Single conversion
ADCSRA|=(1<<ADSC);

//Wait for conversion to complete
while(!(ADCSRA & (1<<ADIF)));

//Clear ADIF by writing one to it
//Note you may be wondering why we have write one to clear it
//This is standard way of clearing bits in io as said in datasheets.
//The code writes '1' but it result in setting bit to '0' !!!

ADCSRA|=(1<<ADIF);

return(ADC);
}

/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////


int main(void)
{

int i,statemenu=0;


// LCD
OUT(B,4); OUT(B,5); OUT(B,6); // RS - RW - E
// if(x)
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
10

InitADC();
lcd_init(LCD_DISP_ON);

lcd_init(LCD_DISP_OFF);
lcd_init(LCD_DISP_ON);




LCD_CNTRL_PORT=(1<<UP | 1<<DOWN | 1<<MENIU | 1<<SELECT | 1<<STANGA |
1<<DREAPTA);
TCCR1B=(1<<CS12 | 1<<WGM12);
OCR1A=15625-1;
TIMSK=1<<OCIE1A;




///scriere caractere speciale === sageata de selectie
lcd_command(_BV(LCD_CGRAM));
for(i=0;i<24;i++)
{
lcd_data(pgm_read_byte_near(&sageata[i]));
}
/////////////////////////////////////////////////////




//initialscreen();
LCD_print_date();
sei();


while(1)
{


if(contact_delay==3)
{
contact_reading=adc_read_new_version(1);

if(contact_reading<500 && display_status==1)
{
display_status=0;
clockon=0;
i=16;
while(i!=4)
{
lcd_clrscr();
lcd_gotoxy(i,0);
lcd_puts("Goodbye!");
_delay_ms(250);
i--;
}
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
11

_delay_ms(1000);
lcd_init(LCD_DISP_OFF);
}

if(contact_reading>500 && display_status==0)
{
lcd_init(LCD_DISP_ON);
afisare_intro();
display_status=1;
clockon=1;
LCD_print_date();
disp_5_sec=0;

}

contact_delay=0;
}


if(disp_5_sec==4 && clockon==1)
adc_result=adc_read_new_version(0);

if(disp_5_sec==5 && clockon==1)
{
_delay_ms(75);
LCD_print_temp();
}
if(disp_5_sec==10 && clockon==1)
{
_delay_ms(75);
LCD_print_date();
disp_5_sec=0;
}

if(!(LCD_CNTRL_PIN & (1<<MENIU)))/// la apasare se intra in meniu
{
statemenu=1; //constanta ce mentine activ meniul
LCD_update(); //se afiseaza meniul
clockon=0; //se intrerupe afisarea ceasului

}
_delay_ms(170);

while(statemenu)
{

if(!(LCD_CNTRL_PIN & (1<<DOWN))) //actionare buton DOWN in meniul
principal

if(selected<4)
{
selected++;
LCD_update();
}

Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
12

if(!(LCD_CNTRL_PIN & (1<<UP))) //actionare buton UP in meniul
principal

if(selected>0)
{
selected--;
LCD_update();
}

if(!(LCD_CNTRL_PIN & (1<<MENIU))) //actionare buton MENIU in meniul
principal==> EXIT
{

statemenu=0; //se opreste afisarea meniului
disp_5_sec=0; //se reseteaza contorul pentru afisare alternativa,
pentru ca e posibil ca timpul in meniu sa fie
contact_delay=0; //se reseteaza contorul pentru oprirea alimentarii
lcd_clrscr();
LCD_print_date(); //se afiseaza ecranul principal de functionare
clockon=1; //se permite afisarea ceasului

}

if(!(LCD_CNTRL_PIN & (1<<SELECT)))
{
switch(selected) {

case 0:
{
contor=0; //contorul pentru afisarea semnelor ce indica
elementul curent de setat
setare_ceas();
set_clock=1; //constanta ce mentine meniul de setare al
ceasului activ
statemenu=0; //nu se afiseaza meniul principal
set_clock_disp=1;
lcd_gotoxy(13,1);
lcd_puts(semne[contor]);
break;
}

case 2:
{
setare_zi_sapt();//functia ce afiseaza header-ul meniului de
setare==>Ziua saptamanii
statemenu=0;
set_day=1;
break;
}

case 1:
{
contor=2; //contorul pentru afisarea
elementului ce trebuie setat-- porneste de la 2=zi
lcd_clrscr();
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
13

lcd_gotoxy(0,0);
lcd_putc(1); //sageata pentru meniu
lcd_puts("Setare data"); //header-ul pentru submeniu de
setare data
setare_data(); //se afiseaza data
statemenu=0; //se opreste afisarea meniului
principal
set_date=1; //se permite intrarea in
submeniul de setare al datei
lcd_gotoxy(12,1);
lcd_puts(semne[contor]); //se afiseaza elementul ce
trebuie setat
break;
}
}
}


//===========================================================
==========================================
//===========================================================
==========================================
//===========================================================
==========================================

////////////SETARE DATA
while(set_date)
{
if(!(LCD_CNTRL_PIN & (1<<MENIU))) //actionare buton MENIU in
meniul SET_DATE==> Return meniu
{
statemenu=1; //se revine la meniu ==> se afiseaza meniul
LCD_update(); //se afiseaza meniul pe ecran
set_date=0; //se opreste afisarea submeniului de setare
al datei
}

if(!(LCD_CNTRL_PIN & (1<<DREAPTA)))
{
if (contor==4) contor=2;
else contor++;
lcd_gotoxy(12,1);
lcd_puts(semne[contor]);
}

if(!(LCD_CNTRL_PIN & (1<<STANGA)))
{
if (contor==2) contor=4;
else contor--;
lcd_gotoxy(12,1);
lcd_puts(semne[contor]);
}


if(!(LCD_CNTRL_PIN & (1<<UP)))
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
14

{
switch (contor)
{
case 2:
{
if(day==month_day[month]) day=1;
else day++;
setare_data();
break;
}

case 3:
{
if(month==12) month=1;
else month++;
setare_data();
break;
}

case 4:
{
if(year==40) year=12;
else year++;
setare_data();
break;
}
}
}


if(!(LCD_CNTRL_PIN & (1<<DOWN)))
{
switch (contor)
{
case 2:
{
if(day==1) day=month_day[month];
else day--;
setare_data();
break;
}

case 3:
{
if(month==1) month=12;
else month--;
setare_data();
break;
}

case 4:
{
if(year==12) year=40;
else year--;
setare_data();
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
15

break;
}
}
}

_delay_ms(250);

}
//===========================================================
==========================================
//===========================================================
==========================================
//===========================================================
==========================================





//////////// SETARE CEAS
while(set_clock)
{

if(!(LCD_CNTRL_PIN & (1<<MENIU))) //actionare buton MENIU in
meniul SET_CLOCK==> Return meniu
{
statemenu=1; //se opreste afisarea meniului
LCD_update(); //se revine la meniu ==> se afiseaza meniul
set_clock_disp=0; //se opreste afisarea
ceasului din meniul de setare ceas
set_clock=0; //se iese din meniul de setare al ceasului
}

if(!(LCD_CNTRL_PIN & (1<<DREAPTA)))
{
if (contor==0) contor++;
lcd_gotoxy(13,1);
lcd_puts(semne[contor]);
}
if(!(LCD_CNTRL_PIN & (1<<STANGA)))
{
if (contor==1) contor--;
lcd_gotoxy(13,1);
lcd_puts(semne[contor]);
}
if(!(LCD_CNTRL_PIN & (1<<UP)))
switch(contor) {
case 0:
{
hours++;
if(hours>23)
hours=0;
break;
}

Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
16

case 1:
{
minutes++;
if(minutes>59)
minutes=0;
break;
}
}

if(!(LCD_CNTRL_PIN & (1<<DOWN)))
switch(contor) {
case 0:
{
if(hours==0)
hours=23;
else hours--;
break;
}

case 1:
{

if(minutes==0)
minutes=59;
else minutes--;

break;
}
}

_delay_ms(170);
}

/////////ZIUA SAPTAMANII
while(set_day)
{
if(!(LCD_CNTRL_PIN & (1<<MENIU))) //actionare buton MENIU in
meniul SET_DAY==> Return meniu
{
statemenu=1; //se porneste afisarea meniului
LCD_update(); //se revine la meniu ==> se afiseaza meniul
set_day=0; //se iese din meniul de setare al zilei
saptamanii
}

if(!(LCD_CNTRL_PIN & (1<<STANGA)))
{
if(day_cnt==0)
day_cnt=6;
else day_cnt--;
setare_zi_sapt();
}

if(!(LCD_CNTRL_PIN & (1<<DREAPTA)))
{
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
17

day_cnt++;
if(day_cnt>6)
day_cnt=0;
setare_zi_sapt();
}

_delay_ms(200);
}




_delay_ms(170);
}
}

return 0;
}









void LCD_update()
{

int k,j;

lcd_clrscr();

if(selected-(start)==2) (start)++;
if(selected-(start)<0) (start)--;
k=start;
for(j=0;j<2;j++)
{
lcd_gotoxy(2,j);
lcd_puts(meniu[k].text);
meniu[k].pos=j;
k++;
}
lcd_gotoxy(0,meniu[selected].pos);
lcd_putc(0);
lcd_putc(1);

}

ISR(TIMER1_COMPA_vect)
{
seconds++;
disp_5_sec++;
contact_delay++;
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
18


if(seconds==60)
{
seconds=0;
minutes++;
}

if(minutes==60)
{
minutes=0;
hours++;
}

if(hours>23)
{
hours=0;
day++;
if(day>month_day[month])
{
month++;
day=1;
if(month>12)
{
year++;
month=1;
}
}
day_cnt++;
if(day_cnt>6) day_cnt=0;
}
if(clockon)
LCD_update_time();
if(set_clock_disp)
LCD_update_setclock();
}

void LCD_update_time()
{
unsigned char temp;
//lcd_clrscr();
// lcd_gotoxy(0,1);
// lcd_puts(" ");
lcd_gotoxy(4,1);

itoa(hours/10,temp,10);
lcd_puts(temp);
itoa(hours%10,temp,10);
lcd_puts(temp);
lcd_putc(':');


itoa(minutes/10,temp,10);
lcd_puts(temp);
itoa(minutes%10,temp,10);
lcd_puts(temp);
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
19

lcd_putc(':');

itoa(seconds/10,temp,10);
lcd_puts(temp);
itoa(seconds%10,temp,10);
lcd_puts(temp);

// _delay_ms(75);

}

void LCD_update_setclock()
{
unsigned char temp;
//lcd_clrscr();
lcd_gotoxy(2,1);

itoa(hours/10,temp,10);
lcd_puts(temp);
itoa(hours%10,temp,10);
lcd_puts(temp);
lcd_putc(':');


itoa(minutes/10,temp,10);
lcd_puts(temp);
itoa(minutes%10,temp,10);
lcd_puts(temp);
lcd_putc(':');

itoa(seconds/10,temp,10);
lcd_puts(temp);
itoa(seconds%10,temp,10);
lcd_puts(temp);
/*
lcd_gotoxy(13,1);
lcd_puts(semne[contor]);
*/
}


void setare_ceas()
{
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_putc(1);
lcd_puts("Setare ceas:");
}

void setare_zi_sapt()
{
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_putc(1);
lcd_puts("Ziua saptamanii");
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
20

lcd_gotoxy(2,1);
lcd_puts(zile_setare[day_cnt]);
}


void setare_data()
{
unsigned char temp;
/*
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_putc(1);
lcd_puts("Setare data");
*/
lcd_gotoxy(2,1);

itoa(day/10,temp,10);
lcd_puts(temp);
itoa(day%10,temp,10);
lcd_puts(temp);
lcd_putc('-');


itoa(month/10,temp,10);
lcd_puts(temp);
itoa(month%10,temp,10);
lcd_puts(temp);
lcd_putc('-');

itoa(year/10,temp,10);
lcd_puts(temp);
itoa(year%10,temp,10);
lcd_puts(temp);
/*
lcd_gotoxy(14,1);
lcd_puts(semne[contor]);
*/


}



void LCD_print_date()////functie folosita momentan doar pentru afisare la pornire
{
unsigned char temp;
// lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts(" ");
lcd_gotoxy(0,0);
lcd_puts(zile[day_cnt]);

lcd_gotoxy(8,0);

itoa(day/10,temp,10);
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
21

lcd_puts(temp);
itoa(day%10,temp,10);
lcd_puts(temp);
lcd_putc('-');


itoa(month/10,temp,10);
lcd_puts(temp);
itoa(month%10,temp,10);
lcd_puts(temp);
lcd_putc('-');

itoa(year/10,temp,10);
lcd_puts(temp);
itoa(year%10,temp,10);
lcd_puts(temp);

}


void LCD_print_temp()
{
char temp[20],dec[5],frac[5];
float temperature,diffvalue;
int tempint,decimal;
lcd_gotoxy(0,0);
//adc_result=adc_read_new_version(0);
//adc_result=40;
temperature=adc_result*5;
temperature=temperature/1023;
temperature=(temperature)*100;
//temperature+=0.1;

tempint=(int)temperature;
diffvalue=temperature-(float)tempint;
decimal=(int)(diffvalue*10.0);



itoa(tempint,dec,10);
itoa(decimal,frac,10);
// _delay_ms(1000);
if(tempint>=0)
{
sprintf(temp,"Temp : %s.%s ",dec,frac);
lcd_puts(temp);
lcd_gotoxy(12,0);
lcd_putc(2);
lcd_putc('C');
}
else
{
sprintf(temp,"Temp : %s.%s ",dec,frac);
lcd_puts(temp);
lcd_gotoxy(12,0);
Catalin SERBAN
Grupa 321AB Universitatea Polithenica din Bucuresti
22

//lcd_gotoxy(12,0);
lcd_putc(2);
lcd_putc('C');
}
}


void afisare_intro()
{
int i,j;
lcd_clrscr();

lcd_gotoxy(6,0);
lcd_puts("OPEL");

lcd_command(_BV(LCD_CGRAM));
for(i=0;i<48;i++)
{
lcd_data(pgm_read_byte_near(&progressbar[i]));
}

for(j=0;j<16;j++)
{
lcd_gotoxy(j,1);
lcd_putc(5);
}
_delay_ms(2000);
for(j=0;j<16;j++)
{
for(i=0;i<5;i++)
{
lcd_gotoxy(j,1);
lcd_putc(i);
_delay_ms(40);
}
}

lcd_command(_BV(LCD_CGRAM));
for(i=0;i<24;i++)
{
lcd_data(pgm_read_byte_near(&sageata[i]));
}

lcd_clrscr();
}

S-ar putea să vă placă și