kuroの覚え書き

96の個人的覚え書き

I2C RTC LCD



// +---- ----+
// |o1 8o|=> 5V
// |o2 7o|
// |o3 6o|=> SDA => Arduino A4
// GND <=|o4 5o|=> SCL => Arduino A5
// +---------+
// RTC8564NB

#include <LiquidCrystal.h>
#include <Wire.h>

int RTC = 0xA2 >> 1;
byte rbuf[7];

// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4, d5, d6, d7 on pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

void setup()
{
Wire.begin();
Serial.begin(9600);
lcd.clear();
}

void loop()
{
ReadRTC();
DispLCD();
if(Serial.available() > 0)
{
byte recv = Serial.read();
byte param[20];
int count = 0;
switch(recv)
{
case 'R':
WriteSerial();
break;
case 'W':
while(count < 14)
{
if(Serial.available() > 0)
param[count++] = Serial.read() & 0x0F;
}
WriteRTC(param);
break;
default:
break;
}
}
}

void ReadRTC()
{
Wire.beginTransmission(RTC);
Wire.send(0x02);
Wire.endTransmission();
Wire.requestFrom(RTC, 7);
for(int i = 0; i < 7; i++)
{
if(Wire.available())
{
rbuf[i] = Wire.receive();
}
}
}

void DispLCD()
{
lcd.home();
lcd.print("20");
OutLCD(rbuf[6] & 0x3F);
lcd.print("/");
OutLCD(rbuf[5] & 0x1F);
lcd.print("/");
OutLCD(rbuf[3] & 0x3F);
lcd.setCursor(2, 1);
OutLCD(rbuf[2] & 0x3F);
lcd.print(":");
OutLCD(rbuf[1] & 0x7F);
lcd.print(":");
OutLCD(rbuf[0] & 0x7F);
}

void OutLCD(byte d)
{
if(d < 16)
lcd.print("0");
lcd.print(d, HEX);
}

void WriteSerial()
{
Serial.print((rbuf[6] & 0x3F) + 2000);
Serial.print("/");
Out(rbuf[5] & 0x1F);
Serial.print("/");
Out(rbuf[3] & 0x3F);
Serial.print(" ");
Out(rbuf[2] & 0x3F);
Serial.print(":");
Out(rbuf[1] & 0x7F);
Serial.print(":");
Out(rbuf[0] & 0x7F);
Serial.println("");
}

void Out(byte d)
{
if(d < 16)
Serial.print("0");
Serial.print(d, HEX);
}

void WriteRTC(byte *param)
{
byte sbuf[7];
sbuf[6] = param[2] << 4 | param[3];
sbuf[5] = param[4] << 4 | param[5] | 0x80;
sbuf[4] = 0;
sbuf[3] = param[6] << 4 | param[7];
sbuf[2] = param[8] << 4 | param[9];
sbuf[1] = param[10] << 4 | param[11];
sbuf[0] = param[12] << 4 | param[13];
Wire.beginTransmission(RTC);
Wire.send(0x02);
Wire.send(sbuf, 7);
Wire.endTransmission();
}

時計の設定は

シリアル(9600)で

W20090702123456

というふうに。