工具:正点原子战舰V3
主题:IO口做输入———按键输入跑马灯
程序:寄存器版本
不能连续按下
#include "delay.h"
//按键初始化函数
void KEY_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<6; //使能PORTE时钟
GPIOA->CRL&=0XFFFFFFF0; //PA0设置成输入,默认下拉
GPIOA->CRL|=0X00000008;
GPIOE->CRL&=0XFFF000FF; //PE2~4设置成输入
GPIOE->CRL|=0X00088800;
GPIOE->ODR|=7<<2; //PE2~4 上拉
}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下
//4,KEY3按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!!
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);//去抖动
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==1)return 4;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0;// 无按键按下
}
主程序:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
//ALIENTEK战舰STM32开发板实验3
//按键输入 实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{
u8 key=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
BEEP_Init(); //初始化蜂鸣器端口
KEY_Init(); //初始化与按键连接的硬件接口
LED0=0; //先点亮红灯
while(1)
{
key=KEY_Scan(0); //得到键值
if(key)
{
switch(key)
{
case WKUP_PRES: //控制蜂鸣器
BEEP=!BEEP;
break;
case KEY2_PRES: //控制LED0翻转
LED0=!LED0;
break;
case KEY1_PRES: //控制LED1翻转
LED1=!LED1;
break;
case KEY0_PRES: //同时控制LED0,LED1翻转
LED0=!LED0;
LED1=!LED1;
break;
}
}else delay_ms(10);
}
}
主程序:
(调用函数一样)
能连续按下:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
//ALIENTEK战舰STM32开发板实验3
//按键输入 实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{
u8 key=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
BEEP_Init(); //初始化蜂鸣器端口
KEY_Init(); //初始化与按键连接的硬件接口
LED0=0; //先点亮红灯
while(1)
{
key=KEY_Scan(0); //得到键值
if(key)
{
switch(key)
{
case WKUP_PRES: //控制蜂鸣器
BEEP=!BEEP;delay_ms(100);
break;
case KEY2_PRES: //控制LED0翻转
LED0=!LED0;delay_ms(100);
break;
case KEY1_PRES: //控制LED1翻转
LED1=!LED1;delay_ms(100);
break;
case KEY0_PRES: //同时控制LED0,LED1翻转
LED0=!LED0;
LED1=!LED1;delay_ms(100);
break;
}
}else delay_ms(100);
}
}
区别:
static //有记忆功能
eg:
int key(void)
{
static int a=0;
a++;
return a;
}//当每次调用key函数之后,返回值都+1
static声明的局部变量,存储在静态存储区
它在函数调用结束后,不会被释放。它的值会一直保留下来。
new get:
1.
unsigned char = u8;
unsigned short int =u16;
unsigned long int =u32;
什么是上/下拉电阻(战舰V3按键是共阴极,按下时io输入检测到低电平)
上拉电阻:把一个不确定的信号通过电阻连接到高电平,使得信号初始为高电平;
下拉电阻:把一个不确定的信号通过电阻连接到低电平,使得信号初始为低电平;
3.上拉电阻的作用:
提高电路稳定性,避免引起误动作;
提高输出管脚的带载能力;
4.上拉电阻一般的适用场景:
按键检测
IIC
思考:
1.
Stm32_Clock_Init(9);//这句代码设置了什么
delay_init(72); //延时初始化 ,72怎么来的,表示什么
注:以上程序来自正点原子的视频,资料包等处,由于本人习惯用寄存器的程序,所以就只有寄存器版本,支持连续按下的程序是我改动之后,为了效果更明显就加了延迟。