新手入门
- 积分
- 14
- 金钱
- 14
- 注册时间
- 2018-1-31
- 在线时间
- 0 小时
|
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);
}
}
}
|
|