CodeVision AVR в вопросах и ответах
Да как хотите. Менюшке без разницы, как вы в нее параметры передадите. Назначение интов - мгновенная реакция на событие. По таймеру просто опрос. В вашем случае кнопок инты - излишество.
Docendo discimus
- Реклама
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Ясно! А смотрите, допустим мне надо, чтобы последовательно нажимая скажем INT0, можно было бы переключать пункты меню? Как мне кажется нужно использовать оператор switch(), только как включить его в программу никак неразберусь. Подскажите пожалуйста!!!!
Заранее спасибо!!!!
Заранее спасибо!!!!
При попадании в интовое прерывание ведете счет переменной, от 0 до 2. В зависимости от ее состояния выбираете нужное действие. Вот он, свич.
Код: Выделить всё
if(++punkt_menu > 2) punkt_menu= 0;
switch(punkt_menu)
{
case 0:
....
break;
case 1:
....
break;
case 2:
....
break;
default:
....
break;
}
Docendo discimus
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Дребезг! Дребезг не забудь!!!
Docendo discimus
- Реклама
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Подкаректируйте пожалуйста фрагмент исходника:
#asm("sei");
while(1);
}
interrupt [EXT_INT0] void ExtInt0(void)
{
if(++punkt_menu > 2) punkt_menu= 0;
switch(punkt_menu)
{
case 0:
while(1){
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf( "LCD0");
}
break;
case 1:
while(1){
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf( "LCD1");
}
break;
case 2:
while(1){
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf( "LCD2");
}
break;
}
}
punkt_menu описывается так:??? - unsigned char punkt_menu; ????
Спасибо!!!!!
#asm("sei");
while(1);
}
interrupt [EXT_INT0] void ExtInt0(void)
{
if(++punkt_menu > 2) punkt_menu= 0;
switch(punkt_menu)
{
case 0:
while(1){
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf( "LCD0");
}
break;
case 1:
while(1){
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf( "LCD1");
}
break;
case 2:
while(1){
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf( "LCD2");
}
break;
}
}
punkt_menu описывается так:??? - unsigned char punkt_menu; ????
Спасибо!!!!!
Да что ж ты родной все с этими вхилами........ Опять же нафига каждый раз клеар и гото. Пальцы не устают тарабанить по клаве? В самом начале сделал и все. Дефолт зачем выкинул?
Описание переменной верное.
Описание переменной верное.
Docendo discimus
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Ну, понял косяки исправил, но в протеусе при нажатии на инт0 работает вообщем только case1. Что может быть??? Так по поводу клир, если его не делать то на дисплее остается ранее выведенный текст??
Спасибо!!!!
Спасибо!!!!
Это
вставьте перед свичем. В остальных местах убрать.
А по поводу кейса прогоните в пошаговом режиме. Поставьте брейкпоинтс на прерывании и смотрите, как изменяется переменная.
Там в папке проекта есть файл с расширением .lst. Давай-ка его сюда.
Код: Выделить всё
lcd_clear( );
lcd_gotoxy(0,0);А по поводу кейса прогоните в пошаговом режиме. Поставьте брейкпоинтс на прерывании и смотрите, как изменяется переменная.
Там в папке проекта есть файл с расширением .lst. Давай-ка его сюда.
Docendo discimus
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Код: Выделить всё
; 0000 0043 case 0:
0000a3 9730 SBIW R30,0
0000a4 f441 BRNE _0x13
; 0000 0044 while(1){ МАТЬ-ПЕРЕМАТЬ!!!!!!!!!!!!!
_0x14:
; 0000 0045 lcd_gotoxy(0,0);
0000a5 e0e0 LDI R30,LOW(0)
0000a6 940e 01b8 CALL SUBOPT_0x0
; 0000 0046 lcd_putsf( "LCD0");
+
0000a8 e6ef +LDI R30 , LOW ( 2 * _0x0 + 27 )
0000a9 e0f0 +LDI R31 , HIGH ( 2 * _0x0 + 27 )
__POINTW1FN _0x0,27
0000aa 940e 01bd CALL SUBOPT_0x1
; 0000 0047 }
0000ac cff8 RJMP _0x14
Код: Выделить всё
; 0000 003F if(++punkt_menu > 3) punkt_menu= 0;Docendo discimus
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Нет. Там 2-ка, просто перед тем как отправить не обновил, просто решил поэксперементировать. Так там двойка., а что со сторчкой мать-..... объясни пожалуйста.
Так, еще раз. Убрать вхилы из обработчика прерывания. Чтобы дать возможность программе не крутиться на одном месте, а вылезти из прерывания и ждать следующего.
Кто-нибудь! Налейте мне валерианки.
Кто-нибудь! Налейте мне валерианки.
Docendo discimus
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Отлично! Все понял все работает!!! Дружище спасибо тебе за помощь!!!
Фуф! Теперь с чувством выполненного долга пойду баиньки. Этот день принес еще одного кота.
Docendo discimus
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Доброго времени суток!!! Можно Вас подастовать еще вопросами, просто очень надо, поставленна была вот такая задача, а в мою бытность этому неучили, так что приходится осваивать самому. Ящик с валерьянкой с меня!!!

Всегда пожалуйста, если это меня. Ведусь на валерьянку.
Docendo discimus
Восторг и похвала Вашему терпению!!!pyzhman писал(а):Всегда пожалуйста, если это меня. Ведусь на валерьянку.
Ставим плюсы: )
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Ясно! Отлично! Спасибо за понимание! Вообщем вопрос такой, есть фрагмент исходника, со switch:
if(++punkt_menu>4) punkt_menu= 0;
switch(punkt_menu)
{
case 1:delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD0");
break;
case 2:
delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD1");
break;
case 3:
delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD2");
break;
case 4:
delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD3");
break;
default:
}
как при выборе соответствующего пункта меню вставить туда рабочий текст программы которая должно выполняться в этом пункет меню.
P.S. Вставка delay_us(500); пойдет как антидребезг?
Заранее благодарен!!!
if(++punkt_menu>4) punkt_menu= 0;
switch(punkt_menu)
{
case 1:delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD0");
break;
case 2:
delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD1");
break;
case 3:
delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD2");
break;
case 4:
delay_us(500);
lcd_gotoxy(6,0);
lcd_putsf( "LCD3");
break;
default:
}
как при выборе соответствующего пункта меню вставить туда рабочий текст программы которая должно выполняться в этом пункет меню.
P.S. Вставка delay_us(500); пойдет как антидребезг?
Заранее благодарен!!!
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
- delay_us(500)
Поставьте конструкцию switch-case в тело цикла. И выполняйте там необходимые действия.


