Код: Выделить всё
#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++; // инкрементируем секунду
}
// Объявляем переменную pause, которая будет осуществлять задержку
char i; // Переменная для счетчика для анимации
typedef unsigned char byte; // Новый тип переменной для наших символов
flash byte char0[8]={0, 0, 0, 0, 0, 0, 0, 0};
flash byte char1[8]={0, 28, 18, 17, 31, 31, 31, 0}; // правая
flash byte char2[8]={0, 7, 9, 17, 31, 31, 31, 31}; //левая
flash byte char3[8]={0, 7, 9, 17, 17, 31, 31, 31}; //передние
flash byte char4[8]={4, 20, 20, 4, 4, 4, 4, 4}; //передняя правая
flash byte char5[8]={4, 5, 5, 4, 4, 4, 4, 4};//передняя левая
flash byte char6[8]={0, 0, 0, 0, 0, 0, 0, 0};
// Функция записи символа в контроллер дисплея
void define_char(byte flash *pc,byte char_code)
{
byte i,a;
a=(char_code<<3)|0x40;
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
}
// Функция инициализации микроконтроллера
void avr_init(void)
{
PORTB=0x0F;
DDRB=0x00;
PORTC=0x03;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
}
// Основная программа
void main(void)
{
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=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/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
avr_init();
lcd_init(16); // Инициализация экрана
// Запись символов char0 - char4 по адресам 0х00 - 0х04 соответственно
define_char(char0,0);
define_char(char1,1);
define_char(char2,2);
define_char(char3,3);
define_char(char4,4);
define_char(char5,5);
define_char(char6,6);
lcd_clear(); // Очищаем экран
while (1)
{ // код вывода анимации из новых символов на дисплей
i=5;
while(i)
{
//работа с часами
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(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);
if (PINB.0==0)// передняя левая
{
lcd_gotoxy(14,0);
lcd_putchar(0x02);
}
else
{
lcd_gotoxy(14,0);
lcd_putchar(0x00);
}
if (PINB.1==0) //передняя правая
{
lcd_gotoxy(15,0);
lcd_putchar(0x01);
}
else
{
lcd_gotoxy(15,0);
lcd_putchar(0x00);
}
if (PINB.2==0)//задняя левая
{
lcd_gotoxy(14,1);
lcd_putchar(0x02);
}
else
{
lcd_gotoxy(14,1);
lcd_putchar(0x00);
}
if (PINB.3==0)//задняя правая
{
lcd_gotoxy(15,1);
lcd_putchar(0x01);
}
else
{
lcd_gotoxy(15,1);
lcd_putchar(0x00);
}
};
};
}