반응형


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(0x8E0); 
    write_ds1302(0x900xA4);
}
 
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


반응형
Posted by 메가아재
,