Я начинающий в программировании микроконтроллеров и в электронике, но думаю, что уровень моих знаний позволит мне создать данное устройство (точнее понять Ваши советы, подсказки и объяснения).
Решил я построить часы с выводом времени в формате чч.мм.сс и даты дд.мм.гг (датой я займусь позже, как только решу все проблемы с часами). Из функций хочеться добавить только будильник. Для вывода времени будет использован 14 разрядный ВЛИ ИВ27М. Мозгом устройства будет Atmega8
На самом деле это вторые часы которые я делаю. Вот хочу, опираясь на старый исходник, построить новые.
Вопрос №1 Как организовать динамическую индикацию на 6 разрядов? (чч.мм.сс)
Вопрос №2 Можно ли для коммутации анодов сегментов использовать ULN2803A? Если да, то как?
Вопрос №3 Как организовать будильник?
Вопрос №4 Как прилепить секунды?
Для начала думаю достаточно. Привожу исходник, сразу прошу сильно не возмущаться по поводу его кривизны
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
static flash unsigned char display[]= // масив для индикатора
{
(0b11000000), // 0
(0b11111001), // 1
(0b10100100), // 2
(0b10110000), // 3
(0b10011001), // 4
(0b10010010), // 5
(0b10000010), // 6
(0b11111000), // 7
(0b10000000), // 8
(0b10010000), // 9
};
bit m;
unsigned char sek, min, hour;
interrupt [TIM2_COMP] void timer2_comp_isr(void) // прерывание по таймеру 2
{
TCNT2=0x00; // обнуляем счетный регистр
sek++;
if(sek==60)
{
sek=0;
min++;
}
if(min==60)
{
min=0;
hour++;
}
if(hour==24) hour=0;
}
void disp(unsigned char a) // фукция для вывода значений
{
unsigned char des=0;
while(a>=10)
{
a-=10;
des++;
}
if(m==0) // условия динамической индикации
{
PORTC.0=1;
PORTD=display[des];
delay_ms(2);
PORTC.0=0;
PORTC.1=1;
PORTD=display[a];
delay_ms(2);
PORTC.1=0;
m=1;
}
else
{
PORTC.2=1;
PORTD=display[des];
delay_ms(2);
PORTC.2=0;
PORTC.3=1;
PORTD=display[a];
delay_ms(2);
PORTC.3=0;
m=0;
}
}
void main(void)
{
PORTB=0x07;
DDRB=0x00;
PORTC=0x00;
DDRC=0x1F;
PORTD=0x00;
DDRD=0b11111111;
ASSR=0b00001000; // таймер в асинхронном режиме
TCCR2=0b00000110; // делитель
TCNT2=0x00;
OCR2=127; // регистр сравнения
TIMSK=0b10000000;
#asm("sei") // глобально разрешаем прерывания
while (1)
{
disp(hour);
disp(sek);
if(PINB.0==0) //если кнопка нажата
{
delay_ms(50); // ждем 50мс
while(PINB.0==0) // ждем отпускания кнопки
{}
min++;
if(min==60)min=0;
}
if(PINB.1==0) //если кнопка нажата
{
delay_ms(50); // ждем 50мс
while(PINB.1==0) // ждем отпускания кнопки
{}
hour++;
if(hour==24)hour=0;
}
}
}


