OpenEdv-开源电子网

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

矩阵键盘用寄存器写的,望好心人解答

[复制链接]

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
发表于 2014-2-13 21:01:24 | 显示全部楼层 |阅读模式
#include <stm32f10x_lib.h>                //  B0~PB3行控制线
#include "delay.h"        //  B4~PB7列控制线
#include "KEY4.h"        //  包含矩阵键盘头文件

u8 const Key_Tab[4][4]= //键盘编码表 4x4
{

  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
/*4x4矩阵键盘实现,基本思想:使用线反转法,一:行设置为输出,列设置为输入,此时给行输入0,
 如果列中有低电平,则低电平处为按键按下,找到行坐标X。二:列设置为输出,行设置为输入,此时给列输入0,
 如果列中有低电平,则低电平处为按键按下,找到列坐标Y。通过(X,Y)坐标,就找到相应的键值。*/
u8 Get_KeyValue(void)        //使用线反转法,没有得到键值返回0,否则返回相应行列的键值
{
  
  u8 i=5,j=5;
  u16 temp1,temp2;
  
  RCC->APB2ENR|=1<<3;              //使能PORTB时钟
  // RCC->APB2ENR|=1<<0;              //开启辅助时钟
  JTAG_Set(JTAG_SWD_DISABLE)  ;
  GPIOB->CRL&=0XFFFF0000; 
  GPIOB->CRL|=0X00003333;            //PB0~PB3 推挽输出    
  
  GPIOB->CRL&=0X0000FFFF;          //PB4~PB7 输入
  GPIOB->CRL|=0X88880000;        //PB4~PB7默认上拉

  GPIOB->ODR=0xf0 ; //PB0~PB3置0
  if((GPIOB->IDR & 0X00f0)==0x00f0)  //没有按键
      return 0;
   else
  {   
        delay_ms(10);                //按键消抖
        temp1=(GPIOB->IDR & 0x00f0);
          switch(temp1)
       {
         case 0x00e0:j=0;break;   //0xe0  1110_0000
         case 0x00d0:j=1;break; //0xd0  1101_0000
       case 0x00b0:j=2;break; //0xb0  1011_0000
       case 0x0070:j=3;break;    //0x70  0111_0000 
         default:break;
  }
 
    }
  
  GPIOB->CRL&=0X0000FFFF; 
  GPIOB->CRL|=0X33330000;   //PB4~PB7 推挽输出    
   
  GPIOB->CRL&=0XFFFF0000;   //PB0~PB3 输入
  GPIOB->CRL|=0X00008888; //PB0~PB4 默认下拉

  GPIOB->ODR&=0x0f;            //PB4~PB7置0

  if((GPIOB->IDR & 0x000f)==0x000f)
    return 0;
else
{ //这里不再延时再扫描,因为已经确定了不是抖动才会进入本步操作
       temp2=(GPIOB->IDR & 0x000f);  
    
  switch(temp2)
  {
   case 0x000e:i=0;break;
     case 0x000d:i=1;break;
   case 0x000b:i=2;break;
   case 0x0007:i=3;break;
   default:break;
  }
   }
  if((i==5)||(j==5))
       return 0;
  else
       return (Key_Tab[j]);
}

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

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
 楼主| 发表于 2014-2-13 21:02:52 | 显示全部楼层
代码感觉没问题,但是串口调试没有数据返回
回复 支持 反对

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
 楼主| 发表于 2014-2-13 21:03:31 | 显示全部楼层
int main(void)
{
  u8 key_num;
  Stm32_Clock_Init(9);  //系统时钟设置72M
  delay_init(72);       //延时初始化
  uart_init(72,9600);  //设置串口 1波特率
  while(1)
{
key_num = Get_KeyValue();
switch(key_num)
{
case '*': 
printf("*\n");
break;

case '0': 
printf("0\n");
break;

case '#':
printf("#\n");
break;

case '1': 
printf("1\n");
break;

case '6':
printf("6\n");
break;

case '7':
printf("7\n");
break;

case '8':
printf("8\n");
break;

case '9':
printf("9\n");
break;

case 'D':
printf("D\n");
break;

case '2':
printf("2\n");
break;

case '3':
printf("3\n");
break;

case 'A':
printf("A\n");
break;

case '5':
printf("5\n");
break;

case '4':
printf("4\n");
break;

case 'B':
printf("B\n");
break;

case 'C':
printf("C\n");
break;
}

}  


  

这是主函数,望好心人解答
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
 楼主| 发表于 2014-2-14 00:18:52 | 显示全部楼层
原子哥,那个我看过了,差不多的,而且他那个我也试过也不成功
回复 支持 反对

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
 楼主| 发表于 2014-2-14 00:19:12 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,那个我看过了,差不多的,而且他那个我也试过也不成功
回复 支持 反对

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
 楼主| 发表于 2014-2-14 01:51:52 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
if((GPIOB->IDR & 0X00f0)==0x00f0)   //没有按键
            return 0;
无论按键按不按下都是处在这一步,凌乱了
回复 支持 反对

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
 楼主| 发表于 2014-2-14 02:54:41 | 显示全部楼层
可以用了
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-8-19
在线时间
2 小时
发表于 2014-8-19 20:15:36 | 显示全部楼层
回复【8楼】shortking:
---------------------------------
你的按键怎么可以用了?
回复 支持 反对

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
发表于 2014-8-20 12:13:21 | 显示全部楼层
回复【8楼】shortking:
---------------------------------
什么问题,给个结论。谢谢!
回复 支持 反对

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
 楼主| 发表于 2014-8-24 21:28:01 | 显示全部楼层
回复【10楼】bjtmh:
---------------------------------
很久了,我也记不清了
回复 支持 反对

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
 楼主| 发表于 2014-8-24 21:28:18 | 显示全部楼层
回复【10楼】bjtmh:
---------------------------------
只是小问题而已
回复 支持 反对

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2014-8-25
在线时间
0 小时
发表于 2014-8-25 14:36:07 | 显示全部楼层
发个问题贴,不要这样草草了事好吧= =!!!我还想学点东西呢
回复 支持 反对

使用道具 举报

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
发表于 2014-12-14 17:55:30 | 显示全部楼层
回复【5楼】shortking:
---------------------------------
大神,矩阵键盘给我发一份,感激不尽哇。1126626497@qq.com
酱油团队--
回复 支持 反对

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
 楼主| 发表于 2015-3-27 16:40:23 | 显示全部楼层
回复【9楼】大大大胜:
---------------------------------
回复【10楼】bjtmh:
---------------------------------
确实很久了,记不清了,就记得是C语言的一个小bug,当时没注意到而已,这样吧,我把可以用的代码贴上来,大家可以参考下
回复 支持 反对

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
 楼主| 发表于 2015-3-27 16:43:06 | 显示全部楼层
u8 const Key_Tab[4][4]= //键盘编码表  4x4
{

  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
/*4x4矩阵键盘实现,基本思想:使用线反转法,一:行设置为输出,列设置为输入,此时给行输入0,
 如果列中有低电平,则低电平处为按键按下,找到行坐标X。二:列设置为输出,行设置为输入,此时给列输入0,
 如果列中有低电平,则低电平处为按键按下,找到列坐标Y。通过(X,Y)坐标,就找到相应的键值。*/
u8 Get_KeyValue(void)         //使用线反转法,没有得到键值返回0,否则返回相应行列的键值
{
  
  u8 i=5,j=5;
  u16 temp1,temp2;
  
  RCC->APB2ENR|=1<<3;                //使能PORTB时钟
  // RCC->APB2ENR|=1<<0;                //开启辅助时钟
  JTAG_Set(JTAG_SWD_DISABLE)  ;
  GPIOB->CRL&=0XFFFF0000; 
  GPIOB->CRL|=0X00003333;              //PB0~PB3 推挽输出     
  
  GPIOB->CRL&=0X0000FFFF;            //PB4~PB7 输入
  GPIOB->CRL|=0X88880000;         //PB4~PB7默认上拉

  GPIOB->ODR=0xf0 ; //PB0~PB3置0
  delay_us(1);

  temp1 = GPIOB->IDR & 0x00f0;
  if(temp1==0x00f0)   //没有按键
    {
   
      return 0;
}
   else
  {    
        delay_ms(200);                 //按键消抖
// cord_h = GPIOB->IDR & 0x00f0;
//        printf("1\n");
           switch(temp1)
        {
          case 0x00e0:j=0;break;     //0xe0  1110_0000
          case 0x00d0:j=1;break;  //0xd0  1101_0000
         case 0x00b0:j=2;break; //0xb0  1011_0000
         case 0x0070:j=3;break;     //0x70  0111_0000 
          default: break;
   }
 
    }
 
  GPIOB->CRL&=0X0000FFFF; 
  GPIOB->CRL|=0X33330000;    //PB4~PB7 推挽输出     
   
  GPIOB->CRL&=0XFFFF0000;    //PB0~PB3 输入
  GPIOB->CRL|=0X00008888; //PB0~PB4 默认下拉

  GPIOB->ODR=0x0f;              //PB4~PB7置0
  delay_us(1);
  temp2=GPIOB->IDR & 0x000f ;
  if(temp2==0x000f)
    return 0;
else
{ //这里不再延时再扫描,因为已经确定了不是抖动才会进入本步操作
       temp2=GPIOB->IDR & 0x000f;  
       delay_us(1);
//    printf("%d",temp2);
   switch(temp2)
   {
     case 0x000e:i=0;break;
         case 0x000d:i=1;break;
     case 0x000b:i=2;break;
     case 0x0007:i=3;break;
     default:break;
   }
   }
  if((i==5)||(j==5))
       return 0;
  else
       return (Key_Tab[j]);
}
回复 支持 反对

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
 楼主| 发表于 2015-3-27 16:43:48 | 显示全部楼层
这是我的.c代码,需要工程的可以留邮箱
回复 支持 反对

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-11-27
在线时间
12 小时
 楼主| 发表于 2015-3-27 16:48:44 | 显示全部楼层
回复【14楼】xiaolong12:
---------------------------------
已发送你邮箱
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-4-24
在线时间
0 小时
发表于 2015-4-24 11:13:16 | 显示全部楼层
大神,麻烦给我发一下吧,谢谢啦!shutinghu2014@126.com
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-12-28
在线时间
5 小时
发表于 2015-5-13 20:10:12 | 显示全部楼层
能不能给我发一份你的4x4键盘工程文件!谢谢443713497@qq.com
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-5-14
在线时间
0 小时
发表于 2015-5-26 11:04:37 | 显示全部楼层
给我一个  532997830@qq.com
回复 支持 反对

使用道具 举报

8

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2015-3-31
在线时间
0 小时
发表于 2015-9-18 21:21:57 | 显示全部楼层
回复【17楼】shortking:
---------------------------------
377952112@qq.com
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-9-19
在线时间
1 小时
发表于 2015-9-19 14:14:48 | 显示全部楼层
1170622254@qq.com 多谢
回复 支持 反对

使用道具 举报

29

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2012-6-15
在线时间
161 小时
发表于 2015-11-2 15:04:31 | 显示全部楼层
751467039@qq.com,楼主给一个做参考,谢谢啦!
兴趣使人出色
回复 支持 反对

使用道具 举报

24

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
856
金钱
856
注册时间
2015-10-9
在线时间
275 小时
发表于 2015-11-4 10:42:13 | 显示全部楼层
回复【18楼】shortking:
---------------------------------
可不可以给我发一份工程文件  303382968@qq.com
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-11-22
在线时间
0 小时
发表于 2015-11-29 13:24:13 | 显示全部楼层
944782334@qq.com麻烦给下工程文件  谢啦
回复 支持 反对

使用道具 举报

16

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-9-16
在线时间
2 小时
发表于 2015-11-30 15:06:15 | 显示全部楼层
楼主,可以共享下扫描键盘程序么?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-12-21
在线时间
4 小时
发表于 2019-12-26 04:40:20 | 显示全部楼层
老哥,不好意思打扰了,我看到您14年发的关于4x4键盘寄存器版的程序帖子,我是一个刚入门的学生,看了您的代码大概弄清楚了是咋样的流程,想问下能不能要下您的头文件,因为我捣鼓了一下,,没成功。感觉是头文件里漏了什么东西。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 00:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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