按键控制LED亮灭实验
实验目的
无锁存时:当按下独立按钮时LED亮,松开LED灭。
锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。
实验过程
硬件部分
软件部分
1、引入头文件
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
2、主函数
首先时钟、led、按键初始化
int main (void)//主程序
{ u8 a; //定义变量
//初始化程序
RCC_Configuration(); //时钟设置 修改需要去sys.c内修改
LED_Init();//LED初始化 LED连接哪个IO口、输入输出等修改需要去led.c内修改
KEY_Init();//按键初始化 按键连接哪个IO口、输入输出等修改需要去key.c内修
//主循环
while(1){
//示例1:无锁存
if(GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平 KEYPORT定义IO口组GPIOA或GPIOB,KEY1定义IO口如GPIO_Pin_0等,修改在key.h里修改
GPIO_ResetBits(LEDPORT,LED1); //LED灯都为低电平(0) (LEDPORT定义IO口组GPIOA或GPIOB,LED1定义IO口如GPIO_Pin_0等,修改在led.h里修改
}else{
GPIO_SetBits(LEDPORT,LED1); //LED灯都为高电平(1)
}
示例2:无锁存
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(!GPIO_ReadInputDataBit(KEYPORT,KEY1))); //引脚输出状态取反 GPIO_ReadInputDataBit(KEYPORT,KEY1)读key1电平,读出输出状态
示例3:有锁存
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); //LED取反
while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开
}
}
//示例4:有锁存
// if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
// delay_ms(20); //延时20ms去抖动
// if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
// //在2个LED上显示二进制加法
// a++; //变量加1
// if(a>3){ //当变量大于3时清0
// a=0;
// }
// GPIO_Write(LEDPORT,a); //直接数值操作将变量值写入LED(LED在GPIOB组的PB0和PB1上)
// while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开
// }
// }
}
}
锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。常用类似电灯开关。
程序:
1、读取IO口的电平
2、延时去抖动
3、读取IO口电平
4、如果为高电平则进入循环,灯常亮,直至按键再次按下转换电平,灯熄灭。
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); //LED取反
while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开
}
GPIO_WriteBit 对单个IO口置0或1
GPIO_WriteBit(GPIOB,GPIO_Pin_3 , 0);
GPIO_SetBits 对多个IO口置0或1
GPIO_SetBits(GPIOD,GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_7);
区别
一个只能单个引脚操作
一个可对多个引脚操作
————————————————————————————————————————————————
STM32引脚输出状态取反方法,学习原子板时,原码LED0,LED1,用位带操作取反状态,不习惯,从别的图书中找到用库函数取反方法,摘录如下:
使用的是PB5,PE5,这两个分别连一个LED灯。文章来源:https://www.toymoban.com/news/detail-713905.html
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)));
GPIO_WriteBit(GPIOE,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_5)))
简释:
GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5),是输出状态;
GPIO_WriteBit(),设置引脚值库函数
————————————————————————————————————————————————文章来源地址https://www.toymoban.com/news/detail-713905.html
到了这里,关于【STM32】按键控制LED亮灭实验——GPIO、LED、KEY、SYS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!