OpenEdv-开源电子网

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

STM32mini按键实验疑问

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-1-31
在线时间
0 小时
发表于 2018-1-31 00:51:39 | 显示全部楼层 |阅读模式
1金钱
按键输入实验,我把提供的代码写进单片机里,一开始灯亮,之后就直接执行main程序里选择结构中WAUP_PRES后面的两个取反让灯灭?并且按按键没用得按着复位选择,key0和key1按了有反应但wk_up按了一点反应没有。
当我把与wk_up有关的代码全删掉,只写key1和key2的程序,执行时就没问题。


另外支持连按的语句:if(mode)key_up=1;当我设置mode=1时我按按键会出现灯原来亮着却没灭反而更亮的现象,不明白灯变亮是怎么回事。
本人新手,正在自学stm32学按键实验时卡了很久,求解惑!
key.c的程序:
#include "key.h"
#include "delay.h"            
//按键初始化函数
//PA0.15和PC5 设置成输入
void KEY_Init(void)
{
        RCC->APB2ENR|=1<<2;     //使能PORTA时钟
        RCC->APB2ENR|=1<<4;     //使能PORTC时钟
        JTAG_Set(SWD_ENABLE);        //关闭JTAG,开启SWD
        GPIOA->CRL&=0XFFFFFFF0;        //PA0设置成输入          
        GPIOA->CRL|=0X00000008;   
        GPIOA->CRH&=0X0FFFFFFF;        //PA15设置成输入          
        GPIOA->CRH|=0X80000000;                          
        GPIOA->ODR|=1<<15;                   //PA15上拉,PA0默认下拉
        GPIOC->CRL&=0XFF0FFFFF;        //PC5设置成输入          
        GPIOC->CRL|=0X00800000;   
        GPIOC->ODR|=1<<5;                   //PC5上拉
}
//按键处理函数
//返回按键值
//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;  //支持连按                  
        if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
        {
                delay_ms(10);//去抖动
                key_up=0;
                if(KEY0==0)return KEY0_PRES;
                else if(KEY1==0)return KEY1_PRES;
                else if(WK_UP==1)return WKUP_PRES;
        }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;              
        return 0;// 无按键按下
}


main.c程序:
#include "sys.h"
#include "usart.h"               
#include "delay.h"       
#include "led.h"
#include "key.h"
int main(void)
{                 
        u8 t;          
        Stm32_Clock_Init(9);         //系统时钟设置
        delay_init(72);                     //延时初始化
        LED_Init();                                   //初始化与LED连接的硬件接口
        KEY_Init();                  //初始化与按键连接的硬件接口
        LED0=0;                                        //点亮LED0
        LED1=0;                                        //点亮LED1       
        while(1)
        {
                t=KEY_Scan(0);                //得到键值
                switch(t)
                {                                 
                        case KEY0_PRES:
                                LED0=!LED0;
                                break;
                        case KEY1_PRES:
                                LED1=!LED1;
                                break;
                        case WKUP_PRES:                               
                                LED0=!LED0;
                                LED1=!LED1;
                                break;
                        default:
                                delay_ms(10);       
                }
        }                 
}


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

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-9-29
在线时间
1 小时
发表于 2020-9-29 14:50:45 | 显示全部楼层
我也好奇,为什么提供的代码下栽进去,跟书上说的效果完全不一样,楼主这个问题你想通了吗
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2020-10-3 00:04:06 | 显示全部楼层
请联系我们技术支持
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-11-28
在线时间
8 小时
发表于 2022-6-20 15:43:16 | 显示全部楼层
//单次按压和连续按压是不同的操作手段,程序需要做修改
//这段代码的效果是
//默认无按键连续按压时,led0,led1,全部熄灭
//持续按压key0,led0持续亮
//持续按压key1,led1持续亮
//持续按压wk_up,led0和led1持续亮
while(1)
        {
                t = KEY_Scan(1);

                switch(t)
                {
                        case KEY__None:   //添加一个无任何按键按压的默认模式
                                led0 = 1;
                                led1 = 1;
                                break;
                       
                        case KEY0_Pres:
                                led0 = 0;
                                break;
                       
                        case KEY1_Pres:
                                led1 = 0;
                                break;
                       
                        case WKUP_Pres:
                                led0 = 0;
                                led1 = 0;
                                break;
                       
                        default:
                                delay_ms(10);
                                break;
                }
        }
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 22:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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