Пол дня долбался и тока что впомнил про флаг, я их не правильно в таимере обозвал и он просто молчит как партизан и никаких действий на лсд
вот код, можете ругать это все в кучу скидал и оно работает
Код: Выделить всё
#define F_CPU 16000000UL // Объявляем, что у нас припаян резонатор на 16 МГц. От этой строки зависит
// корректность работы функции _delay_ms. Следует писать в начале файла, до
// #include, так как F_CPU используется в заголовочных файлах
#include </usr/lib/avr/include/avr/io.h>// Всегда нужно включать. Эти заголовки содержат объявления, общие для всех AVR
#include </usr/lib/avr/include/avr/iom32.h>// Файл с описанием объявлений для конкретного микроконтроллера
#include </usr/lib/avr/include/avr/interrupt.h>//Библиотека прерываний
#include </usr/lib/avr/include/util/delay.h>// Для использования "пауз"
#include </home/shurik/workspace/robo2/lcd_lib.h> //для лсд
const unsigned char codes[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
char mode=0;//Переменная пункта меню
int flag=0;//Флаг вывода на экран пункта меню
char i;
char prog=10;
int mute=0;
int temp,res;
ISR(TIMER0_OVF_vect)
{
if (mode==0)
{
if ((PINB&0x01)==0x00) //Если низкий уровень на PB0 есть
{
_delay_ms(10); //Ждем 0.01с
if ((PINB&0x01)==0x00)
{
while ((PINB&0x01)==0x00); //Ждем отжатия клавиши;
{
if (prog <100)
{
++prog;
flag=0;
}
}
}
TCNT0 = 0xcc;
}
if ((PINB&0x02)==0x00) //Если низкий уровень на PB0 есть
{
_delay_ms(10); //Ждем 0.01с
if ((PINB&0x02)==0x00)
{
while ((PINB&0x02)==0x00); //Ждем отжатия клавиши;
{
if (prog>0)
{
--prog;
flag=0;
}
}
}
TCNT0 = 0xcc;
}
if ((PINB&0x04)==0x00) //Если низкий уровень на PB0 есть
{
_delay_ms(10); //Ждем 0.01с
if ((PINB&0x04)==0x00)
{
while ((PINB&0x04)==0x00); //Ждем отжатия клавиши;
{
if (mute==1) --mute;
else ++mute;
flag=0;
}
}
TCNT0 = 0xcc;
}
if ((PINB&0x08)==0x00) //Если низкий уровень на PB0 есть
{
_delay_ms(10); //Ждем 0.01с
if ((PINB&0x08)==0x00)
{
while ((PINB&0x08)==0x00); //Ждем отжатия клавиши;
{
++mode;
flag=0;
}
}
TCNT0 = 0xcc;
}
}
if (mode==1)
{
if ((PINB&0x08)==0x00) //Если низкий уровень на PB0 есть
{
_delay_ms(10); //Ждем 0.01с
if ((PINB&0x08)==0x00)
{
while ((PINB&0x08)==0x00); //Ждем отжатия клавиши;
{
--mode;
flag=0;
}
}
TCNT0 = 0xcc;
}
}
TCNT0 = 0xcc;
return;
}
void lcd_string( char *s )
{
while( *s )
LCDsendChar(*s++ );
}
void menu(void)
{
if (mode==0)//Если переменная меню=0
{
if (flag==0)//Если флаг=0
{
LCDclr();
lcd_string("<Menu1>");//Выводим название первого пункта меню 1
LCDGotoXY(0,1);
LCDprogressBar(prog,100,13);
LCDGotoXY(13,1);
temp=prog;
res=temp/100; //Calculate 100-s
LCDsendChar(codes[res]);
temp=temp-res*100;
res=temp/10; //Calculate 10-s
LCDsendChar(codes[res]);
temp=temp-res*10;
res=temp/1; //Calculate 1-s
LCDsendChar(codes[res]);
temp=temp-res*1;
if (mute == 1)
{
LCDGotoXY(15,0);
LCDsendChar('X');
}
else
{
LCDGotoXY(15,0);
LCDsendChar(' ');
}
flag=1;//Переключаем флаг=1
}
}
if (mode==1)//Если переменная меню=1
{
if (flag==0)//Если флаг=0
{
LCDclr();
lcd_string("<Menu2>");//Выводим название первого пункта меню 2
LCDGotoXY(0,1);
lcd_string("USB Ready");
flag=1;//Переключаем флаг=1
}
}
if (mode==2)//Если флаг=0
{
LCDclr();
lcd_string("<Menu3>");//Выводим название первого пункта меню 3
LCDGotoXY(0,1);
lcd_string("about");
flag=1;//Переключаем флаг=1
}
}
int main (void)
{
DDRB=0xF0;
PORTB=0x0F;
LCDinit();
LCDclr();
_delay_ms(100);
TCCR0 = (1<<CS01)|(1<<CS00); //8
TCNT0 = 0xcc; // 300hz
TIMSK |= (1<<TOIE0);
TIFR |= (1<<TOV0);
sei();
while(1)//Вечный цикл
{
menu();//Запуск обработки пунктов меню
}
}