Тема: attiny13
Основная статья - http://rcl-radio.ru/?p=98729
ЧАСЫ DS1307 + TM1637
#define SDA 3 // PB3
#define SCL 4 // PB4
#define CLK 0 // PB0
#define DIO 1 // PB1
void setup() {
//set_time(13,45,0);// час 0-23, минуты 0-59, секунды 0-59
}
void loop() {
byte min = (ds_read(1) & 0x0F) + (((ds_read(1) & 0x70) >> 4) * 10);
byte hour = (ds_read(2) & 0x0F) + (((ds_read(2) & 0x70) >> 4) * 10);
print_time(hour *100 + min,0,7);
delay(500);
print_time(hour *100 + min,2,7);
delay(500);
}
void tm_dec(byte dig){
for(int i = 0; i < 8; i++) {
DDRB |= (1 << CLK);del();
if (dig & 0x01)
DDRB &= ~(1 << DIO);
else
DDRB |= (1 << DIO);del();
DDRB &= ~(1 << CLK);del();
dig = dig >> 1;
}
DDRB |= (1 << CLK);
DDRB &= ~(1 << DIO);del();
DDRB &= ~(1 << CLK);del();
if (((PINB >> DIO) & 1) == 0)
DDRB |= (1 << DIO);del();
DDRB |= (1 << CLK);del();
}
void tm_stop(){
DDRB |= (1 << DIO);del();
DDRB &= ~(1 << CLK);del();
DDRB &= ~(1 << DIO);del();
}
void tm_start(){
DDRB |= (1 << DIO);del();
}
void print_time(int t, byte pd_t, int br){
tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start();
tm_dec(0x40);tm_stop();tm_start();
int data0 = t / 1000;
int data1 = t / 100 % 10;
int data2 = t / 10 % 10;
int data3 = t % 10;
for(byte n = 0; n < 4; n++){
int data;
switch(n){
case 0: data = data0;break;
case 1: data = data1;break;
case 2: data = data2;break;
case 3: data = data3;break;
}
switch(data){ // XGFEDCBA
case 0: data = 0b00111111;break; // 0
case 1: data = 0b00000110;break; // 1
case 2: data = 0b01011011;break; // 2
case 3: data = 0b01001111;break; // 3
case 4: data = 0b01100110;break; // 4
case 5: data = 0b01101101;break; // 5
case 6: data = 0b01111101;break; // 6
case 7: data = 0b00000111;break; // 7
case 8: data = 0b01111111;break; // 8
case 9: data = 0b01101111;break; // 9
case 10: data = 0b00000000;break; // пусто
case 11: data = 0b01000000;break; // -
}
if(n == 0){data0 = data;}
if(n == 1){data1 = data;}
if(n == 2){data2 = data;}
if(n == 3){data3 = data;}
}
if(pd_t==2){data1 = data1+0b10000000;}
tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}
void del(){delayMicroseconds(200);}
bool i2c_read_bit() {
bool i2c_bit = 1;
DDRB &= ~(1 << SDA);
delayMicroseconds(10);
DDRB &= ~(1 << SCL);
if((PINB >> SDA) & 1) i2c_bit=0;
delayMicroseconds(10);
DDRB |= (1 << SCL);
return i2c_bit;
}
byte i2c_write_byte(byte data){
for (byte i=0; i<8; i++){i2c_write_bit((data&0x80)==0);data<<=1;}
return i2c_read_bit();
}
byte i2c_read_byte(byte a){
byte i, data=0;
for(i=0; i<8; i++){if (!i2c_read_bit()) data++;if(i!=7) data<<=1;}
i2c_write_bit(a);return data;
}
void i2c_write_bit(byte b){
delayMicroseconds(5);
if(b){DDRB |= (1 << SDA);}else{DDRB &= ~(1 << SDA);}
delayMicroseconds(5);
DDRB &= ~(1 << SCL);
delayMicroseconds(10);
DDRB |= (1 << SCL);
}
void i2c_start(){
delayMicroseconds(10);
DDRB &= ~(1 << SDA); DDRB &= ~(1 << SCL);
delayMicroseconds(10);
DDRB |= (1 << SDA); PORTB &= ~(1 << SDA);
delayMicroseconds(10);
DDRB |= (1 << SCL); PORTB &= ~(1 << SCL);
delayMicroseconds(10);
}
void i2c_stop() {
DDRB |= (1 << SDA);
delayMicroseconds(10);
DDRB &= ~(1 << SCL);
delayMicroseconds(10);
DDRB &= ~(1 << SDA);
}
byte ds_read(byte reg){
byte data = 0;
i2c_start();
i2c_write_byte(0b11010000);
i2c_write_byte(reg);
i2c_start();
i2c_write_byte(0b11010001);
data = i2c_read_byte(0);
i2c_stop();
return data;
}
void ds_write(byte reg, byte data){
i2c_start();
i2c_write_byte(0b11010000);
i2c_write_byte(reg);
i2c_write_byte(data);
i2c_stop();
}
void set_time(byte hours ,byte minute, byte second){
ds_write(0x00,(second/10<<4)+second%10);
ds_write(0x01,(minute/10<<4)+minute%10);
ds_write(0x02,(hours/10<<4)+hours%10);
}
Скетч использует 938 байт (91%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 0 байт (0%) динамической памяти, оставляя 64 байт для локальных переменных. Максимум: 64 байт.