//-----------------------------------------------------------------------------
/* ATTINY2313
=========================
ATTINY ARDUINO ATTINY
PA0/XTAL1 || 5 - 3 9 - 12 || PB0/AIN0/PCINT0
PA1/XTAL2 || 4 - 2 10 - 13 || PB1/AIN1/PCINT1
PA2/RESET || 1 - 17 11 - 14 || PB2/OC0A/PCINT2
|| 12 - 15 || PB3/OC1A/PCINT3
PD0/RXD || 2 - 0 13 - 16 || PB4/OC1B/PCINT4
PD1/TXD || 3 - 1 14 - 17 || PB5/MOSI/DI/SDA/PCINT5
PD2/INT0/XCK/CKOUT || 6 - 4 15 - 18 || PB6/MISO/DO/PCINT6
PD3/INT1 || 7 - 5 16 - 19 || PB7/USCK/SCL/PCINT7
PD4/T0 || 8 - 6 ||
PD5/T1/OC0B || 9 - 7 ||
PD6/ICP || 11 - 8 ||
ATTINY ARDUINO ATTINY
=========================
ATTINY2313 */
//-----------------------------------------------------------------------------
int slaveSelect=14;//PB5
int din=6;//PD4
int clk=15;//PB6
uint8_t TimeBytes[] ={0x41,0x42,0x43,0x44,'E','\n','\r'};
byte Num[] ={126,48,109,121,51,91,95,112,127,123,119,31,78,61,79,71};
byte ds1302[] ={0,61,91,1,48,121,126,109};
uint8_t ReadBytes[8];
void setup() {
pinMode(clk, OUTPUT);//7 - 15 PB6 СИНИЙ
pinMode(din, OUTPUT);//6 - 6 PD4 ЗЕЛЕНЫЙ
pinMode(slaveSelect, OUTPUT);//5 - 14 PB5 ЖЕЛТЫЙ
sendCommand7219(12,1); //normal mode (default is shutdown mode)
sendCommand7219 (15,0); //Display test off
sendCommand7219 (10,6); //set medium intensity (range is 0-15)
sendCommand7219 (11, 7); //7219 digit scan limit command
sendCommand7219 (9, 0); //decode command, use standard 7-segment digits
sendCommand7219 (0x0C,0); //Display off
delay(100);
//УСТАНОВИТЬ ВРЕМЯ
sendCommand1302(0x86, 0x10);//день
sendCommand1302(0x88, 0x07);//месяц
sendCommand1302(0x8C, 0x19);//год
sendCommand1302(0x84, 0x12);//час
sendCommand1302(0x82, 0x25);//мин
sendCommand1302(0x80, 0x00);//сек
sendCommand1302(0x8A, 0x03);//день недели
for (int i = 0; i < 8; ++i)
{
sendCommand1302((i * 2) + 192, ds1302[i]);//запись 8 байт в RAM
}
delay(1000);
//чтение 8 байт из RAM
for (int i = 0; i < 8; ++i)
{
digitalWrite(slaveSelect,HIGH); //chip select is active HIGH
shiftOut(din, clk, LSBFIRST, (i * 2) + 193);
pinMode(din, INPUT);
ReadBytes[i]=readByte();
digitalWrite(slaveSelect,LOW);
pinMode(din, OUTPUT);
}
for (int i = 1; i < 9; ++i)
{
sendCommand7219 (i, ReadBytes[8-i]);
}
sendCommand7219 (0x0C,1); //Display on
delay(2000);
}
void loop() {
data1302();
ViewTime(8, TimeBytes[2]);//часы
sendCommand7219 (6, TimeBytes[0]&0x01);
ViewTime(5, TimeBytes[1]);//минуты
sendCommand7219 (3, !(TimeBytes[0]&0x01));
ViewTime(2, TimeBytes[0]);//секунды
delay(1000);
}
void sendCommand7219(byte cmd, byte data)
{
digitalWrite(slaveSelect, LOW); //chip select is active low
// передать старший байт
shiftOut(din, clk, MSBFIRST, cmd);
// передать младший байт
shiftOut(din, clk, MSBFIRST, data);
digitalWrite(slaveSelect,HIGH);
}
void sendCommand1302(byte cmd, byte data)
{
digitalWrite(slaveSelect,HIGH); //chip select is active HIGH
// передать старший байт
shiftOut(din, clk, LSBFIRST, cmd);
// передать младший байт
shiftOut(din, clk, LSBFIRST, data);
digitalWrite(slaveSelect,LOW);
}
void data1302()
{
//Команда clock burst read с кодом 0xBF считывает текущее состояние часов
//В ответ RTC посылают 7 байт, в которых хранятся соответственно
//секунды, минуты, часы, день, месяц, день недели, год, и кое-какие флаги
digitalWrite(slaveSelect,HIGH); //chip select is active HIGH
// передать байт
shiftOut(din, clk, LSBFIRST, 0xBF);
pinMode(din, INPUT);
for(int i = 0; i < 7; i++){
TimeBytes[i]=readByte();
}
digitalWrite(slaveSelect,LOW);
pinMode(din, OUTPUT);
}
uint8_t readByte()
{
uint8_t value = 0;
uint8_t currentBit = 0;
for (int i = 0; i < 8; ++i)
{
currentBit = digitalRead(din);
value |= (currentBit << i);
digitalWrite(clk, HIGH);
delayMicroseconds(1);
digitalWrite(clk, LOW);
}
return value;
}
void ViewTime(byte high_place, byte data)
{
sendCommand7219 (high_place, Num[(data & 0xF0) >> 4]);
sendCommand7219 (high_place-1, Num[data & 0x0F]);
}