OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5537|回复: 3

新手关于STM32矩阵键盘问题

[复制链接]

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-9-4
在线时间
18 小时
发表于 2012-9-4 14:26:19 | 显示全部楼层 |阅读模式
首先放上代码

struct io_port 
{                                            
GPIO_TypeDef *GPIO_x;                 
unsigned short GPIO_pin;
}; 
static struct io_port key_output[6] = {
{GPIOC, GPIO_Pin_1}, {GPIOC, GPIO_Pin_2},
{GPIOC, GPIO_Pin_3}, {GPIOC, GPIO_Pin_4},
{GPIOC, GPIO_Pin_5}, {GPIOC, GPIO_Pin_6}
};
static struct io_port key_input[6] = {
{GPIOC, GPIO_Pin_9}, {GPIOC, GPIO_Pin_10},
{GPIOC, GPIO_Pin_11}, {GPIOC, GPIO_Pin_12},
{GPIOC, GPIO_Pin_13}, {GPIOC, GPIO_Pin_14}
};

unsigned char key[6][6];
void keyboard_init(void)                                   //GPIOC_1-GPIOC_6是输出,全部置1
{
    unsigned char i; 
    for(i = 0; i < 6; i++)
    {
     GPIO_SetBits(key_output.GPIO_x, key_output.GPIO_pin);
    }
}

void update_key(void)
{
unsigned char i, j;
for(i = 0; i < 6; i++)                //i是输出口,依次置低电平
{
  GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);   
  for(j = 0; j < 6; j++)            //j是输入口,当键按下时导通被置为低电平  
    {
        //          if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)
        ///          {        
        //            delay(10);
                        if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)          
               key[j] = 1;                                
             else
               key[j] = 0;
          //          }
    }
  GPIO_SetBits(key_output.GPIO_x, key_output.GPIO_pin);
}
}

int key_value(void)
{
unsigned char keydata;
keyboard_init();
update_key();

      if(key[0][0]) keydata=1;
else if(key[0][1]) keydata=2;
else if(key[0][2]) keydata=3;
else if(key[0][3]) keydata=4;
else if(key[0][4]) keydata=5;
else if(key[0][5]) keydata=6;

else if(key[1][0]) keydata=7;
else if(key[1][1]) keydata=8;
else if(key[1][2]) keydata=9;
else if(key[1][3]) keydata=10;
else if(key[1][4]) keydata=11;
else if(key[1][5]) keydata=12;

else if(key[2][0]) keydata=13;
else if(key[2][1]) keydata=14;
else if(key[2][2]) keydata=15;
else if(key[2][3]) keydata=16;
else if(key[2][4]) keydata=17;
else if(key[2][5]) keydata=18;

else if(key[3][0]) keydata=19;
else if(key[3][1]) keydata=20;
else if(key[3][2]) keydata=21;
else if(key[3][3]) keydata=22;
else if(key[3][4]) keydata=23;
else if(key[3][5]) keydata=24;

else if(key[4][0]) keydata=25;
else if(key[4][1]) keydata=26;
else if(key[4][2]) keydata=27;
else if(key[4][3]) keydata=28;
else if(key[4][4]) keydata=29;
else if(key[4][5]) keydata=30;

else if(key[5][0]) keydata=31;
else if(key[5][1]) keydata=32;
else if(key[5][2]) keydata=33;
else if(key[5][3]) keydata=34;
else if(key[5][4]) keydata=35;
else if(key[5][5]) keydata=36;
else ;
return keydata;
}

程序如上的时候,按键什么的输出正常,但是因为没有消除抖动,会有小问题。在去掉程序中的斜杠,加上消抖的时候,程序不正常执行了,按下某一个按键之后,就会死掉,求教为什么啊 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-4 21:17:28 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2013-9-4
在线时间
0 小时
发表于 2013-9-4 14:38:33 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥  我现在在写一个4*4的键盘矩阵程序 用的方法跟楼上的这位的一样,可是我这个程序还需要识别出单击 双击  想了一天 没什么思路 请问你能不能给点建议呀  谢了哈
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-4 17:02:56 | 显示全部楼层
回复【3楼】voncaesar:
---------------------------------
无非就是检测两次按下的间隔了。
如果两次按下间隔大于一定时间就认为是单击,小于一定时间就是双击,这个间隔时间自己把控。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-13 13:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表