GPIO输入

按键抖动问题可利用Delay函数和定时器解决,Delay函数运行时,程序类似进入死时,占用较大单片机资源,定时器则无此问题。

引脚处于悬空状态时引脚电平不确定,具有一定危害,为防止此问题可从内外部解决。在单片机内部配置输出模式,或在外部加入一定的电路设置均可解决此问题。

二值化:通过电压比较器将模拟输入转换为数字电压输出(如0/1)。

两种类型的关键字均在Keil中均是正确的,一般使用stdint关键字,原关键字兼容老版本Keil软件。

需注意long与int类型数据均是32位数据。

只能用来给变量类型名换个名字,旧的名字仍然可以用。

#define与#typedef的区别:

一种数据类型,与数组类似。

用于数据打包,但可以打包多种类型的变量。注意利用typedef更改变量类型名来简化代码。

常用于打包数据的还有数组,但数组只能打包同一类型的数据。

枚举变量:成员变量的值只能从定义的集合内选取,否则会产生错误。避免如星期八之类的问题。

同样可利用#typedef来简化变量类型名以简化代码。

按键模块:

#include "stm32f10x.h"                  // Device header
#include "Delay.h" 

void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);		//开启外设时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;						//定义结构体变量
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;					//将引脚设置为上拉输入模式
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_11;			//选取引脚
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;				//设置引脚电平翻转速度
	GPIO_Init(GPIOB,&GPIO_InitStructure);						//读取结构体变量,初始化外设
}

uint8_t Key_GetNum(void)
{
	uint8_t KeyNum=0;
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)				//按键1刚按下,Pin_1为低电平
	{
		Delay_ms (20);											//消抖
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0) ;		//若按下未松手,卡在死循环
		Delay_ms (20);											//消抖
		KeyNum=1;												//按下按键并松手,返回键码
	}
	
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)				//按键1刚按下,Pin_1为低电平
	{
		Delay_ms (20);											//消抖
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0) ;		//若按下未松手,卡在死循环
		Delay_ms (20);											//消抖
		KeyNum=2;												//按下按键并松手,返回键码
	}
	return KeyNum;
}

蜂鸣器模块:

#include "stm32f10x.h"                  // Device header
/**
  * 函    数:蜂鸣器初始化
  * 参    数:无
  * 返 回 值:无
  */
void Buzzer_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启外设时钟
	
	GPIO_InitTypeDef	GPIO_InitStructure;						//定义结构体变量
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;			//设置引脚模式为推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;					//选择引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			//设置引脚电平翻转速度
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);						//读取结构体变量,初始化外设
}


/**
  * 函    数:蜂鸣器响
  * 参    数:无
  * 返 回 值:无
  */
void Buzzer_ON(void)
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_12);							//将引脚电平设置为低电平
}

/**
  * 函    数:蜂鸣器不响
  * 参    数:无
  * 返 回 值:无
  */
void Buzzer_OFF(void)
{
	GPIO_SetBits(GPIOB, GPIO_Pin_12);							//将引脚电平设置为高电平
}

/**
  * 函    数:蜂鸣器改变状态
  * 参    数:无
  * 返 回 值:无
  */
void Buzzer_Turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 0)			//判断引脚电平为低电平
	{
			GPIO_SetBits(GPIOB, GPIO_Pin_12);					//将引脚电平设置为高电平
	}
	
	if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 1)			//判断引脚电平为高电平
	{	
			GPIO_ResetBits(GPIOB, GPIO_Pin_12);					//将引脚电平设置为低电平
	}
	
	
}


光敏传感器模块:

#include "stm32f10x.h"                  // Device header
/**
  * 函    数:光敏传感器初始化
  * 参    数:无
  * 返 回 值:无
  */

void LightSensor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//开启外设时钟
			
	GPIO_InitTypeDef 	GPIO_InitStructure;					//定义结构体变量
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;			//设置引脚模式位上拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;				//选取引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//设置引脚电平翻转速度
	GPIO_Init(GPIOB, &GPIO_InitStructure);					//读取结构体变量,初始化外设
	
}

/**
  * 函    数:获取光敏传感器状态
  * 参    数:无
  * 返 回 值:13号引脚电平,亮:模块在光线不足时输出高电平,指示灯不亮。光线充足时输出低电平,指示灯亮。
  */

uint8_t LightSensor_GetState(void)
{
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);		//返回模块输出的电平值
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值