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

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

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

Сообщение RolaxD » 30 май 2007, 01:06

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

Сообщение Сергей » 30 май 2007, 01:09

[off]Щас придет дядя "123" и все расскажет и покажет :wink: [/off]
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Сообщение Master » 30 май 2007, 01:51

[off]Точнее пошлет[/off]
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

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

Я пошлю раньше: на сайте Атмел в разделе АВР есть аппноут про матричную клавиатуру.  :wink:
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение $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;
}
$ilent
 

Сообщение RolaxD » 31 май 2007, 22:28

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


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

$ilent - тебе огромное человеческое спасибо!!!!
RolaxD
 
Сообщения: 3
Зарегистрирован: 30 май 2007, 00:41
Откуда: Russia

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

Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

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

Сообщение avr123.nm.ru » 01 июн 2007, 12:00

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


для тех кому трудно и легко в CVAVR есть ПРИМЕРЫ !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение 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);
       }
Johnny Bravo
 
Сообщения: 400
Зарегистрирован: 26 фев 2006, 15:21
Откуда: Омск

Сообщение RolaxD » 01 июн 2007, 22:12



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

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



А этим примером я что-то не разобрался! :cry:
RolaxD
 
Сообщения: 3
Зарегистрирован: 30 май 2007, 00:41
Откуда: Russia

Сообщение Chooze » 04 июн 2007, 14:22

Bravo - глянул код и не вьехал, там еще чегото надо или это всё?
Chooze
 
Сообщения: 79
Зарегистрирован: 03 фев 2007, 20:24
Откуда: Омск

Сообщение Chooze » 04 июн 2007, 14:40

Ха дела - уже понял. Респект!!!
Chooze
 
Сообщения: 79
Зарегистрирован: 03 фев 2007, 20:24
Откуда: Омск


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16