zz-C语言4x4按键扫描141105

//zz//###################################################################################

zz-C语言4x4按键扫描141105


@2014-11-5 16:33:32
@2014-11-3 11:51:56
@

REF:


//zz//###################################################################################
1.
以51单片机为示例,P1口低4位为行扫描
P1口高4位为列作输入...
返回按键编号 0~15 ,若为16则表示没有按键被按下


int kbscan()
{
int li_row =0;
int li_col =0;

//zz// P1 口 0~3 bits 作为行扫描引脚
for(li_row=0; li_row<4; li_row++)
{
P1 = ~(1<<li_row);

//zz// P1 口 4~7 bits 作为列输入引脚 
for(li_col=0; li_col<4; li_col++)
{
if( (P1>>4) & (1<<li_col))
return(li_row*4 + li_col);
}
}

return 16;
}


//zz//###################################################################################
2.
扩展1,多个按键按下

int multi_kbscan(int *key_cnt,int *key_first,int *key_last)
{
int li_row =0;
int li_col =0;

*key_cnt = 0;
*key_first = 16;
*key_first = 16;

//zz// P1 口 0~3 bits 作为行扫描引脚
for(li_row=0; li_row<4; li_row++)
{
P1 = ~(1<<li_row);

//zz// P1 口 4~7 bits 作为列输入引脚 
for(li_col=0; li_col<4; li_col++)
{
if( (P1>>4) & (1<<li_col))
{
// return(li_row*4 + li_col);
if(*key_cnt ==0)
{
*key_first = li_row*4+li_col;
}
else
{
*key_last = li_row*4 + li_col;
}
*key_cnt += 1;
}
}
}

return(*key_cnt);
}

//zz//###################################################################################
3.
扩展2,按键数量多,用宏定义,假设P1的引脚数能满足row,P2的引脚数能满足column


#define CFG_KEYROW_MAX (4)
#define CFG_KEYCOL_MAX (4)


int multi_kbscan(int *key_cnt,int *key_first,int *key_last)
{
int li_row =0;
int li_col =0;

*key_cnt = 0;
*key_first = 16;
*key_first = 16;

//zz// P1 口 0~3 bits 作为行扫描引脚
for(li_row=0; li_row<CFG_KEYROW_MAX; li_row++)
{
P1 = ~(1<<li_row);

//zz// P1 口 4~7 bits 作为列输入引脚 
for(li_col=0; li_col<CFG_KEYCOL_MAX; li_col++)
{
if( (P2 & (1<<li_col))
{
// return(li_row*4 + li_col);
if(*key_cnt ==0)
{
*key_first = li_row*4+li_col;
}
else
{
*key_last = li_row*4 + li_col;
}
*key_cnt += 1;
}
}
}

return(*key_cnt);

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值