#define BIT0 1
#define BIT1 2
#define BIT2 4
#define BIT3 8
#define BIT4 16
uchar row0key;
uchar row1key;
uchar row2key;
uchar row3key;
char key_map[5][4]={{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}}; //定义5行4列键值
uchar gpio_read_cols( )
{
uchar col_byte=0xFF;
if(!gpio_get_value(col0))
col_byte&=(~BIT0);
if(!gpio_get_value(col1))
col_byte&=(~BIT1);
if(!gpio_get_value(col2))
col_byte&=(~BIT2);
if(!gpio_get_value(col3))
col_byte&=(~BIT3);
if(!gpio_get_value(col4))
col_byte&=(~BIT4);
return col_byte;
}
uchar gpio_read_row(int row)
{
gpio_set_value(row,0); //扫描行设置为0
uchar keys=gpio_read_cols();
gpio_set_value(row,1); //扫描行设置为1
}
int read_row_keys( )
{
row0key=gpio_read_row(row0);
row1key=gpio_read_row(row1);
row2key=gpio_read_row(row2);
row3key=gpio_read_row(row3);
msleep(2); //防止抖动 , 最好是在一个防抖周期类,读完所有按键, 如果每读一个按键 做一次防抖, 延时周期有点长,会丢失按键
row0key&=gpio_read_row(row0);
row1key&=gpio_read_row(row1);
row2key&=gpio_read_row(row2);
row3key&=gpio_read_row(row3);
}
void init_row_pins()
{
gpio_direction_ouput(row0,1);
gpio_direction_ouput(row1,1);
gpio_direction_ouput(row2,1);
gpio_direction_ouput(row3,1);
}
uchar * get_key_map()
{
uchar ukey[5,4];
memset(ukey,0,sizeof(ukey));
read_row_keys(); //读取所有按键
for(int i=0;i<5;i++)
{
if((row0key>>i)&BIT0)==0) //行上有按键按下
ukey[i][0]=1;
if((row1key>>i)&BIT0)==0) //行上有按键按下
ukey[i][1]=1;
if((row2key>>i)&BIT0)==0) //行上有按键按下
ukey[i][2]=1;
if((row3key>>i)&BIT0)==0) //行上有按键按下
ukey[i][3]=1;
}
return ukey;
}
简单的矩阵按键扫描
最新推荐文章于 2024-03-01 12:46:58 发布