OpenEdv-开源电子网

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

矩阵按键扫描问题

[复制链接]

9

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-9-20
在线时间
6 小时
发表于 2014-7-31 15:30:08 | 显示全部楼层 |阅读模式
5金钱
我开始做了4*4的矩阵键盘,用的是pc0-pc7,按键是正常的,现在由于需要我把他缩成3*3的键盘,用的是pb10~pb15,但是值出来是错的,没按都出来键值,是不是pb口这几个口复用了,待会把代码粘上,有人遇到过么,我现在板子做出来了,所以不能改io口了。
IO口初始化函数:

void KEY_Init(void) //IO??????
{
  GPIO_InitTypeDef GPIO_InitStructure;
 //??????KEY0-->GPIOA.13,KEY1-->GPIOA.15  ???­????
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//????PORTA,PORTE?±??

 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);  //??·?PB3 ???? PB4 //
 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);  //??·?PA13 14 15//
 
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//PE2~4
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //?è???????­????
  GPIO_Init(GPIOE, &GPIO_InitStructure);//??????GPIOE2,3,4
 
 GPIO_InitStructure.GPIO_Pin  = 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(GPIOB, &GPIO_InitStructure);
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //?è???????­????
 GPIO_Init(GPIOB, &GPIO_InitStructure); //???ó°??ü??????P13~P15
}


按键扫描函数:
int Key_Scan(void)
{
 int KEY_Value=-1;
 GPIO_Write(GPIOB,((GPIOB->ODR&0x1fff)|0xE000));
 if((GPIOB->IDR&0x1C00)==0X0000)
   return -1;
 else
 {
   delay_ms(5);  //???±5ms?ó  ??????
  if((GPIOB->IDR&0x1C00)==0X0000)
   return -1; 
   }
  GPIO_Write(GPIOB,((GPIOB->ODR&0x1fff)|0x2000)); 
 switch(GPIOB->IDR&0x1C00)  //PB
 {
  case 0x0400: KEY_Value=9; break;
  case 0x0800: KEY_Value=6; break;
  case 0x1000: KEY_Value=3; break;
 }
  GPIO_Write(GPIOB,((GPIOB->ODR&0x1fff)|0x4000)); 
 switch(GPIOB->IDR&0x1C00)  
 {
  case 0x0400: KEY_Value=8; break;
  case 0x0800: KEY_Value=5; break;
  case 0x1000: KEY_Value=2; break;
 }
  GPIO_Write(GPIOB,((GPIOB->ODR&0x1fff)|0x8000)); 
 switch(GPIOB->IDR&0x1C00)  
 {
  case 0x0400: KEY_Value=7; break;
  case 0x0800: KEY_Value=4; break;
   case 0x1000: KEY_Value=1; break;
 }
  return  KEY_Value;
}


现在我能按 456  789键值  但是123按不出来   发现PB12口没有用

最佳答案

查看完整内容[请看2#楼]

问题已解决,程序正确,p12坏了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-9-20
在线时间
6 小时
 楼主| 发表于 2014-7-31 15:30:09 | 显示全部楼层
问题已解决,程序正确,p12坏了
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1844
金钱
1844
注册时间
2014-6-27
在线时间
983 小时
发表于 2014-7-31 15:49:28 | 显示全部楼层
如果有复用功能的,比如JTAG,把复用功能关了就行了,如果不是,就是其他问题,检测下程序吧。
回复

使用道具 举报

9

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-9-20
在线时间
6 小时
 楼主| 发表于 2014-7-31 17:18:26 | 显示全部楼层
回复【2楼】TinyBoy:
---------------------------------
这里没有jtag复用   我也把jtag的关了
回复

使用道具 举报

9

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-9-20
在线时间
6 小时
 楼主| 发表于 2014-7-31 17:28:22 | 显示全部楼层
回复【2楼】TinyBoy:
---------------------------------
这里没有jtag复用   我也把jtag的关了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 16:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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