Вот немного усовершенствованный вариант использование таймера, настройки такие же, как в предыдущей статье. Только добавляем еще 2 кнопки для увеличения минут на 1 и часов на 1. Схема: Исходный код: #include <mega8.h> #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> #include <delay.h> // подключаем библиотеку задержки unsigned int sek; // переменная сек. unsigned int min; // пересенная мин. unsigned int hour; // переменная часов // Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) // таймер выставлен на частоту 1 Гц { // Place your code here TCNT1H=0; TCNT1L=0; sek++; // инкрементируем секунду }
// Declare your global variables here
void main(void) { PORTB=0x00; DDRB=0xFF;
PORTC=0x03; // выставляем порт С на 2 кнопки. DDRC=0x00;
PORTD=0x00; DDRD=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 7,813 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x05; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x1E; OCR1AL=0x85; OCR1BH=0x00; OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x10;
// LCD module initialization lcd_init(16);
// Global enable interrupts #asm("sei")
while (1) { // Place your code here
// роботаем с кнопками if (PINC.0==0) // если нажата первая кнопка { delay_ms(250); // задержка 1/4 сек. (для удобства) выбора min++; // к значению минуты добавляем еденицу } if (PINC.1==0) // если нажата вторая кнопка { delay_ms(250); // задержка 1/4 сек. (для удобства) выбора hour++; // к значению часов добавляем еденицу } ///// Условия часов. if(sek==60) // если сек = 60 { min++; // добавляем 1 к переменной "минута" sek=0; // зануляем переменную "секунда" } if(min==60) // если мин = 60 { hour++; // добавляем 1 к переменной "час" min=0; // зануляем переменную "минута" } if (hour==24) // так как у нас часы имеют 24 часовый формат { // при достыжении 24 часов, онулируем все переменные. hour=0; min=0; sek=0; } // выводим переменные lcd_gotoxy(4,0); // выводим посередине, если хотите вывести в начале дисплея тогда нужно выставить lcd_gotoxy(0,0); lcd_putchar(hour/10+0x30); lcd_putchar(hour%10+0x30); lcd_putchar(':'); lcd_putchar(min/10+0x30); lcd_putchar(min%10+0x30); lcd_putchar(':'); lcd_putchar(sek/10+0x30); lcd_putchar(sek%10+0x30);
}; }
Рекомендую использовать импортный кварц на 8 МГц и 2 конденсатора на 22 пФ для правильной роботы часов.
Прошивка, исходник и файл в протеусе находиться в разделе "файлы". Спасибо KDAlex'y в написании прошивки.
|