Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
ISR( TIMER1_OVF_vect )
{
TCNT1 = 64456; //выставляем начальное значение TCNT1
if( PINB & ( 1 << PB0 ) ) {
PORTB &= ~( 1 << PB0 );
}
else {
PORTB |= ( 1 << PB0 );
}
}
int main()
{
DDRB = ( 1 << PB0 ); // настраиваем PB0 на выход
TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10); // настраиваем делитель
TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
TCNT1 = 64456; // выставляем начальное значение TCNT1
sei(); // выставляем бит общего разрешения прерываний
while(1); // вечный цикл
return 0;
}
Хочу чтобы и текст выводился в бесконечном цикле и по прерыванию диод моргал.
Но когда объединяю эти два кода, то диод не моргает а на экране всякая чушь выводится.
Вот код:
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define RS PC0
#define EN PC1
ISR( TIMER1_OVF_vect )
{
TCNT1 = 64456; //выставляем начальное значение TCNT1
if( PINB & ( 1 << PB0 ) ) {
PORTB &= ~( 1 << PB0 );
}
else {
PORTB |= ( 1 << PB0 );
}
}
// Функция записи команды в ЖКИ
void lcd_com(unsigned char p)
{
PORTC &= ~(1 << RS); // RS = 0 (запись команд)
PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
PORTA &= 0x0F; PORTA |= (p & 0xF0); // Выделяем старший нибл
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(100);
PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
PORTA &= 0x0F; PORTA |= (p << 4); // Выделяем младший нибл
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(100);
}
// Функция записи данных в ЖКИ
void lcd_dat(unsigned char p)
{
PORTC |= (1 << RS)|(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD)
PORTA &= 0x0F; PORTA |= (p & 0xF0); // Выделяем старший нибл
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(100);
PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
PORTA &= 0x0F; PORTA |= (p << 4); // Выделяем младший нибл
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(100);
}
// Функция инициализации ЖКИ
void lcd_init(void)
{
DDRC |= (1 << PC1)|(1 << PC0); // PC1, PC0 - выходы
PORTC = 0x00;
DDRA = 0xFF; // порт D - выход
PORTA = 0x00;
_delay_ms(50); // Ожидание готовности ЖК-модуля
// Конфигурирование четырехразрядного режима
PORTA |= (1 << PA5);
PORTA &= ~(1 << PA4);
// Активизация четырехразрядного режима
PORTC |= (1 << EN);
PORTC &= ~(1 << EN);
_delay_ms(5);
lcd_com(0x28); // Шина 4 бит, LCD - 2 строки
lcd_com(0x08); // Полное выключение дисплея
lcd_com(0x01); // Очистка дисплея
_delay_us(100);
lcd_com(0x06); // Сдвиг курсора вправо
_delay_ms(10);
lcd_com(0x0C); // Включение дисплея, курсор не видим
}
// Основная программа
int main (void)
{
unsigned char znak = 0; // определяем переменную
DDRB = ( 1 << PB0 ); // настраиваем PB0 на выход
TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10); // настраиваем делитель
TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
TCNT1 = 64456; // выставляем начальное значение TCNT1
sei();
lcd_init(); // Инициализация дисплея
while (1)
{
//sei();
asm("nop");
lcd_com(0x80); // Вывод в верхнюю левую позицию 1 строки
lcd_dat(znak/100 + '0'); // Выделяем сотни
lcd_dat((znak/10)%10 + '0'); // Выделяем десятки
lcd_dat(znak%10 + '0'); // Выделяем единицы
lcd_dat('='); // Выводим знак равенства
lcd_dat(znak); // Выводим содержимое знакогенератора
_delay_ms(100); // Тут можно поменять задержку вывода символов
lcd_com(0xC0);
lcd_dat('V');
lcd_dat('o');
lcd_dat('l');
lcd_dat('k');
lcd_dat('o');
lcd_dat('v');
lcd_dat('=');
lcd_dat('1');
lcd_dat('5');
lcd_dat(':');
lcd_dat('0');
lcd_dat('4');
lcd_dat(':');
lcd_dat('7');
lcd_dat('6');
_delay_ms(100);
znak++; // Следующий символ знакогенератора
}
}
ПОМОГИТЕ уперся я в прерывания и таймеры хочу время и дату выводить на экран



