历史上的今天
今天是:2025年07月21日(星期一)
2018年07月21日 | STM32_GPIO之按键输入
2018-07-21 来源:eefocus
/*
名称:STM32_GPIO之按键输入
说明:这个实验是GPIO的输入功能。基本的思路和51单片机差不多。也是
操作相应的IO口,不过不同的是对于独立按键输入实验来说,51单片机是
需要一开始把待检测的IO口设置成高电平,然后检测其何时被拉低。而对
于STM32来说,其GPIO端口就可以设置成上拉输入,即不需要再人为的把对
应的对应的IO口设置成高电平,硬件电路会自动把对应端口引脚拉成高电
平。
还有一点关于条件编译要说的:这个ifndef… #endif 一般用在头文件中。书上说为了防止重复编译。就我目前了解的来看,在实际应用中,如果在两个.c源文件中都include了一个头文件,那么好像加不加这个条件编译都没什么影响(如果没有定义什么特殊的东西的话)。 但是,最好不要在头文件中定义变量(如int i);因为这样的话,如果两个.c源文件的都include了这个头文件,那么就会在链接时(注意是链接不是编译时)发生重复定义的错误。(好像是因为声明可以多次,但定义只能一次。)所以通常的做法是在.c源文件中定义变量,然后在对应的头文件中利用外部声明(即类似于extern int i;) 进行使用。
*/
#include "key.h"
//KEY端口配置
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = ALLKEY;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEY_PORT, &GPIO_InitStructure);
}
//声明延时函数
void delay_ms(u16 time);
//检查独立按键
int CheakKey()
{
uint16_t key = 1;
int i = 0;
for(i = 1;i <= 8;++i)
{
//软件消抖
if(GPIO_ReadInputDataBit(KEY_PORT,key) == Bit_RESET)
{
delay_ms(10);
if(GPIO_ReadInputDataBit(KEY_PORT,key) == Bit_RESET)
return i;
}
key = key<<1; //左移一位
}
//if( i > 8)
return -1;
}
史海拾趣
|
我花了一些时间用 Borland C++Builder 6 制作了一个共享软件 AVR_fighter for USBASP 做为2008年新年礼物,供大家免费使用.欢迎大家测试使用.欢迎回贴交流! 程序中加入了大量AVR芯片,我目前只测试了Atmega8,Atmega16,Attiny13这3种芯片. 支持 ...… 查看全部问答> |
|
程序: module Ser_Par_Conv_32(Data_out,write,Data_in,En,clk,rst); output [31:0] Data_out; output write; input Data_in; input ...… 查看全部问答> |
|
现在我在做毕设,就是要用WAVECOM发彩信 型号:wavecom Q2406 PL 002 在我往串口发送了 AT+CGDCONT=1,\"IP\",\"CMWAP\" ATD*99***1# 之后,服务器给我重复了好多次,发了这样的一段数据:(我用了ACCESSPORT来显示串口收到的16进制数据) ...… 查看全部问答> |
|
请教几个问题: 1、单片机要完成复位,为什么复位信号必须至少持续2个机器周期啊。 2、复位期间单片机在做什么?主要是这2个机器周期内在做什么。(书上有说,但不具体) 3、单片机上电之后复位之前,单片机在做什么? 谢谢!… 查看全部问答> |
|
谁能提供一个vs2005下控制ARM2440的IO或AD的例子呀? 刚开始学WIN CE的菜鸟。想了解VS 2005下如何控制ARM2440的IO或AD。 哪位老大能给个例子,不胜感激。 只有这么多分啦。… 查看全部问答> |




