roboforum.ru

Технический форум по робототехнике.

Клавиатура 4x3 матричная KeyPad

Клавиатура 4x3 матричная KeyPad

RolaxD » 30 май 2007, 01:06

Доброе время суток!
Помогите решить такую задачу! Требуется реализовать на микроконтроллере Atmel матричную клавиатуру (например 4x3, то есть 12 кнопок). Идея абсолютно ясна  ( http://radiokot.ru/start/mcu_fpga/avr/16/ ). Но дело в том что это нужно написать это на Си (CodeVisionAVR) что для меня пока (я только учусь) представляет большую трудность!  Данная тема довольно распространенная, поэтому если у вас есть исходный код или советы как это реализовать на Си - то помогите пожалуйста! Пример из CodeVisionAVR не понял, похоже чего-то там не хватает.  Очень надо!

Сергей » 30 май 2007, 01:09

[off]Щас придет дядя "123" и все расскажет и покажет :wink: [/off]

Master » 30 май 2007, 01:51

[off]Точнее пошлет[/off]

-= Александр =- » 30 май 2007, 03:24

Я пошлю раньше: на сайте Атмел в разделе АВР есть аппноут про матричную клавиатуру.  :wink:

$ilent » 30 май 2007, 09:18

Код: Выделить всёРазвернуть
unsigned char keys [];
unsigned short key;
unsigned char i=0;
unsigned char k=0;
void scan_key (void)
{
PORTA = 0xFF;
PORTA &=~BIT(2);
DelayMs(1);
      if (!(PINA & (1 << PA1)))
        {
          while(!(PINA & (1 << PA1)))
          {
          ;;
          }
          keys[i]=1;
          ShowSym(keys[i]+48);
          i++;
         }
      else if (!(PINA & (1 << PA6)))
        {
          while(!(PINA & (1 << PA6)))
          {
          ;;
          }
          keys[i]=4;
          ShowSym(keys[i]+48);
          i++;
         }
      else if (!(PINA & (1 << PA5)))
        {
          while(!(PINA & (1 << PA5)))
          {
          ;;
          }
          keys[i]=7;
          ShowSym(keys[i]+48);
          i++;
         }
      else if (!(PINA & (1 << PA3)))
        {
          while(!(PINA & (1 << PA3)))
          {
          ;;
          }
          k=i;
          ClrDisp();
          for (i=0;i<k;i++)
              {
              keys[k]=0x00;
             }
               i=0;
               k=0;
         }
PORTA = 0xFF;
PORTA &=~BIT(0);
DelayMs(1);
      if (!(PINA & (1 << PA1)))
        {
          while(!(PINA & (1 << PA1)))
          {
          ;;
          }
          keys[i]=2;
          ShowSym(keys[i]+48);
          i++;
         }
      else if (!(PINA & (1 << PA6)))
        {
          while(!(PINA & (1 << PA6)))
          {
          ;;
          }
          keys[i]=5;
          ShowSym(keys[i]+48);
          i++;
         }
      else if (!(PINA & (1 << PA5)))
        {
          while(!(PINA & (1 << PA5)))
          {
          ;;
          }
          keys[i]=8;
          ShowSym(keys[i]+48);
          i++;
         }
      else if (!(PINA & (1 << PA3)))
        {
          while(!(PINA & (1 << PA3)))
          {
          ;;
          }
          keys[i]=0;
          ShowSym(keys[i]+48);
          i++;
         }
PORTA = 0xFF;
PORTA &=~BIT(4);
DelayMs(1);
      if (!(PINA & (1 << PA1)))
        {
          while(!(PINA & (1 << PA1)))
          {
          ;;
          }
          keys[i]=3;
          ShowSym(keys[i]+48);
          i++;
         }
      else if (!(PINA & (1 << PA6)))
        {
          while(!(PINA & (1 << PA6)))
          {
          ;;
          }
          keys[i]=6;
          ShowSym(keys[i]+48);
          i++;
         }
      else if (!(PINA & (1 << PA5)))
        {
          while(!(PINA & (1 << PA5)))
          {
          ;;
          }
          keys[i]=9;
          ShowSym(keys[i]+48);
          i++;
         }
      else if (!(PINA & (1 << PA3)))
        {
          while(!(PINA & (1 << PA3)))
          {
          ;;
          }
          k=i;
          key =
               (keys [k-4]*10000)+
               (keys [k-3]*1000)+
               (keys [k-2]*100)+
               (keys [k-1]*10)+
               (keys [k]*1);
          ShowDigit(key);
          for (i=0;i<k;i++)
              {
              keys[k]=0x00;
             }
         i=0;
         k=0;
         }
         return;
}

RolaxD » 31 май 2007, 22:28

-= Александр =- писал(а):Я пошлю раньше: на сайте Атмел в разделе АВР есть аппноут про матричную клавиатуру.  :wink:


Это случайно не "C51 Keyboard Code Examples"? А то что-то другого не нашёл!

$ilent - тебе огромное человеческое спасибо!!!!

-= Александр =- » 01 июн 2007, 03:02


Re: Матричная клавиатура 4x3

avr123.nm.ru » 01 июн 2007, 12:00

RolaxD писал(а):Требуется реализовать на микроконтроллере Atmel матричную клавиатуру (например 4x3, то есть 12 кнопок). Идея абсолютно ясна  ( http://radiokot.ru/start/mcu_fpga/avr/16/ ). Но дело в том что это нужно написать это на Си (CodeVisionAVR) что для меня пока (я только учусь) представляет большую трудность!


для тех кому трудно и легко в CVAVR есть ПРИМЕРЫ !

Johnny Bravo » 01 июн 2007, 17:49

4x4
Код: Выделить всёРазвернуть
unsigned char str,col;
     key=0;
     PORTA=0x0F;
     DDRA=0xF0;
     #asm("nop");
     #asm("nop");
     str=PINA;
     #asm("nop");
     #asm("nop");
     if(str!=0x0F)
       {
       PORTA=0xF0;
       DDRA=0x0F;
       #asm("nop");
       #asm("nop");
       col=PINA;
       #asm("nop");
       #asm("nop");
       while(PINA==col)
       buzzer_on;
       
       buzzer_off;
       key=(~str)&(~col);
       }

RolaxD » 01 июн 2007, 22:12



Огромное спасибо! Нашёл даже на русском http://www.gaw.ru/html.cgi/txt/app/micr ... AVR243.htm

-= avr123.nm.ru =- писал(а):для тех кому трудно и легко в CVAVR есть ПРИМЕРЫ !



А этим примером я что-то не разобрался! :cry:

Chooze » 04 июн 2007, 14:22

Bravo - глянул код и не вьехал, там еще чегото надо или это всё?

Chooze » 04 июн 2007, 14:40

Ха дела - уже понял. Респект!!!


cron
Rambler\'s Top100 Mail.ru counter