📄 keyscan.c
字号:
/**************************************************************
4*4 Key Scan
**************************************************************/
#include "def.h"
#include "2410addr.h"
#include "config.h"
#include "board.h"
#include "utils.h"
#define KEY_ROW_R *(volatile U16 *)( 0x38001002 ) //nGCS7
static U8 key_ch[16] = { '7', '8', '9', 'f',
'4', '5', '6', 'e',
'1', '2', '3', 'd',
'0', 'a', 'b', 'c'};
static U8 key_matrix[256];
U32 down_key;
U8 Kbhit(void)
{
int j;
KEY_ROW_R = 0x00; // 先拉低4X4键盘的列线
for(j=0; j<24; j++); //延迟一小段时间
//判断是否有键按下
if((!(rGPFDAT&(1<<0)))||(!(rGPFDAT&(1<<2)))||(!(rGPGDAT&(1<<3)))||(!(rGPGDAT&(1<<11))))
return 1;
return 0;
}
static __inline void set_io(void)
{
// GPF0,GPF2 input with pull-up
rGPFCON &= ~(3 | (3<<4));
rGPFUP &= ~(1 | (1<<2));
// GPG3,GPG11 input with pull-up
rGPGCON = rGPGCON & ~((3<<6) | (3<<22));
rGPGUP = rGPGUP & ~((1<<3) | (1<<11));
KEY_ROW_R = 0xf;
}
void key_scan_proc(U32 dummy)
{
static int key_last = -1;
int i, j, key = 0xffff;
int tmp;
for(i=0; i<4; i++) /*这个循环是逐行扫描循环*/
{
KEY_ROW_R = ~(1<<i);
for(j=0; j<24; j++);
if(!(rGPFDAT&(1<<0)))
key &= ~(1<<i);
if(!(rGPFDAT&(1<<2)))
key &= ~(1<<(i+4));
if(!(rGPGDAT&(1<<3)))
key &= ~(1<<(i+8));
if(!(rGPGDAT&(1<<11)))
key &= ~(1<<(i+12));
}
tmp = key^key_last;
tmp &= key_last;
key_last = key;
/*下面的代码主要用来获得按键的值*/
if(tmp)
{
for(i=0; i<16; i++)
if(tmp&(1<<i))
{
down_key = key_ch[i];
// printf("key 0x%x %c down!\n", tmp, down_key);
break;
}
}
}
void KeyScanInit(void)
{
int r, c;
down_key = 0;
for(r=0; r<256; r++)
key_matrix[r] = 0;
for(r=0; r<4; r++)
for(c=0; c<4; c++)
key_matrix[(1<<(r+4))+(1<<c)] = key_ch[r*4+c];
set_io();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -