IN CONTINUARE ESTE CODUL DIN ATMEGA8 SCRIS IN C++
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 }