#define DQ0 2 #define CE 10 #define _G 11 #define _W 12 void set_addr(byte addr) { byte i; for (i = 0; i <= 2; ++i) { digitalWrite(A0 + i, addr >> i & 1); } } void set_byte(byte data) { byte i; for (i = 0; i <= 7; ++i) { digitalWrite(DQ0 + i, data >> i & 1); } } byte read_byte(byte addr) { byte data; byte i; for (i = 0; i <= 7; ++i) { pinMode(DQ0 + i, INPUT_PULLUP); } set_addr(addr); delayMicroseconds(1); digitalWrite(_G, 0); delayMicroseconds(1); data = 0; for (i = 0; i <= 7; ++i) { data += digitalRead(DQ0 + i) << i; } digitalWrite(_G, 1); delayMicroseconds(1); return data; } void write_byte(byte addr, byte data) { byte i; set_addr(addr); set_byte(data); for (i = 0; i <= 7; ++i) { pinMode(DQ0 + i, OUTPUT); } delayMicroseconds(1); digitalWrite(_W, 0); delayMicroseconds(1); digitalWrite(_W, 1); delayMicroseconds(1); } void setup() { Serial.begin(9600); digitalWrite(CE, 0); digitalWrite(_G, 1); digitalWrite(_W, 1); pinMode(_G, OUTPUT); pinMode(_W, OUTPUT); pinMode(CE, OUTPUT); for (byte i = 0; i <= 2; ++i) { pinMode(A0 + i, OUTPUT); } /* digitalWrite(CE, 1); delay(1); write_byte(0, 0); // Control /* По мануалу для уверенного первого запуска нужно все равно установить бит ST, а затем уже снять его write_byte(1, B10000000); // Стоп осциллятора write_byte(1, B00000000); // Запуск осциллятора write_byte(0, B10000000); //WRITE write_byte(1, B00001000); //Set 8 sec write_byte(2, 0x41); //Set 41 min write_byte(3, 0x10); //Set 10 h write_byte(4, 0x04); //Set 4 day write_byte(5, 0x22); //Set 22 date write_byte(6, 0x11); //Set 11 month write_byte(7, 0x23); //Set 23 year write_byte(0, 0); //No WRITE digitalWrite(CE, 0); /**/ } void loop() { digitalWrite(CE, 1); delay(1); write_byte(0, B01000000); // READ Serial.print(String(read_byte(0),HEX)+" 20"+String(read_byte(7),HEX)+"-"+String(read_byte(6),HEX)+"-"+String(read_byte(5),HEX)+" "); Serial.print(String(read_byte(3),HEX)+":"+String(read_byte(2),HEX)+":"+String(read_byte(1),HEX)); Serial.println(); write_byte(0, 0); //No READ digitalWrite(CE, 0); delay(1000); }