stm32——学习笔记(2)

工具:正点原子战舰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怎么来的,表示什么

注:以上程序来自正点原子的视频,资料包等处,由于本人习惯用寄存器的程序,所以就只有寄存器版本,支持连续按下的程序是我改动之后,为了效果更明显就加了延迟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值