按键控制LED灯-课件【PPT】
- 格式:ppt
- 大小:943.50 KB
- 文档页数:20
day12:按键KEY1和KEY2控制LED灯的亮灭KEY1控制LED1,KEY2控制LED2bsp_led.h:/* 和LED功能模块相关的程序 */#ifndef __BSP_LED_H__#define __BSP_LED_H__#include "stm32f10x.h"/*宏定义*/#define GPIO_CLK_D4 RCC_APB2Periph_GPIOC // 时钟#define GPIO_PORT_D4 GPIOC // C端⼝#define GPIO_PIN_D4 GPIO_Pin_2 // PC2引脚#define GPIO_CLK_D5 RCC_APB2Periph_GPIOC // 时钟#define GPIO_PORT_D5 GPIOC // C端⼝#define GPIO_PIN_D5 GPIO_Pin_3 // PC2引脚/*参数宏定义*//*digitalTOGGLE(p,i)是参数宏定义,p表⽰LED的端⼝号,ODR是数据输出寄存器,查stm32f10x的官⽅中⽂⼿册的第8.2章的ODR寄存器,要点亮LED,根据原理图,要输出低电平0,C语⾔中,^表⽰异或,即a^b表⽰a和b不同时输出为1,相同时输出为0,⽐如0^1=1,1^1=0,0^0=0,这⾥为什么操作ODR,p是什么?查看stm32f10x.h⽂件,搜索GPIO_TypeDef就会明⽩,i是LED的引脚对应的位电平,经过digitalTOGGLE(p,i) {p->ODR ^= i;}之后,第⼀次p为0,i⼀直为1,第⼀次异或结果输出1,第⼆次输出0,第三次输出1,这样间断输出010101,灯不断亮灭*/#define digitalTOGGLE(p,i) {p->ODR ^= i;}#define LED1_TOGGLE digitalTOGGLE(GPIO_PORT_D4,GPIO_PIN_D4)#define LED2_TOGGLE digitalTOGGLE(GPIO_PORT_D5,GPIO_PIN_D5)/*配置GPIO*/void LED_GPIO_Config(void);#endif /*__BSP_LED_H__*/bsp_led.c:/* 和LED功能模块相关的程序头⽂件 */#include "./led/bsp_led.h" /*绝对路径,也可在Options for target中设置头⽂件*//*GPIO初始化*/void LED_GPIO_Config(void){/*外设结构体*/GPIO_InitTypeDef GPIO_InitStruct_D4, GPIO_InitStruct_D5;/*第⼀步:打开外设的时钟,看stm32f10x_rcc.c这个⽂件的RCC_APB2PeriphClockCmd函数介绍*/RCC_APB2PeriphClockCmd(GPIO_CLK_D4, ENABLE);/*第⼆步:配置外设的初始化结构体*/GPIO_InitStruct_D4.GPIO_Pin = GPIO_PIN_D4; // PC2的那盏LED灯(D4)的引脚GPIO_InitStruct_D4.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式GPIO_InitStruct_D4.GPIO_Speed = GPIO_Speed_10MHz; // 引脚速率GPIO_InitStruct_D5.GPIO_Pin = GPIO_PIN_D5; // PC3的那盏LED灯(D5)的引脚GPIO_InitStruct_D5.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式GPIO_InitStruct_D5.GPIO_Speed = GPIO_Speed_10MHz; // 引脚速率/*第三步:调⽤外设初始化函数,把配置好的结构体成员写到寄存器⾥⾯*/GPIO_Init(GPIO_PORT_D4, &GPIO_InitStruct_D4);GPIO_Init(GPIO_PORT_D5, &GPIO_InitStruct_D5);}bsp_key.h:#ifndef __BSP_KEY_H__#define __BSP_KEY_H__#include "stm32f10x.h"#define KEY_ON 1#define KEY_OFF 0// 按键相关的宏定义#define GPIO_CLK_KEY1 RCC_APB2Periph_GPIOA // 端⼝A时钟#define GPIO_PORT_KEY1 GPIOA // A端⼝#define GPIO_PIN_KEY1 GPIO_Pin_0 // PA0引脚#define GPIO_CLK_KEY2 RCC_APB2Periph_GPIOC // 端⼝C时钟#define GPIO_PORT_KEY2 GPIOC // C端⼝#define GPIO_PIN_KEY2 GPIO_Pin_13 // PC13引脚// 配置GPIOvoid KEY_GPIO_Config(void);// 按键扫描,看按键是否被按下,如果按下返回KEY_ON,否则返回KEY_OFF(进⾏宏定义)uint8_t KEY_SCAN(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);#endif /* __BSP_KEY_H__ */bsp_key.c:#include "./key/bsp_key.h"/* 按键初始化 */void KEY_GPIO_Config(void){/*外设结构体*/GPIO_InitTypeDef GPIO_InitStruct_KEY1, GPIO_InitStruct_KEY2;/*第⼀步:打开外设的时钟,看stm32f10x_rcc.c这个⽂件的RCC_APB2PeriphClockCmd函数介绍*/RCC_APB2PeriphClockCmd(GPIO_CLK_KEY1|GPIO_CLK_KEY2, ENABLE); // 按下KEY1或KEY2/*第⼆步:配置外设的初始化结构体*/GPIO_InitStruct_KEY1.GPIO_Pin = GPIO_PIN_KEY1; // KEY1的引脚GPIO_InitStruct_KEY1.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输出模式(引脚电平由外部决定) GPIO_InitStruct_KEY1.GPIO_Speed = GPIO_Speed_10MHz; // 引脚速率GPIO_InitStruct_KEY2.GPIO_Pin = GPIO_PIN_KEY2; // KEY1的引脚GPIO_InitStruct_KEY2.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输出模式(引脚电平由外部决定) GPIO_InitStruct_KEY2.GPIO_Speed = GPIO_Speed_10MHz; // 引脚速率/*第三步:调⽤外设初始化函数,把配置好的结构体成员写到寄存器⾥⾯*/GPIO_Init(GPIO_PORT_KEY1, &GPIO_InitStruct_KEY1);GPIO_Init(GPIO_PORT_KEY2, &GPIO_InitStruct_KEY2);}/* 按键扫描(检测按键是否被按下):GPIOx为端⼝,GPIO_Pin为引脚 */uint8_t KEY_SCAN(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin){/*查看stm32f10x_gpio.h⽂件最后⾯的函数,这个函数表⽰读引脚的输⼊电平(按键触发后输⼊的)*/// 这个函数,如果按键按下,则输出1.8V⾼电平,置1,否则为0if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON){// 如果⼀直按着就进⼊死循环while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);// 放开按键就置1return KEY_ON;}else{// 否则置0return KEY_OFF;}}main.c:#include "stm32f10x.h"#include "./led/bsp_led.h"#include "./key/bsp_key.h"// 延迟函数void delay(unsigned int i){for(; i!=0; i--);}int main(void){/*GPIO初始化,在程序来到main函数的时候,系统时钟已经配置成72MHz*/LED_GPIO_Config(); // LED初始化KEY_GPIO_Config(); // KEY初始化while(1){// 如果按下KEY1,则D4亮灭,KEY1对应的是PA0,A端⼝的第1个引脚if(KEY_SCAN(GPIOA, GPIO_PIN_KEY1) == KEY_ON){LED1_TOGGLE;}// 如果按下KEY2,则D5亮灭,KEY2对应的是PC13,C端⼝的第14个引脚if(KEY_SCAN(GPIOC, GPIO_PIN_KEY2) == KEY_ON){LED2_TOGGLE;}}}实验现象:程序烧录到板⼦中,⼀开始LED1和LED2都是亮的(应该都是灭的才对),按下KEY1控制LED1的亮和灭,按下KEY2控制LED2的亮和灭============================================下⾯是默认情况下LED2和LED2都是熄灭的情况:main.c/*KEY控制LED亮灭实验,LED⼀开始默认都熄灭,等按下KEY1或KEY2后才能亮*/#include "stm32f10x.h"#include "./led/bsp_led.h"#include "./key/bsp_key.h"// 延迟函数void Delay(unsigned int time){for(;time!=0;time--);}int main(void){uint8_t count = 1;KEY_GPIO_Config();while(1){// LED默认情况下是灭的,等按下KEY1或KEY2时,对应的LED才会亮if(KEY_SCAN(GPIO_PORT_KEY1, GPIO_PIN_KEY1) == KEY_ON){if(count == 1){LED_GPIO_Config(); // 按下KEY1时两个LED都亮LED2_TOGGLE; // 让LED2灭(其实是亮-->灭),时间很短,⼈眼分辨不出来count++;}else{LED1_TOGGLE;}}if(KEY_SCAN(GPIO_PORT_KEY2, GPIO_PIN_KEY2) == KEY_ON){if(count == 1){LED_GPIO_Config(); // 按下KEY2时两个LED都亮LED1_TOGGLE; // 让LED1灭(其实是亮-->灭),时间很短,⼈眼分辨不出来count++;}else{LED2_TOGGLE;}}}}。
按键控制LED实验
I/O 口的意思即为INPUT 接口和OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的I/O 口的输入功能即为读取外接设备的输出值,我们用一个按键和一个LED 小灯完成一个输入输出结合使用的实验,让大家能简单了解I/O 的作用。
按键
按键开关
红色M5
220
10K
面包板
数字I/O 接口为
应保持
语句,这里我们使用if 语句,Arduino 的程序便写语句是基于C 语言的,所以C 的条件判断语句自然也适用于Arduino,像while、swich 等等。
这里根据个人喜好我们习惯
于使用简单易于理解的if 语句给大家做演示例程。
我们分析电路可知当按键按下时,数字7 接口可读出为高电平,这时我们使数字11 口输出高电平可使小灯亮起,程序中我们判断数字7 口是否为低电平,要为低电平使数字11 口输出也为低电平小灯不亮,原理同上。
参考源程序:
int ledpin=11;//定义数字11 接口
{
}
{
else
{ digitalWrite(ledpin,HIGH);}
}
下载完程序我们本次的小灯配合按键的实验就完成了,本实验的原理很简单,广泛被用于各种电路和电器中,实际生活中大家也不难在各种设备上发现,例如大家的
手机当按下任一按键时背光灯就会亮起,这就是典型应用了,下面一个实验就是一个最简单的生活中应用实例------抢答器。