VACA DIGITALA

IN CONTINUARE ESTE CODUL DIN ATMEGA8 SCRIS IN C++

atmega8

  1 #define F_CPU 16000000UL
  2  #include <avr/io.h>
  3  #include <avr/interrupt.h>
  4  #include <util/delay.h>
  5  #include <avr/EEPROM.h>
  6  #include <stdlib.h>
  7  #include <avr/pgmspace.h>
  8  #include "lcd.h"
  9  
 10  volatile uint16_t NrDeLitri=0;      //Numarul de litri de lapte
 11  volatile uint16_t NrDePulsuri =0;
 12  uint8_t EEMEM memorie =1;    // Numar de litri in eeprom la prima pornire dupa programare este 1
 13  uint16_t i = 0;
 14  void afisaretext(void)
 15  {
 16  
 17      LCDClear();//sterge ecranul LCD
 18      LCDGotoXY(0, 0);
 19      LCDWriteString("Program scris de");
 20      _delay_ms(1500);
 21      LCDGotoXY(1, 1);
 22      LCDWriteString("Simpalean Nicu");
 23      _delay_ms(1500);
 24      LCDClear();
 25  }
 26  
 27  void Wait()
 28  {
 29      uint8_t i;
 30      for(i=0;i<2;i++)
 31      {
 32          _delay_loop_2(0);
 33      }
 34  }
 35  
 36  int  main(void)
 37  {
 38      LCDInit(LS_NONE);
 39  
 40      Wait();
 41      Wait();
 42      Wait();
 43      Wait();
 44      eeprom_busy_wait();
 45      NrDeLitri = eeprom_read_byte(& memorie);//citeste din memorie numarul de litri la pornire program
 46      _delay_ms(20);
 47      afisaretext();//afiseaza textul din functia afisaretext
 48  
 49      DDRC=0b00000000;// seteaza pinii din portul C ca intrari logice
 50      PORTC=0b11111111;// seteaza  pinii portului C la nivel logic 1
 51      DDRB = 0b11111111;// seteaza pinii portului B ca iesiri logice
 52  
 53      MCUCR|=(1<<ISC01);  //Considera o intrerupere externa o trecere de la 5V la 0V pe pinul 4 (INT0)
 54      GICR|=(1<<INT0);    //Activeaza intreruperile INT0
 55  
 56      sei(); // Activeaza intreruperile globale
 57  
 58      LCDClear();//sterge display-ul LCD
 59  
 60      while(1)
 61      {
 62          eeprom_busy_wait();
 63          eeprom_update_byte(&memorie, NrDeLitri);
 64  
 65          if (NrDeLitri==60 && i <50)
 66          {
 67              i++;
 68              if(i<25)
 69              {
 70                  PORTB|=_BV(3);
 71  
 72              }
 73              else if (i>25)
 74              {
 75                  PORTB &=!_BV(3);
 76              }
 77          }
 78          else if(NrDeLitri!=60)
 79          {
 80              PORTB &=!_BV(3);
 81              i=0;
 82          }
 83  
 84          if (NrDeLitri>0 && NrDePulsuri> 362 && NrDeLitri!=54) //daca nr de litri este mai mare decat 0 si nr de pulsuri
 85                                                                //numarate este mai mare de 362si numarul de litri nu este egal cu 54 ,
 86                                                                //atunci executa comenzile din urmatoarea paranteza
 87  
 88          {
 89              NrDeLitri=NrDeLitri - 1; // din numarul de litri existent scade 1
 90              NrDePulsuri = 0;   // reseteaza numarul de pulsuri
 91              eeprom_busy_wait();  //
 92              eeprom_update_byte(&memorie, NrDeLitri);//trimite in memorie noua valoare a numarului de litri
 93          }
 94          else if(NrDeLitri<1) // sau daca numarul de litri este mai mic decat 1 , executa comenzile din urmatoarea paranteza
 95          {
 96              PORTB &=!_BV(1); // forteaza nivel logic zero pe pinul 1 din portul B pentru a decupla
 97                               //releul care alimenteaza aparatele pentru bani
 98              NrDePulsuri = 0; // reseteaza numarul de pulsuri
 99  
100          }
101          if (NrDeLitri>0 && NrDePulsuri>=362 && NrDeLitri==54) // daca numarul de litri este mai mare decat 0 si nr de pulsuri
102                                                                //este mai mare de 362 si numarul de pulsuri este egal
103                                                                // cu 54 ,atunci executa comenzile din urmatoarea paranteza
104  
105          {
106              NrDeLitri=NrDeLitri - 51; // din numarul de litri existenti scade 51 astfel numaratoarea va fi 55,54,3,2,1,0
107              NrDePulsuri = 0;          //reseteaza numarul de pulsuri
108              eeprom_busy_wait();
109              eeprom_update_byte(&memorie, NrDeLitri);//trimite in eeprom noua valoare a numarului de litri
110  
111          }
112          if (NrDeLitri>0) //daca numarul de litri este mai mare decat zero ...
113          {
114  
115              PORTB|=_BV(1); //forteaza nivel logic 1 pe pinul 1 din portul B pentru a tine releul cuplat
116  
117          }
118          if(bit_is_clear(PINC,5) && NrDeLitri<254 && NrDeLitri!=3)//buton creste-daca a fost pus la masa pinul 5 din
119                                                                   //portul C prin apasarea butonului creste si numarul de litri
120                                                                   //este mai mic de 254 si numarul de litri nu este egal cu trei
121  
122          {
123              NrDeLitri = NrDeLitri + 1;               //adauga o unitate la numarul de litri
124              eeprom_busy_wait();
125              eeprom_update_byte(&memorie, NrDeLitri); // trimite in memorie noua valoare
126              _delay_ms(350);                          // intrerupe programul 350 de milisecunde dupa care mai creste o unitate
127                                                       //daca butonul mai este inca apasat and so on...
128  
129          }
130  
131          if(bit_is_clear(PINC,5) && NrDeLitri==3)// daca butonul creste este apasat si numarul de litri este trei , atunci...
132          {
133              NrDeLitri = NrDeLitri + 51;//aduna 51 la numarul de litri
134              eeprom_busy_wait();
135              eeprom_update_byte(&memorie, NrDeLitri);// scrie in memorie noua valoare
136              _delay_ms(350);//intrerupe programul 350 ms dupa care mai adauga o unitate daca butonul mai este apasat
137  
138          }
139          if(bit_is_clear(PINC,4) && NrDeLitri>0 && NrDeLitri!=54)// buton scade - daca a fost pus la masa pinul 4 din portul
140                                                                  //C si numarul de litri este mai mare decat zero
141                                                                  //si numarul de litri nu este egal cu 54 atunci..
142  
143          {
144              NrDeLitri = NrDeLitri - 1;              //scade o unitate din numarul de litri
145              eeprom_busy_wait();
146              eeprom_update_byte(&memorie, NrDeLitri);//trimite noua valoare in memorie
147              _delay_ms(350);                         //intrerupe programul 350 ms
148          }
149  
150          if(bit_is_clear(PINC,4) && NrDeLitri==54)//daca butonul scade este apasat si numarul de litri este 54
151          {
152              NrDeLitri = NrDeLitri - 51;//  scade 51 de unitati din nr de litri
153              eeprom_busy_wait();
154              eeprom_update_byte(&memorie, NrDeLitri); //scrie in memorie noua valoare
155              _delay_ms(350);
156  
157          }
158  
159          if (NrDeLitri>0) // daca numarul de litri este mai mare decat 0
160          {
161              LCDGotoXY(03,0);//  muta cursorul pe display in pozitia 3 (din 16) pe randul 0
162              LCDWriteString("Mai sunt ");//scrie incepand din pozitia actuala a cursorului caracterele dintre ghilimele
163              LCDWriteInt(NrDeLitri,3);// scrie in pozitia in care se afla cursorul valoarea actuala a numarului de
164                                       //litri ,format din trei cifre
165              LCDGotoXY(0,1);// muta cursorul in pozitia 0 de pe randul 1
166              LCDWriteString("litri de lapte "); // scrie incepand din pozitia actuala a cursorului caracterele dintre ghilimele
167  
168          }
169          else if (NrDeLitri==0)  // daca numarul de litri este zero , afiseaza textul MU MAI ESTE LAPTE! in cicluri
170                                  //de 1,5 secunde si pauze de 0,5 secunde
171          {
172              LCDGotoXY(0,0);
173              LCDWriteString("   NU MAI ESTE  ");
174              LCDGotoXY(0,1);
175              LCDWriteString("     LAPTE!     ");
176              _delay_ms(1500);
177              LCDGotoXY(0,0);
178              LCDWriteString("                ");
179              LCDGotoXY(0,1);
180              LCDWriteString("                ");
181              _delay_ms(500);
182  
183          }
184  
185          Wait();
186          Wait();
187      }
188  
189  }
190  
191  ISR(INT0_vect)
192  {
193  
194      NrDePulsuri++; // la fiecare trecere din 5v in 0v pe pinul INT0 (intreruperi externe) aduna o unitate la variabila NrDePulsuri
195  }