На форуме я давно. Пишу, пожалуй, впервые.
Решил сделать часики ГРИ на Atmega16 + BU2090+ DS1307. В программировании не силен- только начинаю. Вот и первый мой стопор, сам пока разобраться не смог. Часы тикают, показывают время. Но нравится мне режим прокрутки цифр при их смене. Все никак не могу его осилить. прошу наставить на путь истинный. Ниже предоставляю мой код. буду очень признателен за совет по теме, да и за критику по поводу моего кода... Заранее всем большое человеческое
P.S. обманул, это второй мой пост, первый не помню)
Код: Выделить всё
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "TWI.h"
#include "ds1307.h"
#define DAT 0
#define CLK 1
#define POR PORTD
#define pif asm("nop");
struct Time Dio, set; //структура с переменными для часов
unsigned char counter = 0;
unsigned int num [] =
{0x01,0x200,0x100,0x80,0x40,0x20,0x10,0x08,0x04,0x02}; //массив чисел от 0 до 9
unsigned int dat[]= {0x00,0x00,0x00,0x00,0x00,0x00}; //массив динамической индикации
void init_timer (void)
{
TIMSK = (1<<TOIE0); //прерывание
TCCR0 = (0<<CS00)|(1<<CS01)|(0<<CS02); // prescaller = /1
}
void convert_hours (unsigned int hour) //раскладываем на десятки-единицы часы и пишем в массив
{
unsigned int te,r;
te = hour;
r = te/10;
dat[0] = num[r];
te = te-r*10;
dat[1] = num[te];
}
void convert_minutes (unsigned int minute) //пишем в массив минуты
{
unsigned int tem,re;
tem = minute;
re = tem/10;
dat[2] = num[re];
tem = tem-re*10;
dat[3] = num[tem];
}
void convert_seconds(unsigned int second) //пишем в массив секунды
{
unsigned int temp,res;
temp = second;
res = temp/10;
dat[4] = num[res];
temp = temp-res*10;
dat[5] = num[temp];
}
void send_data (unsigned int data) //работа с bu2090
{
for (int i=0; i<12; i++)
{
if ((data&0x800)==0x00)
{
POR&= ~(1<<CLK);
pif;
PORTD|=_BV(DAT);
pif;
POR|= 1<<CLK;
POR&= ~(1<<DAT);
data = (data<<1);
}
else
{
POR&= ~(1<<CLK);
pif;
PORTD&=~_BV(DAT);
pif;
POR|= 1<<CLK;
data = (data<<1);
}
}
POR|= 1<<DAT; //защелкиваем данные
pif;
POR&= ~ (1<<CLK);
pif;
}
void presets() //настраиваем порты, включаем прерывания, включаем часы
{
DDRB = 0xFF; //port_b output
PORTB = 0x00; //port_b set pins 0
DDRD = 0xff; //port_d output
PORTD = 0x00; //port_d set pins 0
_delay_ms(1);
init_timer(); //init timer
sei(); //enable interrupt
I2C_Init();
}
ISR (TIMER0_OVF_vect) // прерывание сработало
{
send_data(dat[counter]); //грузим в сдвиговый регистр циферки из массива
PORTB = _BV(counter); //включаем соотв. лампу
counter = (counter+1)%6; // плюсуем счетчик на следующую лампу и цифру из массива
TCNT0 = 0x00;
}
int main(void)
{
presets(); //настраиваемся на работу
/*//установка времени и даты
set.seconds=40; //секунды
set.minutes=20; //минуты
set.hours=20; //часы
set.day=0; //день недели
set.date=7; //число
set.month=3; //месяц
set.year=14; //год
//преобр в удобный вид
ds1307_Conv_for_ds(&set);
//устанавливаем время
ds1307_SetTime(&set);
*/
while(1)
{
ds1307_GetTime( &Dio ); //берем время из часов
ds1307_Conv_for_me(&Dio); //перевод из двично-десятичной в удобный вид
convert_seconds(Dio.seconds); //записываем в массив секунды
convert_minutes(Dio.minutes); //пишем в массив минуты
convert_hours(Dio.hours); //пишем секунды
}
}


