Периферию вашего контроллера я не знаю, а изучать ее специально нет особого желания. Примерно вот так
Код
#define PIN_KEY (1<<2) //кнопка подключена к P3.2 и к DGND, к P3.2 подключен pull-up резистор
#define PIN_LED (1<<1) //светодиод катодом подключен к P3.1, анодом через балластный резистор к +DVDD
#define MAXCOMP 15U
#define MAXCNTR 1000U
#define KEY_NULL 0x00
#define KEY_SET 0x01
unsigned int cntr, comp;
unsigned char key;
void main (void)
{
/* тут секция для начальной инициализации периферии */
/* конец секции начальной инициализации периферии */
P3 &= PIN_LED^0xFF;
key = KEY_NULL;
for(;;)
{ if ((P3&PIN_KEY) == 0) //засекли нажатие кнопки?
{ comp = 0;
cntr = 0;
do //устраняем дребезг
{ if ((P3&PIN_KEY) == 0)
comp++;
else
comp = 0;
if (comp >= MAXCOMP) //состояние устойчивое?
{ key = KEY_SET;
break;
}
cntr++;
} while (cntr < MAXCNTR);
if (cntr >= MAXCNTR) //дребезг устранить не удалось?
key = KEY_NULL;
}
if (key == KEY_SET) //кнопка нажата?
P3 &= PIN_LED^0xFF; //включим LED
else
P3 |= PIN_LED; //иначе выключим LED
}
}
Времена устранения дребезга можно изменить значениями дефайнов.
Если нужен триггерный эффект, то замените простую проверку кода кнопки на смену ее состояния.
Добавим еще одну переменную
Код
unsigned char lastkey = KEY_NULL;
Изменим способ проверки факта нажатия и переключение светодиода
Код
if ( (key == KEY_SET) && //кнопка нажата? И
(lastkey == KEY_NULL) ) // до этого она была не нажата?
P3 ^= PIN_LED; //переключим состояние LED
lastkey = key; //обновим состояние кнопки
Сообщение отредактировал rezident - Oct 10 2010, 08:16