سلام
کد:
#define col0 PA0
#define col1 PA1
#define col2 PA2
#define row0 PA3
#define row1 PA4
#define row2 PA5
// Keypad layout:
char const KEYS[3][3] = {{'1','2','3'},
{'4','5','6'},
{'7','8','9'}};
#define KBD_DEBOUNCE_FACTOR 22 // Set this number to apx n/333 where
void kbd_init() {
PORTA_INPUT = row0 |row1 |row2 ;
PORTA_OUTPUT=col0 |col1 |col2 ;
}
short int ALL_ROWS (void)
{
if (input (row0) & input (row1) & input (row2) )
return (0);
else
return (1);
}
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 :
RST_PORTA=col0;
SET_PORTA=col1;
SET_PORTA=col2;
break;
case 1 :
RST_PORTA=col1;
SET_PORTA=col0;
SET_PORTA=col2;
break;
case 2 :
RST_PORTA=col2;
SET_PORTA=col1;
SET_PORTA=col0;
break;
}
if(kbd_down) {
if(!ALL_ROWS()) {
kbd_down=false;
kchar=last_key;
last_key='\0';
}
} else {
if(ALL_ROWS()) {
if(!input (row0))
row=0;
else if(!input (row1))
row=1;
else if(!input (row2))
row=2;
last_key =KEYS[row][col];
kbd_down = true;
} else {
++col;
if(col==3)
col=0;
}
}
kbd_call_count=0;
}
return(kchar);
}
برای کار با این کتابخونه به کتابخونه ی PIO.H نیاز دارید که میتونید اون رو در مجله ی PMM شماره ی 2 مشاهدش کنید .
کد های بالا رو در یک فایل متنی کپی کنید و نام فایل رو به KBD.c تغییر بدید .
با دستور #include "KBD.c" میتونید از این کتابخونه در برنامتون استفاده کنید .
برای استفاده از کتابخونه باید دستور kbd_init() یک بار در برنامه اجرا بشه .
با فشردن و رها شدن کلید مقدار متناظر کلید که یک کارکتر است در تابع kbd_getc() برگشت داده میشه .
این کتاب خونه برای کامپایلر CCS هست که همین الان برای ARM تغییرش دادم . این کتابخونه رو من تست نکردم ، اما شما تست کنید و اگه مشکلی بود مطرح کنید تا اصلاح بشه .