[Из песочницы] Еще одни часы или когда обидно за микроконтроллер
#define F_CPU 8000000UL
#include
#include
#include
//Программа инициализации ШИМ
void init_pwm (void) //Установка начальных значений счетчиков volatile unsigned char second, minute, hour, h, m; //set_time (hour, minute, second); // Выводим данные на дисплей ISR (TIMER0_OVF_vect) PORTC |= (1 << PC2); } ISR (ADC_vect)//прерывание по завершению преобразования АЦП if (voltage_ADC<260 && OCR1A<300){OCR1A++;OCR1B=OCR1A-dimm;} ADCSR |= (1< //Основная программа int main (void) TIMSK &= ~(1 << OCIE2)|(1 << TOIE2); // Запрещаем прерывания по T2 TCCR0|=(0< //ads hour = 23; // Начальная установка времени mode=1; while (1) //Вечный цикл for (r=0; r<4;r++) } if (r==0) if (r==2) } if (r==3) { _delay_ms (3); }
{
//Инициализация порта
DDRB=0xFF; //OC1A, OC1B, OC2 — выхода
TCCR1A=(1<
OCR1A=250;
OCR1B=215; //Выключен 0 от 200/170 до 250/215
}
int voltage_ADC, dimm;
// Прерывание по переполнению Т2
ISR (TIMER2_OVF_vect)
{
if (second++ >= 59)
{
second = 0;
minute++;
}
if (minute > 59)
{
minute = 0;
hour++;
}
if (hour > 23)
hour = 0;
}
{
{
voltage_ADC = ADCW;//считываем значение АЦ преобразования
if (voltage_ADC>260 && OCR1A>170){OCR1A--; OCR1B=OCR1A-dimm;}
{
unsigned char r;
unsigned char mode;
init_pwm (); //Инициализация ШИМ каналов
PORTD=0×00; //Выставляем все выходы порта D на 0, то есть выключаем весь порт D
DDRD=0xFF; //Делаем порт D как выход, чтобы на выходах порта было напряжение 5В
PORTC = 0b00000000; DDRC = 0b11101111;
ASSR |= (1 << AS2); // Включаем асинхронный режим T2
TCNT2 = 0; // Сбрасываем регистр счета
TCCR2 |= (1 << CS22)|(0 << CS21)|(1 << CS20); // Предделитель на 128-(32768/128 = 256 тиков/c)
TIMSK |= (1 << TOIE2); // Разрешаем прерывание по переполнению Т2
ADMUX|= (1<
minute = 13;
second = 23;
{
/*
PORTD |= (1 << PD1); // установка бита 1
PORTD &= ~ (1 << PD1); // сброс бита 1
*/
dimm=35;
PORTC &= ~ (1 << PC2);
if (mode==1){m=minute; h=hour;}
if (mode==2){m=second; h=minute;}
if (mode==3){m=voltage_ADC%100; h=voltage_ADC/100;};
{
if (r==1)
{
PORTC |= (1 << PC3);//минуты десятки
if (m/10==0) PORTD |= (1 << PD3);//0
if (m/10==1) PORTD |= (1 << PD2);//1
if (m/10==2) PORTB |= (1 << PB1);//2
if (m/10==3) PORTB |= (1 << PB3);//3
if (m/10==4) PORTB |= (1 << PB4);//4
if (m/10==5) PORTD |= (1 << PD5);//5
if (m/10==6) PORTD |= (1 << PD6);//6
if (m/10==7) PORTD |= (1 << PD7);//7
if (m/10==8) PORTB |= (1 << PB0);//8
if (m/10==9) PORTD |= (1 << PD4);//9
{
PORTC |= (1 << PC5);//минуты единицы
if (m%10==0) PORTD |= (1 << PD3);//0
if (m%10==1) PORTD |= (1 << PD2);//1
if (m%10==2) PORTB |= (1 << PB1);//2
if (m%10==3) PORTB |= (1 << PB3);//3
if (m%10==4) PORTB |= (1 << PB4);//4
if (m%10==5) PORTD |= (1 << PD5);//5
if (m%10==6) PORTD |= (1 << PD6);//6
if (m%10==7) PORTD |= (1 << PD7);//7
if (m%10==8) PORTB |= (1 << PB0);//8
if (m%10==9) PORTD |= (1 << PD4);//9
}
{
PORTD |= (1 << PD1);//часы десятки
if (h/10==0) PORTD |= (1 << PD3);//0
if (h/10==1) PORTD |= (1 << PD2);//1
if (h/10==2) PORTB |= (1 << PB1);//2
if (h/10==3) PORTB |= (1 << PB3);//3
if (h/10==4) PORTB |= (1 << PB4);//4
if (h/10==5) PORTD |= (1 << PD5);//5
if (h/10==6) PORTD |= (1 << PD6);//6
if (h/10==7) PORTD |= (1 << PD7);//7
if (h/10==8) PORTB |= (1 << PB0);//8
if (h/10==9) PORTD |= (1 << PD4);//9
PORTD |= (1 << PD0);//часы единицы
if (h%10==0) PORTD |= (1 << PD3);//0
if (h%10==1) PORTD |= (1 << PD2);//1
if (h%10==2) PORTB |= (1 << PB1);//2
if (h%10==3) PORTB |= (1 << PB3);//3
if (h%10==4) PORTB |= (1 << PB4);//4
if (h%10==5) PORTD |= (1 << PD5);//5
if (h%10==6) PORTD |= (1 << PD6);//6
if (h%10==7) PORTD |= (1 << PD7);//7
if (h%10==8) PORTB |= (1 << PB0);//8
if (h%10==9) PORTD |= (1 << PD4);//9
}
PORTC &= ~ (1 << PC3);
PORTC &= ~ (1 << PC1);
PORTC &= ~ (1 << PC5);
PORTD &= ~ (1 << PD1);
PORTB=0×00; PORTC=0×00; PORTD=0×00;
_delay_ms (1);
}
}