Сб авг 16, 2014 20:24:38
Сб авг 16, 2014 23:03:48
Вт фев 17, 2015 22:06:17
Alexeyslav писал(а):Если кто найдет более удобную программу для рисования блок-схем, сообщите.
Вт фев 17, 2015 22:11:02
Вт фев 17, 2015 22:50:04
// Timer1 overflow interrupt service routine
ISR(TIMER1_OVF_vect)
if(ticTimer == 1) { // таймер тиков для определения временных интервалов короткого, длинного нажатий и автоповтора
cntTic++;
}
}
. . .
main() {
_delay_ms(500);
startup(); // Controller configuration
// Global enable interrupts
sei();
BUT_Init();
while(1) {
FPowerCheck();
switch(Mode) {
case M_SETUP: FSetUp(); break;
case M_VIEWUP: FViewUp(); break;
case M_VIEWDN: FViewDn(); break;
case M_NORMAL: FNormal(); break;
}
}
}
/************************************************ FViewDn */
void FViewDn(void){
// что-то выполняется
Button(); // вызываем опрос кнопок
if( isKey == 1 ) { // флаг что было нажатие
if( (keyPress == KEY_UP) || (keyPress == KEY_ENTER) )
Mode = LastMode; // меняем текущий режим
_resBut(); // обнуляем кнопку
}
}
Вт фев 17, 2015 22:54:56
Alexeyslav писал(а):Одна какая-то левая китайская, а другая триальная. Нет счастья в жизни.
Вт фев 17, 2015 23:12:11
Ср фев 18, 2015 09:48:30
Пт мар 13, 2015 10:03:12
skeef писал(а):1. По отпусканию кнопки определяется была ли она нажата и было ли короткое или длинное нажатие.
...
Например, долгое нажатие на KEY_UP переходим в режим установки и сразу же начинается увеличение показаний счетчика.
Как сделать чтобы при одном нажатии мы входили в режим установки, а смена показаний была только при следующем нажатии, а не сразу как сейчас? Может кто решал подобную задачу?
Вт апр 14, 2015 09:57:01
Вт апр 14, 2015 22:06:19
Ср апр 15, 2015 00:59:02
Alexeyslav писал(а):Чем это лучше фиксации состояния кнопки по таймеру каждые 10мс?
Ср апр 15, 2015 04:32:35
fox15 писал(а):Ну и где тут будет фиксация по таймеру каждые 10 ms? В сложной программе мы рискуем "потерять" нажатие на кнопку, а событие не потеряешь!
Ср апр 15, 2015 05:24:17
Ср апр 15, 2015 07:12:49
Alexeyslav писал(а):С энкодером дело конечно сложнее...
Ср апр 15, 2015 10:41:11
КРАМ писал(а):Alexeyslav писал(а):С энкодером дело конечно сложнее...
На самом деле там нет ничего сложного. Две кнопки с квадратурной диаграммой переключений. Обе защищаются от дребезга как обычные кнопки, причем есть алгоритмы, которые сами по себе бездребезговые, поскольку интервал обработки как раз дает защиту от дребезга.
Я довольно часто ставлю механические энкодеры с осевой кнопкой в разные устройства и всегда и кнопка и энкодер висят на прерывании от системного таймера, совершенно не напрягая общий алгоритм устройства.
Ср апр 15, 2015 11:51:00
Ср апр 15, 2015 13:09:25
Alexeyslav писал(а):Вобщем-то я с этим и не спорил, просто поставил под сомнение использование прерываний для считывания состояния кнопок. Жирно им будет, и необходимости такой нет. Это ведь нужен будет обработчик прерывания, и диспетчер в нем если прерывание происходит не только от кнопок но еще и от внешнего компаратора который использует тот же порт и одно прерывание вместе с кнопками... вобщем, сложности на ровном месте. А еще с приоритетами разобраться... прерывание от кнопки может возникнуть в неожиданный момент, когда надо ловить другое прерывание с минимальным временем реакции на него.
Пн май 04, 2015 11:57:07
DDRB = 0b11111000;
PORTB= 0b00000111;
switch(count)
{
case 1:
display = 10;
break;
case 2:
display = 20;
break;
case 3:
display = 30;
break;
}
if(!(PINB&1)) // опрашиваем кнопку 1(+)
{
flag1=1; //кнопка нажата (устанавливаем флаг в 1)
_delay_ms(10); //задержка (защита от дребезга)
}
if((flag1==1 )&&(PINB&1)) //условие если кнопка была нажата а потом отпущена
{ count++; flag1=0; } // увеличиваем счетную переменную на единицу и сбрасываем флажок
if(!(PINB&2)) // опрашиваем кнопку 2(+)
{
Flag2=1; //кнопка нажата (устанавливаем флаг в 1)
_delay_ms(10); //задержка (защита от дребезга)
}
if(( Flag2==1 )&&(PINB&2)) //условие если кнопка была нажата о потом отпущена
{ count--; Flag2=0; } // уменьшаем счетную переменную на единицу и сбрасываем флажок
if(!(PINB&3)) // опрашиваем кнопку 3(+)
{
flag3=1; //кнопка нажата (устанавливаем флаг в 1)
_delay_ms(10); //задержка (защита от дребезга)
}
if(( flag3==1 )&&(PINB&3)) //условие если кнопка была нажата о потом отпущена
{ count++; flag3=0; }
if(count>3) count=1;
if(count<1) count=3;
Пн май 04, 2015 13:04:53
-=eagle=- писал(а):...а третья ни в какую не хочет нажиматься...
if(!(PINB&4)) // опрашиваем кнопку 3(+)
{
flag3=1; //кнопка нажата (устанавливаем флаг в 1)
_delay_ms(10); //задержка (защита от дребезга)
}
if(( flag3==1 )&&(PINB&4)) //условие если кнопка была нажата о потом отпущена
{ count++; flag3=0; }