基于STM32F103入门2——按键点灯

发布者:SerendipityDawn最新更新时间:2022-09-23 来源: csdn关键字:STM32F103  入门  按键点灯 手机看文章 扫描二维码
随时随地手机看文章

1:按键不带锁存

不带锁存的意思就是 比如你按下按键灯亮,但是你一旦松手了灯就熄灭了,所以你想这个灯一直亮,那么你就一直按着按键不松手。


1.1例程

key.c


/*========================key.c=========================*/

#include "stm32f10x.h"

#include "key.h"


/*按键初始化函数*/

void KEY_Init(void)

{

//1.打开控制GPIOA的时钟(APB2)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

//2.配置结构体

GPIO_InitTypeDef key_init;

key_init.GPIO_Pin   = GPIO_Pin_5;      //GPIOC A5引脚

key_init.GPIO_Mode  = GPIO_Mode_IPU; //上拉输入

//led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz

//3.对成员进行初始化

GPIO_Init(GPIOA, &key_init);

}


led.c


#include "stm32f10x.h"

#include "led.h"


void LED_Init(void)

{

//1.打开控制GPIOC的时钟(APB2)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

//2.配置结构体

GPIO_InitTypeDef led_init;

led_init.GPIO_Pin   = GPIO_Pin_13;      //GPIOC13引脚

led_init.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出

led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz

//3.对成员进行初始化

GPIO_Init(GPIOC, &led_init);

}


main.c


#include "stm32f10x.h"

#include "led.h"

#include "key.h"

#include "delay.h"


int  main()

{

LED_Init(); //LED初始化

KEY_Init(); //按键初始化

GPIO_SetBits(GPIOC,LED); //LED设置高电平

GPIO_SetBits(GPIOA,KEY); //按键设置高电平

while(1)

{

#if 0

/*示例1:无锁存*/

if(GPIO_ReadInputDataBit(GPIOA, KEY) == 0) //读取按键是否被按下

{

GPIO_ResetBits(GPIOC, LED); //LED点亮

}

else

{

GPIO_SetBits(GPIOC,LED); //LED熄灭

}

#endif

/*示例2:无锁存*/

GPIO_WriteBit(GPIOC, LED, (BitAction)(GPIO_ReadInputDataBit(GPIOA, KEY)));

}

   

}


2:按键带锁存

锁存的意思就是 比如你按下按键灯亮,但是你一旦松手了灯还是亮的,跟不带锁存相反。


2.1例程

key.c 和 led.c 和上面的不带锁存是一样的代码


#include "stm32f10x.h"

#include "led.h"

#include "key.h"

#include "delay.h"


int  main()

{

LED_Init(); //LED初始化

KEY_Init(); //按键初始化

GPIO_SetBits(GPIOC,LED); //LED设置高电平

GPIO_SetBits(GPIOA,KEY); //按键设置高电平

while(1)

{

/*示例3:有锁存 每按一次 灯取反*/

if(GPIO_ReadInputDataBit(GPIOA, KEY) == 0) //读取按键是否被按下 

{

delay_ms(20); //消抖再次判断是否按下

if(GPIO_ReadInputDataBit(GPIOA, KEY) == 0) //读取按键还是被按下

{

GPIO_WriteBit(GPIOC, LED, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, LED)));

}

while(!GPIO_ReadInputDataBit(GPIOA, KEY)); //等待按键松开

}

}


   

}


3:按键用外部中断来做

正常如何程序比较多的话,我们有时候按键是需要及时处理的,如果通过循环检测其实不太理想的,所以我们可以把按键设置为中断来做。这样就可以更有效率,能及时处理。


步骤:

1.配置GPIO(配置结构体的相关东西)

//1.打开控制GPIOA的时钟(APB2)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //我们设置复用 用作外部中断

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5); //设置A5引脚为 外部中断引脚


//2.配置结构体

GPIO_InitTypeDef key_init;

key_init.GPIO_Pin   = GPIO_Pin_5;      //GPIO A5引脚

key_init.GPIO_Mode  = GPIO_Mode_IPU; //上拉输入

//led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz


//3.对成员进行初始化

GPIO_Init(GPIOA, &key_init);


2.设置EXTI (触发方式:上升沿、下降沿、上下都触发)。

EXTI_Line: 中断线(一共20条)

EXTI_Mode: EXTI 中断的模式/产生的事件

EXTI_Trigger: EXTI()触发方式 上升沿 下降沿 上下都触发)

EXTI_LineCmd: 控制是否使能EXTI线,使能EXTI线或禁用


//4.配置EXTI外部中断结构体

EXTI_InitTypeDef exti_init;


exti_init.EXTI_Line = EXTI_Line5; //A5引脚 所以是line5

exti_init.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式

exti_init.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 

exti_init.EXTI_LineCmd = ENABLE; //打开外部中断开关


//对成员进行初始化

EXTI_Init(&exti_init);


3.设置NVIC(中断优先级)

//5.配置NVIC优先级结构体

NVIC_InitTypeDef nvic_init;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //配置第四组


nvic_init.NVIC_IRQChannel = EXTI9_5_IRQn; //A5引脚嘛 选择通道5

nvic_init.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级 0级

nvic_init.NVIC_IRQChannelSubPriority = 0; //设置子优先级 0级

nvic_init.NVIC_IRQChannelCmd = ENABLE; //打开NVIC优先级开关


//对成员进行初始化

NVIC_Init(&nvic_init);


4.编写中断服务函数

当按键从高电平变成低电平,也就是下降沿的时候,会触发中断,然后会进入中断服务函数。然后我们在服务函数里面点灯即可。



void EXTI9_5_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line5) != RESET) //如果发生外部中断

{

GPIO_ResetBits(GPIOC,GPIO_Pin_13); //开灯 LED设置低电平

delay_ms(1000); //亮灯1秒

GPIO_SetBits(GPIOC,GPIO_Pin_13); //关灯 LED设置高电平

}

EXTI_ClearFlag(EXTI_Line5); //清除标志位

}


代码:

key.c

main.c

#include "stm32f10x.h"

#include "led.h"

#include "key.h"

#include "delay.h"

#include "exti.h"


/*主函数入口*/

int  main()

{

LED_Init(); //LED初始化

KEY_Init(); //按键初始化

exti_Init(); //外部中断初始化

GPIO_SetBits(GPIOC,GPIO_Pin_13); //LED设置高电平

GPIO_SetBits(GPIOA,GPIO_Pin_5); //按键设置高电平

while(1)

{


}


   

}


/*外部中断服务函数*/

void EXTI9_5_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line5) != RESET) //如果发生外部中断

{

GPIO_ResetBits(GPIOC,GPIO_Pin_13); //开灯 LED设置低电平

delay_ms(1000); //亮灯1秒

GPIO_SetBits(GPIOC,GPIO_Pin_13); //关灯 LED设置高电平

}

EXTI_ClearFlag(EXTI_Line5); //清除标志位

}


#include "stm32f10x.h"

#include "key.h"


/*按键初始化函数*/

void KEY_Init(void)

{

//1.打开控制GPIOA的时钟(APB2)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //复用 用作外部中断

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5); //设置A5引脚为 外部中断引脚

//2.配置结构体

GPIO_InitTypeDef key_init;

key_init.GPIO_Pin   = GPIO_Pin_5;      //GPIOC13引脚

key_init.GPIO_Mode  = GPIO_Mode_IPU; //上拉输入

//led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz

//3.对成员进行初始化

GPIO_Init(GPIOA, &key_init);

}


exti.c

#include "stm32f10x.h"

#include "exti.h"



void exti_Init()

{

//4.配置EXTI外部中断结构体

EXTI_InitTypeDef exti_init;

exti_init.EXTI_Line = EXTI_Line5; //A5引脚

exti_init.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式

exti_init.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 

exti_init.EXTI_LineCmd = ENABLE; //打开外部中断开关

//对成员进行初始化

EXTI_Init(&exti_init);

//5.配置NVIC优先级结构体

NVIC_InitTypeDef nvic_init;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //配置第四组

nvic_init.NVIC_IRQChannel = EXTI9_5_IRQn; //通道5

nvic_init.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级 0级

nvic_init.NVIC_IRQChannelSubPriority = 0; //设置子优先级 0级

nvic_init.NVIC_IRQChannelCmd = ENABLE; //打开NVIC优先级开关

//对成员进行初始化

NVIC_Init(&nvic_init);

}


delay.c

#include "stm32f10x.h"

#include "delay.h"


void delay_ms(uint16_t time)

{

uint16_t i = 0;

while(time--)

{

i = 10000;

while(i--);

}

}


关键字:STM32F103  入门  按键点灯 引用地址:基于STM32F103入门2——按键点灯

上一篇:基于STM32F103入门4——串口通信
下一篇:基于STM32F103入门1——点亮LED灯

推荐阅读最新更新时间:2024-11-05 13:21

基于IAR环境下STM32F103单片机读取BME280程序
自己编写的基于IAR环境下STM32F103单片机读取BME280程序,没有太多的寄存器操作,简单易懂,可以直接调用,上电后只要对IO口初始化,调用函数Bme_ReadDigValue()读取校准寄存器参数并保存,再调用函数Bme_Init()初始化之后就可以用函数Bme_ReadStatus()读取传感器状态判断是否读取数据了,也可不判断传感器状态直接读取数据,读取数据直接调用函数ReadBme280()。 单片机源程序: void ReadBme280() { u32 value_ad; double var1; double var2; double var3; double
[单片机]
旋转LED屏显示控制器设计方案
引言 在各种设备中,显示设备占有重要地位,少了显示设备就像人少了眼睛,很多内在的东西都看不见。显示设备很重要也很常见,然而它的外形总是那么单调,像一个个的模型。旋转LED屏以其新颖、可视角360°吸引了电子狂热者的眼光。本项目是通过主控芯片STM32F103,将触摸技术与旋转LED屏幕相结合,可以实现时钟的变换,还可以利用触摸技术在旋转LED上玩一些小游戏[1],让旋转LED不再只是单一的观赏性的技术。 旋转LED显示屏是一种通过同步控制发光二极管(LED)位置和点亮状态来实现图文显示的新型显示屏,因其结构新颖、成本低、可视视角达360°而得到了迅速的发展。目前,常见的LED显示屏都是采用扫描方式进行显示的,其实现原理是在不同
[单片机]
旋转LED屏显示控制器设计方案
stm32单片机入门c语言解析
关于学习stm32单片机建议 推荐学习书籍: 《STM32F103xxx参考手册》不需要全部阅读——没有时间的。建议选读,但是前几章必读。存储器和总线架构、电源控制、备份寄存器、复位和时钟控制,通用和复用功能I/O,中断和时间等等前几章一定要花时间阅读。后面章节,讲述的是具体的功能模块设计。如果我们用到哪个模块,就可以去阅读哪个模块。 《STM32固件库使用手册》主要是为了简化编程 学习思路(仅供参考) 步骤一,安装完STM32学习的软件,比如J-Link、Keil for ARM(MDK)、ISP(如果需要从串口下载的话)。 步骤二,挑选部分例程的HEX,比如LED灯的例程HEX文件,下载到芯达STM32开发板中,观察两个L
[单片机]
【51单片机快速入门指南】8:看门狗定时器(WDT)
普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《STC89C52系列单片机器件手册》 适用型号: STC89C51,STC89C52,STC89C53,STC89C14,STC89LE51,STC89LE52,STC89LE53,STC89LE14,STC89C54,STC89C58,STC89C516,STC89C510,STC89C512,STC89C514,STC89LE54,STC89LE58,STC89LE516,STC89LE510,STC89LE512,STC89LE
[单片机]
【51单片机快速<font color='red'>入门</font>指南】8:看门狗定时器(WDT)
STM32CubeMx入门教程(4):PWM应用
导语“使用STM32CubeMx配置定时器输出PWM波,生成初始化代码。” 第一节 系统要求 •硬件 野火指南者 •软件 CubeMx & MDK & 逻辑分析仪 本次教程是使用定时器的PWM功能,通过PWM控制来实现LED灯的亮暗变化。 我们通过第一个教程LED,知道LED绿灯是通过PB0引脚控制的。我们在LED项目的基础上进行配置。 第二节 CubeMx配置 我们使用LED-绿色灯对应的是PB0 引脚,因此使用TIM3的通道3作为PWM波输出。 (1)定时器的时钟周期是72MHz, prescaler:7-1,Period:1000-1, 因此定时器的频率: f:72MHz/( prescaler+1)/( Perio
[单片机]
STM32CubeMx<font color='red'>入门</font>教程(4):PWM应用
基于ht1632c芯片的点阵驱动模块在STM32F103mini的应用
ht1632c点阵模块 STM32F103RC(mini) 杜邦线 工程代码:https://download.csdn.net/download/goolete/10922678 驱动代码:https://download.csdn.net/download/goolete/10922879 取模软件:https://download.csdn.net/download/goolete/10922876 (取模软件用之前必须破解,否则生成为乱码,破解文件在压缩包里) HT1632C点阵模块使用手册V1.0:https://download.csdn.net/download/goolete/10922
[单片机]
基于ht1632c芯片的点阵驱动模块在<font color='red'>STM32F103</font>mini的应用
诺基亚在俄罗斯推出C01 Plus入门级智能手机
HMD Global在俄罗斯推出了一款新的入门级智能手机诺基亚C01 Plus,它属于诺基亚C系列经济型智能手机。诺基亚C01 Plus预装Android 11 Go操作系统,它是一个为硬件资源较少的智能手机量身定做的精简版操作系统。   目前,诺基亚C01 Plus只能在俄罗斯购买。它可能在以后的日子里在印度推出,但目前还没有这方面的消息。诺基亚C01 Plus在俄罗斯的价格为6490卢布,有两种机身颜色可供选择:紫色和蓝色。诺基亚C01 Plus是市场上的小型智能手机之一,采用5.4英寸LCD面板,具有HD+分辨率,周边有明显的边框,采用展讯SC9863A芯片组,1GB内存和16GB存储,这款智能手机配备了一个Mic
[手机便携]
【GD32 MCU 入门教程】GD32 MCU 常见外设介绍(13)DAC 模块介绍
DAC是一种把二进制数字量形式的离散信号转换成以标准量(或参考量)为基准的模拟量的转换器,它常用于过程控制计算机系统的输出通道,与执行器相连,实现对生产过程的自动控制。 13.1.GD32 DAC 外设原理简介 因篇幅有限,本文无法详细介绍GD32所有系列的DAC,下面以GD32F30x为例,先着重介绍下GD32F30x的DAC及其结构框图,然后介绍下各个系列DAC的差异。 GD32F30x DAC 主要特性 ◼ 8位或12位分辨率,数据左对齐或右对齐; ◼ 每个通道带有DMA功能; ◼ 同步更新转换; ◼ 外部事件触发转换; ◼ 可配置的内部缓冲区; ◼ 输入参考电压VREF+; ◼ 噪声波生成(LSFR噪声模式和三角噪
[单片机]
【GD32 MCU <font color='red'>入门</font>教程】GD32 MCU 常见外设介绍(13)DAC 模块介绍
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved