کد:
// Lcd pinout settings
sbit LCD_RS at RB3_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB3_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;
/////////
char txt_1[4],txt_2[4],txt_3[4],txt_4[4];
char i2c_txt[4];
unsigned short tst[4];
////////
unsigned char rtc_read(unsigned char address);
void rtc_write(unsigned char address,unsigned char _data);
void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out);
void rtc_get_time(unsigned char *hur,unsigned char *min,unsigned char *sec);
void rtc_set_time(unsigned char hur,unsigned char min,unsigned char sec);
void rtc_get_date(unsigned char *date,unsigned char *month,unsigned char *year);
void rtc_set_date(unsigned char date,unsigned char month,unsigned char year);
////
void main() {
PORTA=LATA=0x00;
PORTB=LATB=0x00;
PORTC=LATC=0x00;
ADCON1=0x0f;
TRISA=0xa7;
TRISB=0x00;
TRISC=0x87;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
///
I2C1_Init(100000);
while (!I2C1_Is_Idle());
rtc_init(0,0,0);
hour=12;
minute=1;
seconde=1;
rtc_set_time(hour,minute,seconde);
while(1){
Lcd_Chr(1, 1, (hour/10+48));
Lcd_Chr(1, 2, (hour%10+48));
Lcd_Out(1, 3, ":");
Lcd_Chr(1, 4, (minute/10+48));
Lcd_Chr(1, 5, (minute%10+48));
Lcd_Out(1, 6, ":");
Lcd_Chr(1, 7, (seconde/10+48));
Lcd_Chr(1, 8, (seconde%10+48));
rtc_get_time(&hour,&minute,&seconde);
delay_ms(500);
}
}
unsigned char rtc_read(unsigned char address)
{
unsigned char _data;
i2c1_start();
I2C1_Repeated_Start();
i2c1_wr(0xd0);
i2c1_wr(address);
i2c1_start();
i2c1_wr(0xd1);
_data=I2C1_Rd(0);
i2c1_stop();
return _data;
}
//
void rtc_write(unsigned char address,unsigned char _data)
{
i2c1_start();
I2C1_Repeated_Start();
i2c1_wr(0xd0);
i2c1_wr(address);
i2c1_wr(_data);
i2c1_stop();
}
void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out)
{
rs&=3;
if (sqwe) rs|=0x10;
if (out) rs|=0x80;
i2c1_start();
i2c1_wr(0xd0);
i2c1_wr(7);
i2c1_wr(rs);
i2c1_stop();
}
void rtc_get_time(unsigned char *hur,unsigned char *min,unsigned char *sec)
{
I2c1_start();
I2c1_wr(0xd0);
I2c1_wr(0);
I2C1_Repeated_Start();
I2c1_wr(0xd1);
*sec=Bcd2Dec(I2C1_Rd(1));
*min=Bcd2Dec(I2C1_Rd(1));
*hur=Bcd2Dec(I2C1_Rd(0));
while (!I2C1_Is_Idle());
I2c1_stop();
}
void rtc_set_time(unsigned char hur,unsigned char min,unsigned char sec)
{
I2c1_start();
I2C1_Repeated_Start();
I2c1_wr(0xd0);
I2c1_wr(0x00);
I2c1_wr(sec);
I2c1_wr(Dec2Bcd(min));
I2c1_wr(Dec2Bcd(hur));
while (!I2C1_Is_Idle());
I2c1_stop();
}
void rtc_get_date(unsigned char *date,unsigned char *month,unsigned char *year)
{
i2c1_start();
I2C1_Repeated_Start();
i2c1_wr(0xd0);
i2c1_wr(4);
i2c1_start();
i2c1_wr(0xd1);
*date=Bcd2Dec(I2C1_Rd(1));
*month=Bcd2Dec(I2C1_Rd(1));
*year=Bcd2Dec(I2C1_Rd(0));
i2c1_stop();
}
void rtc_set_date(unsigned char date,unsigned char month,unsigned char year)
{
i2c1_start();
I2C1_Repeated_Start();
i2c1_wr(0xd0);
i2c1_wr(4);
i2c1_wr(Bcd2Dec(date));
i2c1_wr(Bcd2Dec(month));
i2c1_wr(Bcd2Dec(year));
i2c1_stop();
}