OpenEdv-开源电子网

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

请大家帮我看看这个按键扫描出来的键值为什么跟我按下的不一样(我按下的是key2,但是串口打印出来的是key0的键值)谢谢大家

[复制链接]

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2020-3-3
在线时间
85 小时
发表于 2020-4-1 17:55:42 | 显示全部楼层 |阅读模式
////main.c
int main(void)
{
         //串口2
         u8 key_val;
     extern u8 switch_sta;
     extern u16 ccr;
     extern u16 cnt1;         
        delay_init();                 //延时函数初始化       
        uart_init(9600);         //串口初始化为9600
    //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组           
        LED_Init();                           //初始化与LED连接的硬件接口
        KEY_Init();               
        SMG_Init();
        camer_Init();
        TIM4_PWM_Init(35999,1);     //pwm频率为1khz,周期为1ms
        switch_Init();
        detect_Init();
        //TIM8_Cap_Init(99,71);      //每100更新一次计数,计数频率为1Mhz,周期为1us
   //TIM1_Cap_Init(0xffff,71);     //定时器的技术频率为1Mhz
        ec11_Init();
        while(1)
{       
        key_val=key_scan();
   if(key_val)
   {
         switch(key_val)
                  {
                           case  KEY0_Press:
                            printf("\r\n按键0按下\r\n");                             
                                break;
                          case  KEY1_Press:
                                    printf("\r\n按键1按下\r\n");                                                                   
                               break;
                          case  KEY2_Press:
                                    printf("\r\n按键2按下\r\n");                                          
                               break;
                          case  KEY3_Press:  
                            printf("\r\n 按键3按下 \r\n");                                             
                               break;
                          case  KEY4_Press:
                                    printf("按键4按下");                                                     
                                break;                                                                 
                          case  KEY5_Press:
                                    printf("按键5按下");                                
                            //通道选择pwm的通道
                                break;                       
                  }                      
  } else delay_ms(10);


//key.c
void KEY_Init(void)   
{   

    GPIO_InitTypeDef GPIO_InitStructure;   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

    //配置A端口  A8-11                          //key2
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    //上拉输入,低电平有效
    //GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;   
    GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        //配置端口   C 8 12
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
       
        GPIO_SetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
    GPIO_SetBits(GPIOC,GPIO_Pin_8|GPIO_Pin_12);                
}

u8 key_scan()
{
         
         static u8 key_up=1; //按键按&松开标志
       
         if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==0||KEY4==0||KEY5==0))
         {
                 delay_ms(10);        //按键去抖动,消抖
                 key_up=0;
                 //按键已松开,去判断是哪个按键按下
         if(KEY0==0)            return   KEY0_Press;
             else if(KEY1==0)       return KEY1_Press;
                 else if(KEY2==0)       return KEY2_Press;
                 else if(KEY3==0)       return KEY3_Press;                                         
         else if(KEY4==0)            return KEY4_Press;      
         }         
         else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)  key_up=1;
     return 0;                  
}

//key.h

#ifndef _KEY_H
#define  _KEY_H
#include "sys.h"
#define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12)//读取按键0  (按键0我未按下,串口却得到的是按键0的按键值)
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)//读取按键1
#define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)//读取按键2   (按键2是我按下的按键,但是串口没得有得到按键值)
#define KEY3 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)//读取按键3
#define KEY4 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)//读取按键4
#define KEY5 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)//读取按键5

#define KEY0_Press 1
#define KEY1_Press 2
#define KEY2_Press 3
#define KEY3_Press 4
#define KEY4_Press 5
#define KEY5_Press 6
void KEY_Init(void);
u8 key_scan(void);
#endif





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

使用道具 举报

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2020-3-3
在线时间
85 小时
 楼主| 发表于 2020-4-1 17:56:51 | 显示全部楼层
来个大神帮我分析下,真的挺急的,基本上都是搬的例程,现在却没法得到正确的按键值
回复 支持 反对

使用道具 举报

0

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2018-7-6
在线时间
133 小时
发表于 2020-4-2 08:16:52 | 显示全部楼层
IO口对应有问题吧,不把原理图PCB发上来 人们咋给你找问题
回复 支持 反对

使用道具 举报

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2020-3-3
在线时间
85 小时
 楼主| 发表于 2020-4-2 09:24:44 | 显示全部楼层
mynameisqgj 发表于 2020-4-1 17:56
来个大神帮我分析下,真的挺急的,基本上都是搬的例程,现在却没法得到正确的按键值

真的挺急的,大家能帮我看看嘛
回复 支持 反对

使用道具 举报

2

主题

20

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1159
金钱
1159
注册时间
2019-3-25
在线时间
101 小时
发表于 2020-4-2 09:24:51 | 显示全部楼层
按其他按键不是key0的键值?如果是这种情况,按键扫描出来的值key_val应该一直是1
回复 支持 反对

使用道具 举报

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2020-3-3
在线时间
85 小时
 楼主| 发表于 2020-4-2 13:59:22 | 显示全部楼层
爱听你爽朗的笑 发表于 2020-4-2 09:24
按其他按键不是key0的键值?如果是这种情况,按键扫描出来的值key_val应该一直是1

按其他的按键也是key0的键值,我始终都找不出问题出在哪儿
回复 支持 反对

使用道具 举报

2

主题

20

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1159
金钱
1159
注册时间
2019-3-25
在线时间
101 小时
发表于 2020-4-2 17:43:16 | 显示全部楼层
那这问题就明显了,返回值key_val不对,你在线调试下就知道哪块问题了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 12:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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