
Вобщем в WinAVR это очень просто и всегда работает.
Урезанная Часть кода из моего проекта тахометра который я брату в девятку делал
Код
#define leds PD3 //Обзываем кнопки именами
#define lcd PD4
#define regim PD0
//***************************
//Думаем что же там было нажато
volatile uint8_t key (volatile uint8_t s){
if (!(_SFR_BYTE(PIND) & _BV(s))) // или аналог (bit_is_clear(PIND,s))
{
_delay_loop_2(100);
if (!(_SFR_BYTE(PIND) & _BV(s)))
{return (0);}
}
return (1);
}
//***********************************
void check_keys(){ // Расставляем флаги по нажатым кнопкам
if ((key(regim)) == 0 ) {key_pr=3;}
if ((key(lcd)) == 0 ) {key_pr=2;}
if ((key(leds)) == 0 ) {key_pr=1;}
}
#define lcd PD4
#define regim PD0
//***************************
//Думаем что же там было нажато
volatile uint8_t key (volatile uint8_t s){
if (!(_SFR_BYTE(PIND) & _BV(s))) // или аналог (bit_is_clear(PIND,s))
{
_delay_loop_2(100);
if (!(_SFR_BYTE(PIND) & _BV(s)))
{return (0);}
}
return (1);
}
//***********************************
void check_keys(){ // Расставляем флаги по нажатым кнопкам
if ((key(regim)) == 0 ) {key_pr=3;}
if ((key(lcd)) == 0 ) {key_pr=2;}
if ((key(leds)) == 0 ) {key_pr=1;}
}
Вообщем как гениально просто это сделать на IAR?
К статье прилагается архив, со схемой и исходниками. Посмотрите пожалуйсто
