OpenEdv-开源电子网

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

矩阵键盘问题

[复制链接]

10

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
817
金钱
817
注册时间
2016-2-5
在线时间
163 小时
发表于 2016-8-20 18:25:12 | 显示全部楼层 |阅读模式
10金钱
之前也在论坛里求助过矩阵键盘的问题,后来自己解决了,但是文件被我一下犯2误删除找不回了,所以自己有重新写了一遍之后一直提示存放键值的变量定义未使用,在主函数中用extern调用这个变量报错,最后没办法又改成了返回值的形式但是出让我很摸不着头脑的问题。开始用的PC0~6但是发现只有前4个有用,4-8按下去居然执行的9-12的内容,试了好多遍我把C口换成了F口,全部正常,但是看战舰IO分配表上面显示不连接OLED的时候PC0-6是完全独立的啊。到底是我写的有问题还是我的C口有问题,请大神看一下,附上代码[mw_shl_code=c,true]# include "key.h"
# include "delay.h"


void key_init(void)
{
        RCC->APB2ENR |= 1<<7;
               
        GPIOF->CRL &= 0xf0000000;
        GPIOF->CRL |= 0x08888333;
       
        GPIOF->ODR |= 7<<0;                //初始状态0000111,低三位是行当某一行有按键按下,对应列被拉高
}


u8 Read_KeyValue(void)
{
        u8 KeyValue;                                        //存放键值变量
        if((GPIOF->IDR & 0x7f) != 0x07)  //判断是否按键按下                                                            
        {
                delay_ms(8);                 //消抖                                       
                if((GPIOF->IDR & 0x7f) != 0x07)  //在此判断                                            
                {       
                        GPIOF->BSRR = 0x01;          //第一行先高                                                         
                        GPIOF->BRR = 0x06;           //其余行拉低                                          
                        switch(GPIOF->IDR & 0x7f)    //读取IDR寄存器内容                                                
                        {                        
                                case 0x09: KeyValue = 1; break;     //如果是0001001则是第一个按键按下,下面一样                        
                                case 0x11: KeyValue = 2; break;                                
                                case 0x21: KeyValue = 3; break;                           
                                case 0x41: KeyValue = 4; break;                       
                        }

                        GPIOF->BSRR = 0x02;         //拉高第二行                                                                    
                        GPIOF->BRR = 0x05;                        
                        switch(GPIOF->IDR & 0x7f)                                                      
                        {                        
                                case 0x0a: KeyValue = 5; break;                              
                                case 0x12: KeyValue = 6; break;                              
                                case 0x22: KeyValue = 7; break;                              
                                case 0x42: KeyValue = 8; break;                       
                        }
                       
                        GPIOF->BSRR = 0x04;                                                                           
                        GPIOF->BRR = 0x03;                        
                        switch(GPIOF->IDR & 0x7f)                                                      
                        {                        
                                case 0x0c: KeyValue = 9; break;                             
                                case 0x14: KeyValue = 10; break;                              
                                case 0x24: KeyValue = 11; break;                              
                                case 0x44: KeyValue = 12; break;                       
                        }
                       
                        GPIOF->BSRR = 0x07;      //回到初始状态0000111                                                                        
                        GPIOF->BRR = 0x78;                                       
                       
                        while((GPIOF->IDR & 0x7f) != 0x07);  //等待按键释放
                        return KeyValue;                //放回键值       
                }
        }
        return 0;                //无按键按下返回0
}
[/mw_shl_code]


主函数代码[mw_shl_code=c,true]# include "led.h"
# include "delay.h"
# include "key.h"

int main(void)
{
        u8 key = 0;
        Stm32_Clock_Init(9);
        delay_init(72);
        led_init();
        key_init();
        while(1)
        {
                key = Read_KeyValue();
                switch(key)
                {
                        case 1: LED0 = 0; break;
                        case 2:        LED1 = 0; break;
                        case 3: LED0 = 1; break;
                        case 4:        LED1 = 1; break;
                        case 5:        LED0 = !LED0; break;
                        case 6: LED1 = !LED1; break;
                        case 7: LED0 = 0; LED1 = 1; break;
                        case 8: LED0 = 1; LED1 = 0; break;
                        case 9: LED0 = 0; LED1 = 0; break;
                        case 10: LED0 = 1; LED1 = 1; break;
                        case 11: LED0 = 0; LED1 = 0; break;
                        case 12: LED0 = 1; LED1 = 1; break;
                }
        }
}
[/mw_shl_code]




不甘黄土掩枯骨,宁化寒光映碧霄。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
817
金钱
817
注册时间
2016-2-5
在线时间
163 小时
 楼主| 发表于 2016-8-21 08:25:12 | 显示全部楼层
不甘黄土掩枯骨,宁化寒光映碧霄。
回复

使用道具 举报

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2016-8-19
在线时间
13 小时
发表于 2016-8-21 17:45:21 | 显示全部楼层
用库函数写的,希望对你有启发
#include "pbdata.h"
#include "Key_scanf.h"

#define Hang_00_L GPIO_ResetBits(GPIOE,GPIO_Pin_15)
#define Hang_00_H GPIO_SetBits(GPIOE,GPIO_Pin_15)

#define Hang_01_L GPIO_ResetBits(GPIOB,GPIO_Pin_11)
#define Hang_01_H GPIO_SetBits(GPIOB,GPIO_Pin_11)

#define Hang_02_L GPIO_ResetBits(GPIOB,GPIO_Pin_13)
#define Hang_02_H GPIO_SetBits(GPIOB,GPIO_Pin_13)

#define Hang_03_L GPIO_ResetBits(GPIOB,GPIO_Pin_15)
#define Hang_03_H GPIO_SetBits(GPIOB,GPIO_Pin_15)

#define Lie_00_V GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9)
#define Lie_01_V GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11)
#define Lie_02_V GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_13)
#define Lie_03_V GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_15)
#define jpys 20
void KEY_Scanf(void)
{
  //μúò&#187;DD
  Hang_00_L;
  Hang_01_H;
  Hang_02_H;
  Hang_03_H;

  if(Lie_00_V==0)
  {
          delay_ms(jpys);
        if(Lie_00_V==0)
          {
                printf("0\r\n");
          }
  }

  if(Lie_01_V==0)
  {
          delay_ms(jpys);
        if(Lie_01_V==0)
          {
                printf("1\r\n");
          }
  }

  if(Lie_02_V==0)
  {
          delay_ms(jpys);
        if(Lie_02_V==0)
          {
                printf("2\r\n");
          }
  }
  if(Lie_03_V==0)
  {
          delay_ms(jpys);
        if(Lie_03_V==0)
          {
                printf("3\r\n");
          }
  }



  //μú&#182;tDD
  Hang_00_H;
  Hang_01_L;
  Hang_02_H;
  Hang_03_H;

  if(Lie_00_V==0)
  {
          delay_ms(jpys);
        if(Lie_00_V==0)
          {
                printf("4\r\n");
          }
  }

  if(Lie_01_V==0)
  {
          delay_ms(jpys);
        if(Lie_01_V==0)
          {
                printf("5\r\n");
          }
  }

  if(Lie_02_V==0)
  {
          delay_ms(jpys);
        if(Lie_02_V==0)
          {
                printf("6\r\n");
          }
  }
  if(Lie_03_V==0)
  {
          delay_ms(jpys);
        if(Lie_03_V==0)
          {
                printf("7\r\n");
          }
  }

  //μúèyDD
  Hang_00_H;
  Hang_01_H;
  Hang_02_L;
  Hang_03_H;

  if(Lie_00_V==0)
  {
          delay_ms(jpys);
        if(Lie_00_V==0)
          {
                printf("8\r\n");
          }
  }

  if(Lie_01_V==0)
  {
          delay_ms(jpys);
        if(Lie_01_V==0)
          {
                printf("9\r\n");
          }
  }

  if(Lie_02_V==0)
  {
          delay_ms(jpys);
        if(Lie_02_V==0)
          {
                printf("A\r\n");
          }
  }
  if(Lie_03_V==0)
  {
          delay_ms(jpys);
        if(Lie_03_V==0)
          {
                printf("B\r\n");
          }
  }


  //μú&#203;&#196;DD
  Hang_00_H;
  Hang_01_H;
  Hang_02_H;
  Hang_03_L;

  if(Lie_00_V==0)
  {
          delay_ms(jpys);
        if(Lie_00_V==0)
          {
                printf("C\r\n");
          }
  }

  if(Lie_01_V==0)
  {
          delay_ms(jpys);
        if(Lie_01_V==0)
          {
                printf("D\r\n");
          }
  }

  if(Lie_02_V==0)
  {
          delay_ms(jpys);
        if(Lie_02_V==0)
          {
                printf("E\r\n");
          }
  }
          if(Lie_03_V==0)
  {
          delay_ms(jpys);
        if(Lie_03_V==0)
          {
                printf("F\r\n");
          }
  }

}


void KEY_GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;       
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);  
       
       
        //&#188;ü&#197;ì DD
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
       

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;
        GPIO_Init(GPIOE,&GPIO_InitStructure);
    //áD
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_Init(GPIOD,&GPIO_InitStructure);
}


回复

使用道具 举报

10

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
817
金钱
817
注册时间
2016-2-5
在线时间
163 小时
 楼主| 发表于 2016-8-21 21:01:28 | 显示全部楼层
18419951276 发表于 2016-8-21 17:45
用库函数写的,希望对你有启发
#include "pbdata.h"
#include "Key_scanf.h"

- - 感觉还是喜欢寄存器的,不过还是谢谢了,我看看是什么个流程在写成寄存器看看
不甘黄土掩枯骨,宁化寒光映碧霄。
回复

使用道具 举报

5

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-7-27
在线时间
13 小时
发表于 2016-8-31 20:53:17 | 显示全部楼层
请问一下你的4x4键盘是买的,然后自己编程用吗?
回复

使用道具 举报

10

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
817
金钱
817
注册时间
2016-2-5
在线时间
163 小时
 楼主| 发表于 2016-8-31 21:08:35 | 显示全部楼层
Qinduey 发表于 2016-8-31 20:53
请问一下你的4x4键盘是买的,然后自己编程用吗?

自己做的,然后写的程序
不甘黄土掩枯骨,宁化寒光映碧霄。
回复

使用道具 举报

10

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
817
金钱
817
注册时间
2016-2-5
在线时间
163 小时
 楼主| 发表于 2016-8-31 23:02:47 | 显示全部楼层
Qinduey 发表于 2016-8-31 20:53
请问一下你的4x4键盘是买的,然后自己编程用吗?

你要是要我可以发你参考下,但是之前那个原因我还是没找到,但是在F口能正常使用
不甘黄土掩枯骨,宁化寒光映碧霄。
回复

使用道具 举报

5

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-7-27
在线时间
13 小时
发表于 2016-9-1 08:20:54 | 显示全部楼层
夜乄歌 发表于 2016-8-31 23:02
你要是要我可以发你参考下,但是之前那个原因我还是没找到,但是在F口能正常使用

可以发给我吗?拿来参考下也许有帮助学习。。那就先谢啦
回复

使用道具 举报

10

主题

71

帖子

0

精华

高级会员

Rank: 4

积分
817
金钱
817
注册时间
2016-2-5
在线时间
163 小时
 楼主| 发表于 2016-9-7 10:01:28 | 显示全部楼层
Qinduey 发表于 2016-9-1 08:20
可以发给我吗?拿来参考下也许有帮助学习。。那就先谢啦

.......这几天在忙着搞其他项目,SORRY,你看你+我QQ吧我发给你454730034
不甘黄土掩枯骨,宁化寒光映碧霄。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 19:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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