Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

подключение клавиатуры

Непрочитано 26.06.2007, 10:19  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
По умолчанию подключение клавиатуры

Люди у кого есть код на Си для подключения клавиатуры 3х4.
Или подскажите, рационально ли весь алгоритм считывания нажатой кнопки обрабатывать в функции прирывания от таймера. Мне нужно постоянно сканировать клавиатуру, как это правельней сделать?
Зарания очень благодарен.
Реклама:
maxNTF вне форума  
Непрочитано 26.06.2007, 12:54  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
По умолчанию

опишу траблу по подробнее.
с клавиатурой еще не разу не работал, вот че я пытаюсь сделать:
Код:
if (TMR2IF==1)
	{
		for(;;)
		{
		RD0=0;
		if(RD4==0){key=1;Keypres();break;}
		if(RD5==0){key=2;Keypres();break;}
		if(RD6==0){key=3;Keypres();break;}
		RD0=1;
		RD1=0;
		if(RD4==0){key=4;Keypres();break;}
		if(RD5==0){key=5;Keypres();break;}
		if(RD6==0){key=6;Keypres();break;}
		RD1=1;
		RD2=0;
		if(RD4==0){key=7;Keypres();break;}
		if(RD5==0){key=8;Keypres();break;}
		if(RD6==0){key=9;Keypres();break;}
		RD2=1;
		RD3=0;
		if(RD4==0){key=11;Keypres();break;}
		if(RD5==0){key=0;Keypres();break;}
		if(RD6==0){key=12;Keypres();break;}
		RD3=1;
		keyr_f=0;
		RB7=0;
		break;
		}
	TMR2IF=0;		
	}
//...
void Keypres(void)
{
char i=0;
if (keyr_f==0 && i_k‹9) {buf_pres[i_k]=key;keyr_f=1; i_k++;}
//...
RD0=1,RD1=1,RD2=1,RD3=1;
}
запускаю в PROTEUS, работает как то криво, первые(1,4,7,*)кнопки нажимаютсмя через раз(это в лучшем случае), что подскажите?
В Keypres() я заношу значение нажатой клавиши в общий буфер.
maxNTF вне форума  
Непрочитано 26.06.2007, 14:17  
fmssp
Вид на жительство
 
Регистрация: 02.09.2005
Сообщений: 332
Сказал спасибо: 0
Сказали Спасибо 20 раз(а) в 15 сообщении(ях)
fmssp на пути к лучшему
По умолчанию Re: подключение клавиатуры

Сообщение от maxNTF
Люди у кого есть код на Си для подключения клавиатуры 3х4.
Код:
///////////////////////////////////////////////////////////////////////////
////                             KBDD.C                                ////
////                  Generic keypad scan driver                       ////
////                                                                   ////
////  kbd_init()   Must be called before any other function.           ////
////                                                                   ////
////  c = kbd_getc(c)  Will return a key value if pressed or /0 if not ////
////                   This function should be called frequently so as ////
////                   not to miss a key press.                        ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////

////////////////// The following defines the keypad layout on port D

// Un-comment the following define to use port B
// #define use_portb_kbd TRUE

// Make sure the port used has pull-up resistors (or the LCD) on
// the column pins


#if defined(__PCH__)
#if defined use_portb_kbd
   #byte kbd = 0xF81                   // This puts the entire structure
#else
   #byte kbd = 0xF83                   // This puts the entire structure
#endif
#else
#if defined use_portb_kbd
   #byte kbd = 6                  // on to port B (at address 6)
#else
   #byte kbd = 8                 // on to port D (at address 8)
#endif
#endif

#if defined use_portb_kbd
   #define set_tris_kbd(x) set_tris_b(x)
#else
   #define set_tris_kbd(x) set_tris_d(x)
#endif



//Keypad connection:   (for example column 0 is B2)
//                Bx:

#ifdef blue_keypad  ///////////////////////////////////// For the blue keypad
#define COL0 (1 ‹‹ 2)
#define COL1 (1 ‹‹ 3)
#define COL2 (1 ‹‹ 6)

#define ROW0 (1 ‹‹ 4)
#define ROW1 (1 ‹‹ 7)
#define ROW2 (1 ‹‹ 1)
#define ROW3 (1 ‹‹ 5)

#else ////////////////////////////////////////////////// For the black keypad
#define COL0 (1 ‹‹ 5)
#define COL1 (1 ‹‹ 6)
#define COL2 (1 ‹‹ 7)

#define ROW0 (1 ‹‹ 1)
#define ROW1 (1 ‹‹ 2)
#define ROW2 (1 ‹‹ 3)
#define ROW3 (1 ‹‹ 4)

#endif

#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)
#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2)

// Keypad layout:
char const KEYS[4][3] = {{'1','2','3'},
                         {'4','5','6'},
                         {'7','8','9'},
                         {'*','0','#'}};

#define KBD_DEBOUNCE_FACTOR 33    // Set this number to apx n/333 where
                                  // n is the number of times you expect
                                  // to call kbd_getc each second


void kbd_init() {
}

char kbd_getc( ) {
   static BYTE kbd_call_count;
   static short int kbd_down;
   static char last_key;
   static BYTE col;

   BYTE kchar;
   BYTE row;

   kchar='\0';
   if(++kbd_call_count›KBD_DEBOUNCE_FACTOR) {
       switch (col) {
         case 0   : set_tris_kbd(ALL_PINS&~COL0);
                    kbd=~COL0&ALL_PINS;
                    break;
         case 1   : set_tris_kbd(ALL_PINS&~COL1);
                    kbd=~COL1&ALL_PINS;
                    break;
         case 2   : set_tris_kbd(ALL_PINS&~COL2);
                    kbd=~COL2&ALL_PINS;
                    break;
       }

       if(kbd_down) {
         if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
           kbd_down=FALSE;
           kchar=last_key;
           last_key='\0';
         }
       } else {
          if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
             if((kbd & ROW0)==0)
               row=0;
             else if((kbd & ROW1)==0)
               row=1;
             else if((kbd & ROW2)==0)
               row=2;
             else if((kbd & ROW3)==0)
               row=3;
             last_key =KEYS[row][col];
             kbd_down = TRUE;
          } else {
             ++col;
             if(col==3)
               col=0;
          }
       }
      kbd_call_count=0;
   }
  set_tris_kbd(ALL_PINS);
  return(kchar);
}
fmssp вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение PS/2 клавиатуры к микроконтроллеру hostel6psu Коллекция глюков 1 21.05.2009 05:24
Подключение ЖК дисплея (от телефона) и клавиатуры deeman30rus Ремонт оргтехники 0 02.04.2009 13:41
обработка клавиатуры? maxNTF Микроконтроллеры, АЦП, память и т.д 18 26.10.2007 23:44
Использование клавиатуры PC anton_avr Микроконтроллеры, АЦП, память и т.д 2 04.05.2007 18:46
Подключение стандартной клавиатуры к PIC(у) Eddik Микроконтроллеры, АЦП, память и т.д 8 18.04.2007 20:18


Часовой пояс GMT +4, время: 19:13.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.