历史上的今天
今天是:2024年09月11日(星期三)
2019年09月11日 | STM32学习---GPIO和按键(流水灯学习)
2019-09-11 来源:eefocus
//main的完整过程:
int main(void){
LED_GPIO_CONFIG(); //定义LED灯;
KEY_GPIO_CONFIG(); //定义按键;
//循环判断按键的过程:
while(1){
if((KEY_SCANF(GPIOC,GPIO_Pin_5)==0)){ //确定按键完全按下
if(GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2)==0) //当灯都亮起时,GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2)读到输出数据;
GPIO_SetBits(GPIOD,GPIO_Pin_2); //置位,灯灭;
else
GPIO_ResetBits(GPIOD,GPIO_Pin_2); //复位,灯亮
}
}
}
//关于KEY的操作;
//实现操作:(初始时灯亮)按一下按键后灯灭,再按一下灯亮;
先按之前的代码点亮一个LED灯;
GPIO_InitTypeDef GPIO_D;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_D.GPIO_Pin=GPIO_Pin_2;
GPIO_D.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_D.GPIO_Speed=3;
GPIO_Init(GPIOD,&GPIO_D);
//然后定义按键;
void KEY_GPIO_CONFIG(void)
{
GPIO_InitTypeDef GPIO_C;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_C.GPIO_Pin=GPIO_Pin_5;
GPIO_C.GPIO_Mode=GPIO_Mode_IPU;
GPIO_C.GPIO_Speed=1;
GPIO_Init(GPIOC,&GPIO_C);
}
//定义按键和定义LED灯的过程差不多,主要区别在于Mode的配置上;
/*
4种输入模式 :
GPIO_Mode_IPD(下拉输入模式):在默认情况下(GPIO引脚无输入的情况下),读取得GPIO的引脚数据为1;
GPIO_Mode_IPU(上拉输入模式):在默认情况下(GPIO引脚无输入的情况下),读取得GPIO的引脚数据为0;
GPIO_Mode_IN_FLOATING(浮空输入模式):在芯片内部既没有上拉也没有下拉,经由触发器输入。由于其阻抗较大,所以一般把这种模式用于标准的通信协议如I2C,USART的接收端。
GPIO_Mode_AIN(模拟输入模式):关闭施密特触发器,不接入上、下拉电阻,经由另一线路把电压信号传送到片上外设模块。如传送到ADC模块,由ADC模块采集电压信号。所以使用ADC外设的时候,必须设置为模拟输入模式。
4种输出模式:
GPIO_Mode_Out_PP(普通推挽输出):一般用于输出电平为0和3.3V的场合。
GPIO_Mode_Out_OD(普通开漏输出):一般应用在电平不匹配的场合,如需要输出5V的高电平,就需要在外部接一个上拉电阻,电源为5V,把GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5V的电平。
GPIO_Mode_AF_PP(复用推挽输出):
GPIO_Mode_AF_OD(复用开漏输出):
*/
//根据原理图:当KEY没有按下时为高电平,按下时为低电平,根据上述模式的介绍,可以选择上拉输入模式(GPIO_Mode_IPU)
//定义一个扫描KEY输入的函数:
u8 KEY_SCANF(GPIO_TypeDef* a,u16 PIN)
{
if(GPIO_ReadInputDataBit(a,PIN)==0){
Delay(10000); //按键消抖
if(GPIO_ReadInputDataBit(a,PIN)==0){
while(GPIO_ReadInputDataBit(a,PIN)==0);//
return 0;
}
else{
return 1;
}
}
else
return 1;
}
//逐句分析:
if(GPIO_ReadInputDataBit(a,PIN)==0):
//新的库函数:GPIO_ReadInputDataBit(a,PIN),读取输入的数据,可用输入电平高低判断。
//根据调用函数:KEY_SCANF(GPIOC,GPIO_Pin_5) 可知,判断的是KEY是否有输入;
//当没有按下KEY时,应输入模式确定为上拉输入模式,所以默认为高电平。然后,若有按下KEY,则输入变为低电平。
//第二个
if(GPIO_ReadInputDataBit(a,PIN)==0) //是确认确实有按键按下,而不是按下一半返回。
while(GPIO_ReadInputDataBit(a,PIN)==0);//不停的检测按键的电平,直至按键被释放,被释放后,按键的电平又恢复到默认的高电平。
//实际上这一整个过程都是按键扫描、消抖。
上一篇:stm32GUI滑杆图形操作界面
下一篇:STM32CubeMx-ADC
史海拾趣
|
恩智浦微控制器LPC2478和LPC2470支持需高速通信的LCD应用 恩智浦半导体发布其全新的LPC2478微控制器,这是业界唯一的提供集成的LCD支持的基于闪存的ARM7 MCU。同时推出的LPC2470是其无闪存版本。全新的微控制器配有双路ARM高速总线,可实现多种高带 ...… 查看全部问答> |
|
Crest Factor Reduction for OFDMA Systems Introduction Crest factor reduction (CFR) is a technique for reducing the peak-to-average ratio (PAR) of an orthogonal frequency division multiplexing (OFDM) waveform. An OFDM signal is made up in the frequency domain as a set o ...… 查看全部问答> |
|
目前混合动力汽车主要采用镍氢电池技术,但镍氢电池的一些技 术性能如能量密度、充放电速度等已经接近理论极限值。而锂电池具有能量密度高、容量大、无记忆性等优点,得到汽车厂商和电池厂商的一致认可,目前各国研发 的重点正是锂离子电池。 &n ...… 查看全部问答> |
|
pxa270 ce5.0电源管理源码谁有,能给一份来参考下吗? 目前我正在做pxa270平台,windows ce5.0系统,现在就只是简单的休眠啊,挂起啊之类的,有谁实现稍微复杂点的功能啊,如系统空闲的情况下降低CPU的频率,电压等。有的吗?100分送上… 查看全部问答> |
|
请问ARM9中如何打开实时时钟计数器,我初始化了TICNT了,但是如何让他运行起来 我初始化过程 rRTCOON=0x0; rTICNT=(127&0x7f)|0x80; TICNT寄存器不会走,要如何让他走起来… 查看全部问答> |
|
很多芯片出厂的时候在开始地址处放有bootloader。比如在0x0~0x1000处。只不过经过我们烧写一次之后,就把这个位置的bootloader给擦掉了。 先简单说下步骤,然后再说程序该怎么改: 1.先下载以太网的bootloader到0x0处, ...… 查看全部问答> |
|
请教Modbus高手makesoft:实现Modbus协议一定需要超时检测吗? 首先声明,我对Modbus不熟悉,尤其是如何实现它,最近才从网上下载了协议研究了一下,特此向高手请教。搞清楚这些问题,才能有效地在芯片中实现相应的功能,满足大家的需要。此帖的目的是继续另一帖的讨论:建议STM32的芯片加上串口超时功能, ...… 查看全部问答> |




