OpenEdv-开源电子网

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

自制独立按键扫描问题

[复制链接]

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
发表于 2015-8-9 21:05:42 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);//使能PORTA,PORTC时钟 // GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PC2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//PA12 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;//PA13 14 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置成推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA13 14 } //按键处理函数 //返回按键值 //mode:0,不支持连续按;1,支持连续按; //返回值: //0,没有任何按键按下 //KEY0_PRES,KEY0按下 //KEY1_PRES,KEY1按下 //WKUP_PRES,WK_UP按下 //注意此函数有响应优先级,KEY0>KEY1>WK_UP!! u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按键按松开标志 if(mode)key_up=1; PAout(14)=0; PAout(13)=1; // PAout(12)=1; if(key_up&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)==0) { delay_ms(10); key_up=0; if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)==0) return 1; }else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)==1)key_up=1; return 0;// 无按键按下 } #include "stm32f10x.h" #include "pwm.h" #include "led.h" #include "sys.h" #include "key.h" #include "delay.h" //TIM1_PWM_Init(u16 arr,u16 psc); void Delay(u32 count) { u32 i=0; for(;i<count;i++); } int main(void) { u8 t=0; // u16 led0pwmval=0; // u8 dir=1; // delay_init(); //延时函数初始化 LED_Init(); //初始化与LED连接的硬件接口 KEY_Init(); // TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz // TIM_SetCompare1(TIM1,300); // TIM_SetCompare4(TIM1,300); while(1) { t=KEY_Scan(0); switch(t) { case 1: PCout(2)=1; break; default: delay_ms(10); } } } 各位大神,程序的目的是PA14一直输出低电平给按键一端,用PA12检测按键另一端的电平,如果按键按下由PC2输出高电平,可是程序一直输出不了高电平,求解各位[/mw_shl_code]

最佳答案

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

PA14的使用,要先禁止JTAG.
奋斗才能新生
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-9 21:05:43 | 显示全部楼层
PA14的使用,要先禁止JTAG.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-8-9 21:05:43 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,我找出来了,是我把delay_init();给屏蔽了,忘了打开,以后一定好好检查程序,长教训了
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-8-9 21:52:22 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
禁止了也不行啊
奋斗才能新生
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-9 23:20:30 | 显示全部楼层
回复【3楼】待机唤醒:
---------------------------------
可以的,你不会禁止罢了。参考我们mini板的按键输入实验吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-8-10 10:47:48 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,我把PA14改为PC3也不行啊,求不吝赐教
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-8-10 16:56:34 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
void KEY_Init(void)
{

GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);//使能PORTA,PORTC时钟

// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试


GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2 | GPIO_Pin_3;//PC2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC2

GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12;//PA12
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA12

// GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13 | GPIO_Pin_7;//PA13 14
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置成推挽输出
//  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA13 14

//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//返回值:
//0,没有任何按键按下
//KEY0_PRES,KEY0按下
//KEY1_PRES,KEY1按下
//WKUP_PRES,WK_UP按下 
//注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
u8 KEY_Scan(u8 mode)
{  
static u8 key_up=1;//按键按松开标志
if(mode)key_up=1; 
    PCout(3)=0;
    Cout(2)=1;
// PAout(12)=1;
if(key_up&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)==0)
{   
// delay_ms(10);
key_up=0;
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)==0)
      return 1;

}else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)==1)key_up=1;       
return 0;// 无按键按下
}
这样改,对不对?
奋斗才能新生
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-10 22:11:38 | 显示全部楼层
回复【6楼】待机唤醒:
---------------------------------
 IO要根据硬件电路,先设置上下拉,你没设置。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-8-11 10:51:58 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
不是很懂,麻烦原子哥讲的详细一点,感激不尽
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-8-11 14:52:46 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
#include "key.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK Mini STM32开发板
//按键输入 驱动代码    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2014/3/06
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved    
//////////////////////////////////////////////////////////////////////////////////  
      
//按键初始化函数 
//PA15和PC5 设置成输入
void KEY_Init(void)
{

GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟

// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试


GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3;// C3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //IO口速度为50MHz
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC2,3
GPIO_ResetBits(GPIOC,GPIO_Pin_3);

GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2 ;//PC2  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //IO口速度为50MHz
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC2,3
GPIO_SetBits(GPIOC,GPIO_Pin_2);


GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;//PC1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //IO口速度为50MHz
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC1
GPIO_SetBits(GPIOC,GPIO_Pin_1);



//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//返回值:
//0,没有任何按键按下
//KEY0_PRES,KEY0按下
//KEY1_PRES,KEY1按下
//WKUP_PRES,WK_UP按下 
//注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
u8 KEY_Scan(u8 mode)
{  
static u8 key_up=1;//按键按松开标志
if(mode)key_up=1; 
GPIO_SetBits(GPIOC,GPIO_Pin_2);
GPIO_ResetBits(GPIOC,GPIO_Pin_3);
if(key_up&&GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==0)
{   GPIO_ResetBits(GPIOC,GPIO_Pin_2);
delay_ms(10);
key_up=0;
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==0)

GPIO_ResetBits(GPIOC,GPIO_Pin_2);
return 1;
}
}else if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==1)key_up=1;       
return 0;// 无按键按下
}



#include "stm32f10x.h"
#include "pwm.h"
#include "led.h"
#include "sys.h"
#include "key.h"
#include "delay.h"


//TIM1_PWM_Init(u16 arr,u16 psc);

 void Delay(u32 count)
 {
  u32 i=0;
  for(;i<count;i++);

 }
 int main(void)
 { u8 t=0;
// u16 led0pwmval=0;    
// u8 dir=1;
// delay_init();       //延时函数初始化   
// LED_Init();    //初始化与LED连接的硬件接口
KEY_Init(); 
// TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz 
//  TIM_SetCompare1(TIM1,300);
//  TIM_SetCompare4(TIM1,300);  
    while(1)
{
     t=KEY_Scan(0);
switch(t)
{  
case 1:
 Cout(2)=0;
break;
         default:
delay_ms(10);
 }

   
}  
 




原子哥,麻烦帮忙看看哪里不对?我这几天一直纠结哪里出问题了,论坛里关于矩阵键盘的程序我看了很多,感觉我这个程序没什么错误,可是PC2就是不输出低电平,搞得我都快没信心了,麻烦哥帮帮忙,感激不尽啊>
奋斗才能新生
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-11 22:48:32 | 显示全部楼层
回复【10楼】待机唤醒:
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-23 20:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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