реклама на сайте
подробности

 
 
> Матричная клавиатура, Не могу определить зажатые столбцы
John23
сообщение Feb 22 2008, 09:39
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 17-01-08
Пользователь №: 34 156



Здравствуйте уважаемые знатоки.
Зарание извиняюсь за банальный вопрос, но он возник и никак не могу с ним справится.
У меня всё та же ATmega128, к ней подключена матричная клавиатура на 4 строки и 6 столбцов.
На стороках PORTE4-7, на столбцах PORTB0-5. Проблема в том что прерывания при нажании на клавиши возникают и выводится текст на экранчик, авот как определить столбец не понятно. так как никакие значния в прте В не изменяются. Клавиатура расчитана на одиночные нажатия.
Подскажите пожалуйста как быть. Я уже кажеться все варианты перепробывал. Самое здравое что пришло- это в обработчике прерывания поменять направления столбцов и строк и увидеть уже какой столбец задействован, но ничего не вышло.
Вот код, посмотрите пожалуйста. Закоментирована последняя неудачная попытка.
Код
void InitKB(void)
   {
    DDRE =0x0F;
    PORTE=0xF0;
    
    DDRB  =0x3F; //0b00111111;
    PORTB =0xC0 // 0b11000000;
    
    cli();
    EICRB=0;
    EIMSK=0xF0;
    }
  
SIGNAL(SIG_INTERRUPT4)
{
  
    Btn=PINB;
    int j =1;
    LCDputs("Џђ…ђ›‚ЂЌ?…=4",12,0);
   _delay_ms(5000);
  LCDsendCommand(0x01);
/*  
  if(flag==1)
  {
    //BtnFlag=EIFR;
    DDRB=0xC0;
    PORTB=0x3F;
  
    DDRE =0xF0; //BtnFlag;//0xF0;
    PORTE =0x0F;//0x0F;
    
   // Btn=PINB;
   // BtnFlag=PORTB;
    flag=0;
  }
  else
  {
    Btn=PINB;
    BtnFlag=PORTB;
    DDRE =0x0F;
    PORTE =0xF0;
    
    DDRB  =0x3F; //0b00111111;
    PORTB =0xC0; // 0b11000000
    flag=1;
  }  */

  }

SIGNAL(SIG_INTERRUPT5)
{
  Btn=PINB;
  int j =1;
  LCDputs("Џђ…ђ›‚ЂЌ?…=5",12,0);
   _delay_ms(5000);
  LCDsendCommand(0b00000001);

}                
SIGNAL(SIG_INTERRUPT6)
{
  Btn=PINB;
  int j =1;
LCDputs("Џђ…ђ›‚ЂЌ?…=6",12,0);
   _delay_ms(5000);
  LCDsendCommand(0b00000001);
  
}                
SIGNAL(SIG_INTERRUPT7)
{
  Btn=PINB;
  int j =1;
  // DDRB = 0x3F;
  //PORTB =0xC0;
LCDputs("Џђ…ђ›‚ЂЌ?…=7",12,0);
   _delay_ms(5000);
  LCDsendCommand(0b00000001);

}

int main(void)
{

   LCDinit();
   InitKB();  
   sei();

   for(;;)
  {
    sec=0;
     Btn=0;

  }
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 11:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01316 секунд с 7
ELECTRONIX ©2004-2016