반응형
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | #define DS1302_SEC 0x80 #define DS1302_MIN 0x82 #define DS1302_HOUR 0x84 #define DS1302_DATE 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8c #define RTC_RST 0x40 #define RTC_SDA_WR 0x20 #define RTC_SCL 0x10 #define RTC_SDA_RD 0x20 // PINE.3 #define RTC_SDA_DDR 0x20 // DDRE.3 unsigned char Modif_Year = 0; unsigned char Modif_Mon = 0; unsigned char Modif_Day = 0; unsigned char Modif_Hour = 0; unsigned char Modif_Min = 0; unsigned char Modif_Sec = 0; void write_ds1302(unsigned char addr, unsigned char data) { unsigned char i; PORTB &= ~RTC_SCL; // RTC_SCL = 0; PORTB |= RTC_RST; // RTC_RST = 1; _delay_us(2); for(i = 0; i < 8; i++) { if((addr >> i) & 1) PORTB |= RTC_SDA_WR; // RTC_SDA_WR = 1; else PORTB &= ~RTC_SDA_WR; // RTC_SDA_WR = 0; _delay_us(2); PORTB |= RTC_SCL; // RTC_SCL = 1; _delay_us(1); PORTB &= ~RTC_SCL; // RTC_SCL = 0; _delay_us(1); } for(i = 0; i < 8; i++) { if((data >> i) & 0x01) PORTB |= RTC_SDA_WR; // RTC_SDA_WR = 1; else PORTB &= ~RTC_SDA_WR; // RTC_SDA_WR = 0; _delay_us(2); PORTB |= RTC_SCL; // RTC_SCL = 1; _delay_us(1); PORTB &= ~RTC_SCL; // RTC_SCL = 0; _delay_us(1); } PORTB &= ~RTC_RST; // RTC_RST = 0; } unsigned char read_ds1302(unsigned char addr) { unsigned char i, data = 0; PORTB |= RTC_RST; // RTC_RST = 1; _delay_us(2); //write for(i = 0; i < 8; i++) { if((addr >> i) & 1) PORTB |= RTC_SDA_WR; // RTC_SDA_WR = 1; else PORTB &= ~RTC_SDA_WR; // RTC_SDA_WR=0; _delay_us(2); PORTB |= RTC_SCL; // RTC_SCL = 1; _delay_us(1); PORTB &= ~RTC_SCL; // RTC_SCL = 0; _delay_us(1); } // read DDRB &= ~RTC_SDA_DDR; // RTC_SDA_DDR = 0; for(i = 0; i < 8; i++) { data >>= 1; if(PINB & RTC_SDA_DDR) data |= 0x80; _delay_us(1); PORTB |= RTC_SCL; // RTC_SCL = 1; _delay_us(2); PORTB &= ~RTC_SCL; // RTC_SCL = 0; _delay_us(1); } DDRB |= RTC_SDA_DDR; // RTC_SDA_DDR = 1; PORTB &= ~RTC_SCL; // RTC_SCL = 0; _delay_us(1); PORTB &= ~RTC_RST; // RTC_RST = 0; return data; } void Init_ds1302(void) { write_ds1302(0x8E, 0); write_ds1302(0x90, 0xA4); } unsigned char DEC_to_BCD(unsigned char data) { data = ((data / 10) << 4) + (data % 10); return data; } void load_time(void) { Modif_Year = read_ds1302(DS1302_YEAR + 1); Modif_Mon = read_ds1302(DS1302_MONTH + 1); Modif_Day = read_ds1302(DS1302_DATE + 1); Modif_Hour = read_ds1302(DS1302_HOUR + 1); Modif_Min = read_ds1302(DS1302_MIN + 1); Modif_Sec = read_ds1302(DS1302_SEC + 1); Modif_Year = ((Modif_Year & 0xF0) >> 4) * 10 + (Modif_Year & 0x0F); Modif_Mon = ((Modif_Mon & 0x10) >> 4) * 10 + (Modif_Mon & 0x0F); Modif_Day = ((Modif_Day & 0x30) >> 4) * 10 + (Modif_Day & 0x0F); Modif_Hour = ((Modif_Hour & 0x70) >> 4) * 10 + (Modif_Hour & 0x0F); Modif_Min = ((Modif_Min & 0x70) >> 4) * 10 + (Modif_Min & 0x0F); Modif_Sec = ((Modif_Sec & 0x70) >> 4) * 10 + (Modif_Sec & 0x0F); // printf("YEAR, MONTH, DATE -> %d, %d, %d\r\n", Modif_Year, Modif_Mon, Modif_Day); // printf("HOUR, MIN, SEC -> %d, %d, %d\r\n\r\n", Modif_Hour, Modif_Min, Modif_Sec); } void save_time(void) { write_ds1302(DS1302_YEAR, DEC_to_BCD(Modif_Year)); write_ds1302(DS1302_MONTH, DEC_to_BCD(Modif_Mon)); write_ds1302(DS1302_DATE, DEC_to_BCD(Modif_Day)); write_ds1302(DS1302_HOUR, DEC_to_BCD(Modif_Hour)); write_ds1302(DS1302_MIN, DEC_to_BCD(Modif_Min)); write_ds1302(DS1302_SEC, DEC_to_BCD(Modif_Sec)); } | cs |
반응형
'마이컴 & 프로테우스 VSM > ATmega128' 카테고리의 다른 글
- [AVR Studio4] ADC 10비트 (1) | 2018.12.26 |
---|---|
- [Codevision] DS1302 ("ds1302.h" 사용) (0) | 2016.04.12 |
- [Codevision] 캐릭터 LCD 8비트 제어 (0) | 2016.04.07 |
- [Codevision] 그래픽 LCD ("KS0108" 128 x 64) (4) | 2016.04.04 |
- [Codevision] 그래픽 LCD ("T6963C" 240 x 128) (0) | 2016.03.29 |