Ответ: Ну так где же твой код?) Смотри - 4 кнопки, 1 комбинация
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Vladimir Ljaschko 05 февраля 2004 г. 11:56
В ответ на: подскажите как на си организовать опрос кнопки, интересует Правильный подход, хотелось бы посмотреть и кусок кода в котором прослеживается правильная структура. Спрашиваю потому, что есть много стилей написания, а хочется сразу выработать верный стиль, а не учиться на своих ошибках, а самое главное не учить чужих ошибок. В принципе сам на си пишу, но во многих случаях код получается хоть и работоспособный, но какой то не удобный для восприятия. отправлено 1 05 февраля 2004 г. 08:18

#include "1000_Kbd.h"
#include "1000_ports.h"


#define LastKey 4
#define StatusBufferSize 3
#define StartDelay 200
#define NextDelay 30


const int bit_mask[16]={ BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, BIT8, BIT9, BITA, BITB, BITC, BITD, BITE, BITF};


char kbd_status0;
char kbd_status1;
char kbd_status2;
char kbd_status3;
char kbd_status4;

char interrupt_counter;
char found_events;
char old_pressed_keys;
char pressed_counter;
char pressed_keys;
//char found_keys;
//char unpressed_keys;

void InitKbd(void)
{
kbd_status3=kbd_status2=kbd_status1=kbd_status0=0;
}


void KbdService(void) // into timer interrupt 1 ms
{
switch (interrupt_counter) // to reduce time of function
{
case 0: interrupt_counter=1; //refresh statuses
kbd_status3=kbd_status2;
kbd_status2=kbd_status1;
kbd_status1=kbd_status0;
kbd_status0=Kbd;
interrupt_counter=interrupt_counter;
break;

case 1: interrupt_counter=2; //check pressed key every tic
pressed_keys=kbd_status0&kbd_status1&kbd_status2;
found_events|=pressed_keys&(~kbd_status3); // found edge
if ((pressed_keys==kUp+kDn)&& // now this two keys
((~kbd_status3)&(kUp+kDn)))//and before it wasn't so
{found_events|=kUpDn; // set new bit
found_events&=~(kUp+kDn); //reset usual bits
};
break;

case 2: interrupt_counter=3; //check if key the same as before
if ((pressed_keys&kUp)||(pressed_keys&kDn)) //key for repeat
{ if (pressed_keys==old_pressed_keys) // same key?
{ if (pressed_counter) // yes, time over?
{pressed_counter--;} //No
else { pressed_counter=NextDelay; //Yes
found_events=pressed_keys; } //reset
}
else // other key
{pressed_counter=StartDelay;
}
};
old_pressed_keys=pressed_keys;


break;
case 3: interrupt_counter=4;

break;

default:interrupt_counter=0;
}
}

char GetKeyEvent(void)
{ char i;
char mask;
for (i=evUp-1; i<=evUpDn-1; i++)
{ mask=(char) bit_mask[i];
if (found_events&mask) {found_events&=~mask; return(i+1);}
}
return(0);
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru