打印

STM32 矩阵键盘驱动问题

[复制链接]
4192|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32 矩
阵键盘驱动问题
void Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

/*PD8,9,10,11下拉输入*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  //下拉输入
GPIO_Init(GPIOD, &GPIO_InitStructure);

/*PD12,13,14,15推挽输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);

/* PD3,4,5,6按键输入*/
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
/**************************************************************
** 函数名:pollingkey
** 功能:扫描键盘
** 注意事项:属于键盘系统必须移植的函数之一
   这个扫描过程是不延迟的,此函数仅为扫描键盘的硬件底层,
**    用户函数需要多番调用此函数实现消抖,
**    可在此函数中实现键值的转换,也可在键盘应用层再转换.
***************************************************************/
#define KEY_OUT_LINE_NULL GPIOD->BRR=0x0f<<12  /*清除所有输出*/
#define KEY_OUT_LINE1  GPIOD->BSRR=0x01<<12 /*输出第一行*/
#define KEY_OUT_LINE2  GPIOD->BSRR=0x02<<12 /*输出第二行*/
#define KEY_OUT_LINE3  GPIOD->BSRR=0x04<<12 /*输出第三行*/
#define KEY_OUT_LINE4  GPIOD->BSRR=0x08<<12 /*输出第四行*/

#define KEY_IN    ((GPIOD->IDR&(GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11))>>8)  /*获取输入直接移位到低端*/
#define KEY_LEFT_IN   (!(GPIOD->IDR&GPIO_Pin_3))
#define KEY_RIGHT_IN  (!(GPIOD->IDR&GPIO_Pin_5))
#define KEY_UP_IN   (!(GPIOD->IDR&GPIO_Pin_4))
#define KEY_DOWN_IN   (!(GPIOD->IDR&GPIO_Pin_6))

//硬件搜索键盘,暂时不支持重键
HALKEY_TYPE PollingKey(void)
{
u8 i;
u16 hal_key=0;
//1.先检测方向键
if(KEY_LEFT_IN)
  return 17;
else if(KEY_RIGHT_IN)
  return 18;
else if(KEY_UP_IN)
  return 19;
else if(KEY_DOWN_IN)
  return 20;
//2.再检测行列键
KEY_OUT_LINE_NULL;
KEY_OUT_LINE1;
hal_key|=KEY_IN;

KEY_OUT_LINE_NULL;
KEY_OUT_LINE2;
hal_key|=KEY_IN<<4;

KEY_OUT_LINE_NULL;
KEY_OUT_LINE3;
hal_key|=KEY_IN<<8;

KEY_OUT_LINE_NULL;
KEY_OUT_LINE4;
hal_key|=KEY_IN<<12;

//转换行列键值为硬件值
//先转换这个程序定义好的复合键,具体为什么是这个数值,和硬件的排列有关
if(hal_key==0x0030)
  return 21;


//单简单的转换一下,以数值键中以低键优先
for(i=1;i<17;i++)
{
  if(hal_key&0x01)
  {
   return i;
  }
  hal_key>>=1;
}
return(0);
}

请问上面的代码中红色的部分都说的是什么意思?为什么要用推免输出模式?

相关帖子

沙发
pangencao| | 2013-6-12 14:17 | 只看该作者
红字1,引脚配置
2,输入输出定义
3,扫描检测过程,每个按键1个bit
推挽输出为叫较正常输出

使用特权

评论回复
板凳
anazel| | 2016-2-20 07:02 | 只看该作者
没有消抖处理?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

11

帖子

1

粉丝