Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
26.06.2007, 10:19
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
подключение клавиатуры
Люди у кого есть код на Си для подключения клавиатуры 3х4.
Или подскажите, рационально ли весь алгоритм считывания нажатой кнопки обрабатывать в функции прирывания от таймера. Мне нужно постоянно сканировать клавиатуру, как это правельней сделать?
Зарания очень благодарен.
|
|
|
|
26.06.2007, 12:54
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
опишу траблу по подробнее.
с клавиатурой еще не разу не работал, вот че я пытаюсь сделать:
Код:
|
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() я заношу значение нажатой клавиши в общий буфер.
|
|
|
|
26.06.2007, 14:17
|
|
Вид на жительство
Регистрация: 02.09.2005
Сообщений: 332
Сказал спасибо: 0
Сказали Спасибо 20 раз(а) в 15 сообщении(ях)
|
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);
} |
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:16.
|
|