Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define F_CPU 8000000UL
- #include <avr/pgmspace.h>
- #include <stdint.h>
- #include <avr/interrupt.h>
- #include <avr/io.h>
- #include <util/delay.h>
- #define SW1 (1<<PD7)
- #define SW2 (1<<PD6)
- #define SW3 (1<<PD5)
- #define C_DS1307Readtryb_U8 0xD1u
- #define C_DS1307Writetryb_U8 0xD0u
- #define WS_OUT PORTB
- #define WS_IN PINB
- #define WS_DDR DDRB
- #define WS_BIT_CLK _BV(PB0)
- #define WS_BIT_DAT _BV(PB1)
- #define WS_PRAWY 0x01
- #define WS_LEWY 0x00
- #define wyswietlacz_cyfry 4
- #define WS_CLK_LOW() (WS_OUT &= ~WS_BIT_CLK)
- #define WS_CLK_HIGH() (WS_OUT |= WS_BIT_CLK)
- #define WS_DAT_LOW() (WS_OUT &= ~WS_BIT_DAT)
- #define WS_DAT_HIGH() (WS_OUT |= WS_BIT_DAT)
- #define WS_CLK_FLOAT()
- #define WS_DATA_CMD 0x40
- #define WS_WYSW_CTRL 0x80
- #define WS_adres_CMD 0xC0
- #define WS_WRITE_WYSW 0x00
- #define WS_READ_KEYS 0x02
- #define WS_FIXED_adres 0x04
- #define WS_WYSW_PWM_MASK 0x07
- #define WS_WYSW_ENABLE 0x08
- #define DELAY_US 1
- uint8_t kropka;
- uint8_t tryb;
- PROGMEM const uint8_t WS_cyfry[] =
- {
- 0x3F, // 0
- 0x06, // 1
- 0x5B, // 2
- 0x4F, // 3
- 0x66, // 4
- 0x6D, // 5
- 0x7D, // 6
- 0x07, // 7
- 0x7F, // 8
- 0x6F, // 9
- };
- class komunikacja
- {
- public:
- void Init(uint32_t speed);
- void Start();
- void Stop();
- void adresess(uint8_t data);
- void Write(uint8_t data);
- uint8_t ReadACK();
- uint8_t ReadNACK();
- private:
- uint8_t data;
- uint8_t speed;
- };
- class wyswietlacz
- {
- public:
- wyswietlacz();
- void kasuj();
- void wyswietlBajt(const uint8_t polozenie, const uint8_t b);
- void wyswietlCyfre(const uint8_t polozenie, const uint8_t cyfra);
- void wyswietlCyfry(uint32_t liczba, uint8_t przesuniecie = wyswietlacz_cyfry-1, const uint8_t rownanie = WS_PRAWY);
- void ustawJasnosc(const uint8_t jasnosc);
- protected:
- uint8_t _dotMask;
- uint8_t polozenie;
- uint8_t b;
- uint8_t cyfra;
- uint8_t rownanie;
- uint8_t jasnosc;
- uint8_t liczba;
- };
- class temperatura
- {
- public:
- void odczyt(const uint8_t o);
- private:
- float tempr;
- uint8_t read;
- };
- class zegar
- {
- public:
- uint8_t sekundy;
- uint8_t minuty;
- uint8_t godziny;
- uint8_t dTygodnia;
- uint8_t dzien;
- uint8_t miesiac;
- uint8_t rok;
- };
- class mzegar
- : public zegar
- {
- typedef zegar czasBDC;
- typedef zegar czasDEC;
- public:
- uint8_t DECnaBCD(uint8_t data);
- czasBDC DECnaBCD(czasDEC data);
- uint8_t BCDnaDEC(uint8_t data);
- czasDEC BCDnaDEC(czasBDC data);
- void rtcUstawCzasBDC(czasBDC data);
- void rtcUstawCzasDEC(czasDEC data);
- czasBDC rtcPobierzCzasBDC();
- czasDEC rtcPobierzCzasDEC();
- };
- zegar teraz;
- zegar bufor;
- #define ustaw(reg, num) ((reg) |= (1 << (num)))
- #define clear(reg, num) ((reg) &= ~(1 << (num)))
- namespace
- {
- void port_setup()
- {
- WS_DDR |= WS_BIT_CLK | WS_BIT_DAT;
- WS_OUT |= WS_BIT_CLK;
- }
- void start()
- {
- WS_CLK_HIGH();
- WS_DAT_HIGH();
- _delay_us(DELAY_US);
- WS_DAT_LOW();
- _delay_us(DELAY_US);
- }
- void stop()
- {
- WS_CLK_LOW();
- _delay_us(DELAY_US);
- WS_CLK_HIGH();
- WS_DAT_LOW();
- _delay_us(DELAY_US);
- WS_DAT_HIGH();
- }
- void wyslij(uint8_t b)
- {
- for (uint8_t i = 8; i; --i, b >>= 1)
- {
- WS_CLK_LOW();
- if (b & 1)
- WS_DAT_HIGH();
- else
- WS_DAT_LOW();
- _delay_us(DELAY_US);
- WS_CLK_HIGH();
- _delay_us(DELAY_US);
- }
- WS_CLK_LOW();
- WS_DAT_LOW();
- _delay_us(DELAY_US);
- WS_CLK_HIGH();
- _delay_us(DELAY_US);
- }
- void wyslij_cmd(const uint8_t cmd)
- {
- start();
- wyslij(cmd);
- stop();
- }
- void wyslij_data(const uint8_t adres, const uint8_t data)
- {
- wyslij_cmd(WS_DATA_CMD | WS_FIXED_adres);
- start();
- wyslij(WS_adres_CMD | adres);
- wyslij(data);
- stop();
- _delay_us(DELAY_US);
- }
- uint8_t przesuniecie_cyfry(uint32_t num)
- {
- uint8_t cyfry = 0;
- while (num >= 10)
- {
- num /= 10;
- ++cyfry;
- }
- return cyfry;
- }
- }
- wyswietlacz::wyswietlacz()
- : _dotMask(0)
- {
- port_setup();
- wyslij_cmd(WS_DATA_CMD | WS_WRITE_WYSW);
- wyslij_cmd(WS_WYSW_CTRL | WS_WYSW_ENABLE | WS_WYSW_PWM_MASK);
- kasuj();
- }
- void wyswietlacz::kasuj()
- {
- for (uint8_t a = 0; a != wyswietlacz_cyfry; ++a)
- wyslij_data(a, 0x00);
- }
- void wyswietlacz::wyswietlBajt(const uint8_t polozenie, const uint8_t b)
- {
- wyslij_data(polozenie, b | (_dotMask & (1 << polozenie)));
- }
- void wyswietlacz::wyswietlCyfre(const uint8_t polozenie, const uint8_t cyfra) {
- if (polozenie == 1 and kropka){
- uint8_t x = pgm_read_byte(&WS_cyfry[cyfra & 0xF]);
- wyswietlBajt(polozenie, x | 0x80);
- }
- else {
- wyswietlBajt(polozenie, pgm_read_byte(&WS_cyfry[cyfra & 0xF]));
- }
- }
- void wyswietlacz::wyswietlCyfry(uint32_t liczba, uint8_t przesuniecie, const uint8_t rownanie)
- {
- if (rownanie == WS_LEWY)
- przesuniecie += przesuniecie_cyfry(liczba);
- while (liczba && przesuniecie != 0xFF)
- {
- wyswietlCyfre(przesuniecie--, liczba % 10 );
- liczba /= 10;
- }
- }
- void wyswietlacz::ustawJasnosc(const uint8_t jasnosc)
- {
- wyslij_cmd(WS_WYSW_CTRL | WS_WYSW_ENABLE | (jasnosc & WS_WYSW_PWM_MASK));
- }
- wyswietlacz wysw;
- void komunikacja::Init(uint32_t speed)
- {
- TWCR = (1<<TWEA) | (1<<TWEN);
- uint8_t prescaler = 0;
- speed = (F_CPU/speed/100-16)/2;
- while(speed > 255)
- {
- prescaler++;
- speed=speed/4;
- }
- TWSR = (TWSR & ((1<<TWPS1) | (1<<TWPS0))) | prescaler;
- TWBR = speed;
- }
- void komunikacja::Start()
- {
- TWCR = (1<<TWINT)|(1<<TWSTA)| (1<<TWEN);
- while (!(TWCR & (1<<TWINT)));
- }
- void komunikacja::Stop()
- {
- TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
- while(TWCR & (1<<TWSTO));
- }
- void komunikacja::adresess(uint8_t data)
- {
- TWDR = data;
- TWCR = (1<<TWINT) | (1<<TWEN);
- while (!(TWCR & (1<<TWINT)));
- }
- void komunikacja::Write(uint8_t data)
- {
- TWDR = data;
- TWCR = (1<<TWINT) | (1<<TWEN);
- while (!(TWCR & (1<<TWINT)));
- }
- uint8_t komunikacja::ReadACK()
- {
- TWCR = (1<<TWEA) | (1<<TWINT) | (1<<TWEN);
- while (!(TWCR & (1<<TWINT)));
- return TWDR;
- }
- uint8_t komunikacja::ReadNACK()
- {
- TWCR = (1<<TWINT) | (1<<TWEN);
- while (!(TWCR & (1<<TWINT)));
- return TWDR;
- }
- komunikacja twi;
- typedef zegar czasBDC;
- typedef zegar czasDEC;
- uint8_t mzegar::DECnaBCD(uint8_t data)
- {
- uint8_t wynik;
- wynik = (data / 10) << 4;
- wynik += (data % 10);
- return wynik;
- }
- czasBDC mzegar::DECnaBCD(czasDEC data)
- {
- czasBDC wynik;
- wynik.sekundy = DECnaBCD(data.sekundy);
- wynik.minuty = DECnaBCD(data.minuty);
- wynik.godziny = DECnaBCD(data.godziny);
- wynik.dTygodnia = DECnaBCD(data.dTygodnia);
- wynik.dzien = DECnaBCD(data.dzien);
- wynik.miesiac = DECnaBCD(data.miesiac);
- wynik.rok = DECnaBCD(data.rok);
- return wynik;
- }
- uint8_t mzegar::BCDnaDEC(uint8_t data)
- {
- uint8_t wynik;
- wynik = data & 0x0f;
- wynik += ((data >> 4)) * 10;
- return wynik;
- }
- czasDEC mzegar::BCDnaDEC(czasBDC data)
- {
- czasDEC wynik;
- wynik.sekundy = BCDnaDEC(data.sekundy);
- wynik.minuty = BCDnaDEC(data.minuty);
- wynik.godziny = BCDnaDEC(data.godziny);
- wynik.dTygodnia = BCDnaDEC(data.dTygodnia);
- wynik.dzien = BCDnaDEC(data.dzien);
- wynik.miesiac = BCDnaDEC(data.miesiac);
- wynik.rok = BCDnaDEC(data.rok);
- return wynik;
- }
- void mzegar::rtcUstawCzasBDC(czasBDC data)
- {
- twi.Start();
- twi.adresess(208);
- twi.Write(0);
- twi.Write(data.sekundy);
- twi.Write(data.minuty);
- twi.Write(data.godziny);
- twi.Write(data.dTygodnia);
- twi.Write(data.dzien);
- twi.Write(data.miesiac);
- twi.Write(data.rok);
- twi.Stop();
- }
- void mzegar::rtcUstawCzasDEC(czasDEC data)
- {
- rtcUstawCzasBDC(DECnaBCD(data));
- }
- czasBDC mzegar::rtcPobierzCzasBDC()
- {
- czasBDC data;
- twi.Start();
- twi.adresess(208);
- twi.Write(0);
- twi.Start();
- twi.adresess(209);
- data.sekundy = twi.ReadACK();
- data.minuty = twi.ReadACK();
- data.godziny = twi.ReadACK();
- data.dTygodnia = twi.ReadACK();
- data.dzien = twi.ReadACK();
- data.miesiac = twi.ReadACK();
- data.rok = twi.ReadNACK();
- twi.Stop();
- return data;
- }
- czasDEC mzegar::rtcPobierzCzasDEC()
- {
- return BCDnaDEC(rtcPobierzCzasBDC());
- }
- mzegar mzegar;
- void rtcInit()
- {
- twi.Init(400000);
- twi.Start();
- twi.adresess(208);
- twi.Write(7);
- twi.Write(0b00010000);
- twi.Stop();
- ustaw(PORTD, PD2);
- EICRA |= (1 << ISC00) | (1 << ISC01);
- EIMSK |= (1 << INT0);
- }
- void ustawtryb(){
- if(!(PIND & SW1) && ((tryb==4) || (tryb==6) || (tryb==8) || (tryb==10))){
- tryb=1;}
- if((PIND & SW1) && (tryb==1)){
- tryb=2;}
- if(!(PIND & SW2) && ((tryb==2) || (tryb==6) || (tryb==8) || (tryb==10))){
- tryb=3;}
- if((PIND & SW2) && (tryb==3)){
- tryb=4;}
- if(!(PIND & SW3) && ((tryb==4) || (tryb==2) || (tryb==8) || (tryb==10))){
- tryb=5;}
- if((PIND & SW3) && (tryb==5)){
- tryb=6;}
- if(!(PIND & SW1) && (tryb==2)){
- tryb=7;}
- if((PIND & SW1) && (tryb==7)){
- tryb=8;}
- if(!(PIND & SW2) && (tryb==4)){
- tryb=9;}
- if((PIND & SW2) && (tryb==9)){
- tryb=10;}
- }
- void czas(){
- bufor = mzegar.rtcPobierzCzasDEC();
- if(bufor.sekundy%2 == 0){
- kropka=1;}
- else{kropka = 0;};
- wysw.wyswietlCyfry(bufor.godziny,1);
- wysw.wyswietlCyfry(bufor.minuty,3);
- if(bufor.godziny <=9){
- wysw.wyswietlCyfre(0,0);};
- if(bufor.godziny == 0){
- wysw.wyswietlCyfre(1,0);};
- if(bufor.minuty <=9){
- wysw.wyswietlCyfre(2,0);};
- if(bufor.minuty == 0){
- wysw.wyswietlCyfre(3,0);};
- };
- void dzien(){
- bufor = mzegar.rtcPobierzCzasDEC();
- kropka=1;
- wysw.wyswietlCyfry(bufor.dzien + 3,1);
- wysw.wyswietlCyfry(bufor.miesiac,3);
- if(bufor.dzien <=9){
- wysw.wyswietlCyfre(0,0);};
- if(bufor.dzien == 0){
- wysw.wyswietlCyfre(1,0);};
- if(bufor.miesiac <=9){
- wysw.wyswietlCyfre(2,0);};
- if(bufor.miesiac == 0){
- wysw.wyswietlCyfre(3,0);}
- ;};
- void InitADC()
- {
- ADMUX |= (1<<REFS0)|(1<<REFS1) ;
- ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADEN);
- }
- uint16_t odczytADC(uint8_t wejscie)
- {
- ADMUX = (ADMUX & 0xF0) | (wejscie & 0x0F);
- ADCSRA |= (1<<ADSC);
- while( ADCSRA & (1<<ADSC) );
- return ADC;
- }
- void temperatura::odczyt(const uint8_t o){
- kropka = 0;
- tempr = odczytADC(o);
- tempr = tempr / 1024;
- tempr = tempr - 0.5;
- tempr = tempr*111;
- wysw.wyswietlCyfry(tempr,0,WS_LEWY);
- wysw.wyswietlBajt(2,0b1100011);
- if (o == 0) wysw.wyswietlBajt(3,0b1000000);
- if (o == 1) wysw.wyswietlBajt(3,0b0000001);
- _delay_ms(200);
- };
- int main(){
- temperatura temp;
- sei();
- rtcInit();
- /* WGRYWANIE DATY
- teraz.sekundy = x ; 0-60
- teraz.minuty = x ; 0-60
- teraz.godziny = x ; 0-24
- teraz.dTygodnia=x ; // Dzien tygodnia w formacie pon = 1, wt = 2...
- teraz.dzien = x ; 1-31
- teraz.miesiac = x; 1-12
- teraz.rok = x; //00-99
- rtc.rtcUstawCzasDEC(teraz);
- */
- InitADC();
- uint8_t ujasnosc = 1;
- wysw.ustawJasnosc(ujasnosc);
- float napiecie;
- tryb=2;
- while(1){
- ustawtryb();
- switch(tryb)
- {
- case 2:
- czas();
- if (bufor.godziny > 9 and bufor.godziny < 18){
- wysw.ustawJasnosc(7);}
- else {wysw.ustawJasnosc(1);}
- break;
- case 8:
- dzien();
- break;
- case 4:
- temp.odczyt(0);
- break;
- case 10:
- temp.odczyt(1);
- break;
- case 6:
- kropka = 1;
- napiecie = odczytADC(3);
- napiecie = napiecie * 167.6;
- napiecie = napiecie/1024;
- if (napiecie > 5){
- wysw.wyswietlCyfry(napiecie,0,WS_LEWY);}
- else wysw.kasuj();
- _delay_us(200);
- break;
- default:
- wysw.kasuj();
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement