Stm32f103c8t6(proteus仿真)学习——3.按键控制LED灯

这篇具有很好参考价值的文章主要介绍了Stm32f103c8t6(proteus仿真)学习——3.按键控制LED灯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、按键控制原理图

按键:button
电阻:res
proteus 按键,STM32F103,stm32,单片机,proteus,嵌入式硬件,学习

二、按键代码

1. led.c文件的代码

先配置LED灯的GPIO

//LED 初始化函数
void Led_Init(void){
	//声明一个结构体,名字是GPIO_InitStructure
	GPIO_InitTypeDef GPIO_InitStructure;
	//使能GPIOA的时钟,ENABLE代表使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA
	//设置引脚为推挽输出Out_PP
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	//定义引脚为 0号引脚 和 1号引脚
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1; 
	 //设置引脚的速度50MHz
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
	 //初始化GPIO,初始化哪个引脚就对应哪个
	GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA,所以引脚对应PA0和PA1
	//初始化时LED应为熄灭状态,所以要拉高LED引脚的电平
	GPIO_SetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1); //PA0 和 PA1引脚拉高电平
}

编写LED亮灭的函数

//LED灯状态函数
void Ledx_state(int x , int t){ //x表示第几个LED,t==1表示点亮,t==0表示熄灭
	if(x==1){  //x==1对应LED1
		if(t==1)GPIO_ResetBits(GPIOA,GPIO_Pin_0); //LED1点亮
		if(t==0)GPIO_SetBits(GPIOA,GPIO_Pin_0); //LED1熄灭
	}
	if(x==2){ //x==2对应LED2
		if(x==1)GPIO_ResetBits(GPIOA,GPIO_Pin_1); //LED2点亮
		if(x==0)GPIO_SetBits(GPIOA,GPIO_Pin_1); //LED2熄灭
	}
}

实现按下按键LED灯的状态取反

//*****  实现按下按键LED灯的状态取反  *****//
void Led1_Turn(void){
	//如果PA0的输出寄存器的值为0,证明LED1为点亮状态 
	if(GPIO_ReadOutputDataBit(GPIOA , GPIO_Pin_0)==0){
		//取反,PA0置高电平,LED1熄灭
		GPIO_SetBits(GPIOA , GPIO_Pin_0);
	}
	else{     //PA0的输出寄存器的值为1,证明LED1为熄灭状态 
		//取反,PA0置低电平,LED1点亮
		GPIO_ResetBits(GPIOA , GPIO_Pin_0);
	}
}
void Led2_Turn(void){
	//如果PA1的输出寄存器的值为0,证明LED2为点亮状态 
	if(GPIO_ReadOutputDataBit(GPIOA , GPIO_Pin_1)==0){
		//取反,PA1置高电平,LED2熄灭
		GPIO_SetBits(GPIOA , GPIO_Pin_1);
	}
	else{     //PA1的输出寄存器的值为1,证明LED2为熄灭状态 
		//取反,PA1置低电平,LED2点亮
		GPIO_ResetBits(GPIOA , GPIO_Pin_1);
	}
}

led.c总代码

#include "led.h"
#include "stm32f10x.h"
void Led_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
	
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);
}
//LED灯状态函数
void Ledx_state(int x , int t){  //x表示第几个LED,t==1表示点亮,t==0表示熄灭
	if(x==1){
		if(t==1)GPIO_ResetBits(GPIOA,GPIO_Pin_0);
		if(t==0)GPIO_SetBits(GPIOA,GPIO_Pin_0);
	}	
	if(x==2){
		if(t==1)GPIO_ResetBits(GPIOA,GPIO_Pin_1);
		if(t==0)GPIO_SetBits(GPIOA,GPIO_Pin_1);
	}
}
//*****  实现按下按键LED灯的状态取反  *****//
void Led1_Turn(void){
	//如果PA0的输出寄存器的值为0,证明LED1为点亮状态 
	if(GPIO_ReadOutputDataBit(GPIOA , GPIO_Pin_0)==0){
		//取反,PA0置高电平,LED1熄灭
		GPIO_SetBits(GPIOA , GPIO_Pin_0);
	}
	else{     //PA0的输出寄存器的值为1,证明LED1为熄灭状态 
		//取反,PA0置低电平,LED1点亮
		GPIO_ResetBits(GPIOA , GPIO_Pin_0);
	}
}
void Led2_Turn(void){
	//如果PA1的输出寄存器的值为0,证明LED2为点亮状态 
	if(GPIO_ReadOutputDataBit(GPIOA , GPIO_Pin_1)==0){
		//取反,PA1置高电平,LED2熄灭
		GPIO_SetBits(GPIOA , GPIO_Pin_1);
	}
	else{     //PA1的输出寄存器的值为1,证明LED2为熄灭状态 
		//取反,PA1置低电平,LED2点亮
		GPIO_ResetBits(GPIOA , GPIO_Pin_1);
	}
}

2. led.h头文件的代码

#ifndef __LED_H
#define __LED_H

void Led_Init(void); //LED初始化
void Ledx_state(int i , int x); //LED灯状态函数

#endif

3. key.c文件的代码

先配置按键的GPIO

//按键 初始化函数
void Key_Init(void){
	//声明一个结构体,名字是GPIO_InitStructure
	GPIO_InitTypeDef GPIO_InitStructure;
	//使能GPIOA的时钟,ENABLE代表使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//GPIOB
	//按键需要设置引脚模式为上拉模式GPIO_Mode_IPU
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉模式GPIO_Mode_IPU
	//定义引脚为 0号引脚 和 1号引脚
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1; 
	 //设置引脚的速度50MHz
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
	 //初始化GPIO,初始化哪个引脚就对应哪个
	GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB,所以引脚对应PA0和PA1
	//初始化时LED应为熄灭状态,所以要拉高LED引脚的电平
	GPIO_SetBits(GPIOB,GPIO_Pin_0 | GPIO_Pin_1); //PB0 和 PB1引脚拉高电平
}

获取当前按键键值的函数

uint8_t Key_GetNum(void){  //获取当前按键键值
	uint8_t KeyNum = 0;
	//检测PB0引脚是否为低电平,按键按下时为低电平
	if(GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_0)==0){  //PB0为低电平,按键1已按下
		delay_ms(20); //延时,消抖
		//消抖,等待PB0重新变成高电平,如果一直为低电平则一直进入死循环
		while(GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_0)==0);
		delay_ms(20); //延时,消抖
		KeyNum=1; //键值赋值为1,代表按键1已按下
	}
	//检测PB1引脚是否为低电平,按键按下时为低电平
	if(GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_1)==0){  //PB1为低电平,按键2已按下
		delay_ms(20); //延时,消抖
		//消抖,等待PB1重新变成高电平,如果一直为低电平则一直进入死循环
		while(GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_1)==0);
		delay_ms(20); //延时,消抖
		KeyNum=2; //键值赋值为2,代表按键1已按下
	}
	return KeyNum; //返回键值
}

key.c总代码

#include "key.h"
void Key_Init(void){
	GPIO_InitTypeDef GPIO_InitStructure;
	
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//GPIOB
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置上拉模式 GPIO_Mode_IPU
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1);
}
uint8_t Key_GetNum(void){ 
	uint8_t KeyNum = 0;
	if(GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_0)==0){
		delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_0)==0);
		delay_ms(20);
		KeyNum=1;
	}
	if(GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_1)==0){
		delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_1)==0);
		delay_ms(20);
		KeyNum=2;
	}
	return KeyNum;
}

4. key.h头文件的代码

#ifndef __KEY_H
#define __KEY_

#include "stm32f10x.h"                  // Device header
#include "delay.h"

void Key_Init(void); //按键初始化
uint8_t Key_GetNum(void); //获取当前按键按下的键值

#endif

5. main.c文件的代码

5.1 按键按下实现LED亮或者灭

#include "stm32f10x.h"
#include  "led.h"
#include  "key.h"
#include "delay.h"

uint8_t KeyNum = 0;

int main(void)
{ 
	delay_init();
	Led_Init();	
	Key_Init();
	while(1){
		KeyNum = Key_GetNum(); //获取键值
		if(KeyNum == 1){
			//按下按键1,LED1灯亮,LED2灯灭
			Ledx_state(1 , 1);
			Ledx_state(2 , 0);			
		}
		if(KeyNum == 2){
			//按下按键2,LED2灯亮,LED1灯灭
			Ledx_state(1 , 0);
			Ledx_state(2 , 1);	
		}
	}

仿真效果图:
proteus 按键,STM32F103,stm32,单片机,proteus,嵌入式硬件,学习

5.2 按键按下实现LED状态取反

#include "stm32f10x.h"
#include  "led.h"
#include  "key.h"
#include "delay.h"

uint8_t KeyNum = 0;

int main(void)
{ 
	delay_init();
	Led_Init();	
	Key_Init();
	
	while(1){  //按下按键,LED灯取反
		KeyNum = Key_GetNum(); //获取键值
		if(KeyNum == 1){
			Led1_Turn();    //按下按键1,LED1灯状态取反
		}
		if(KeyNum == 2){
			Led2_Turn();    //按下按键2,LED2灯状态取反
		}
	}
	

仿真效果图:
proteus 按键,STM32F103,stm32,单片机,proteus,嵌入式硬件,学习

三、项目(代码+仿真)分享链接

百度网盘
链接:https://pan.baidu.com/s/1pcVtAcER2mAwnQnyRL3aXQ
提取码:p8q4文章来源地址https://www.toymoban.com/news/detail-728050.html

到了这里,关于Stm32f103c8t6(proteus仿真)学习——3.按键控制LED灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 舵机控制(STM32F103C8T6)

            本文是以 STM32F103C8T6 作为主控芯片,通过PB6端口输出PWM,实现控制180°舵机。 (一)概述         舵机是一种位置伺服驱动器器,是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只在控制信号持续不变,伺服机构就

    2023年04月09日
    浏览(56)
  • 功耗测评 | STM32F103C8T6

    STM32F103C8T6 MCU越来越广泛的应用在生产生活的各个领域,外接丰富的传感器、功能模块、通信模块、显示存储等可以形成各种可样的产品项目应用。对于功耗要求比较高的产品,一般会选择STM32L系列的MCU,但是从功耗的评测角度,逻辑上是基本相似的。 在很多应用场合中都对

    2024年02月07日
    浏览(45)
  • STM32F103C8T6系统板

    1.电源部分 2.复位 3.晶振 4. 电源电路——防反接 有关二极管 漫谈二极管防电源反接电路 本次采用上图右下角的NMOS防反接电路。 电源电路——电源芯片 AMS1117是AMS公司的 ,LM1117是NS(美国国家半导体)的,LM1117要贵很多,所以一般的用AMS1117就可以了。 (以下分析参考STM32F10

    2024年02月02日
    浏览(72)
  • STM32F103C8T6串口通信

      首先来看一下需要操作的函数,以及配置的步骤: 图1                                                  图2   Code: usart.c #include \\\"usart.h\\\" void ustart_Init(void ) { GPIO_InitTypeDef GPIO_Init_Ustar ; // 定义输出端口TX的结构体对象 USART_InitTypeDef USTART_Init; // 定义串口初始化结构体对象

    2024年02月16日
    浏览(52)
  • STM32F103C8T6串口调试篇

    项目开发中,当出现bug时,由于不知道某个变量的值,所以很难定位问题,针对此问题,串口调试脱颖而出。通过串口printf()实时将需要显示的信息打印出来,这样就很方便的定位问题。 串口设置方法 1.购买调试器pwlink2。参考STM32F103C8T6程序烧录方法_stm32f103c8t6如何烧录_流

    2024年02月12日
    浏览(64)
  • stm32f103c8t6的外部中断

    在单片机中存在着中断系统,这个系统的逻辑和功能在51单片机中已经有所了解。 1.在32单片机中的内核有一个nvic 里面存放许多优先级的设定,外接许多中断源,比如“exti、tim、adc、usart等”接入之后,nvic再通过中断优先级进行排队,再内接入cpu中进行处理,这样子大大减少

    2024年02月09日
    浏览(54)
  • [STM32F103C8T6]ADC转换

    什么是ADC转换? ADC转换的全称是: Analog-to-Digital Converter ,指模拟 / 数字转换器 ADC的性能指标: ADC分辨率: SSA与VREF-一起接到地,DDA与VREF+接到3.3v,所以ADC转换的范围是0---3.3v 所以最后的ADC转换值应该是我们的测量值*分辨率    分辨率 = 3.3v/2^12 = (3.3/4096)   12位的转换器所

    2024年02月06日
    浏览(47)
  • STM32F103C8T6移植FreeRTOS

    根据自己开发板型号下载地址:STM32相关内容下载地址 SDK直接下载地址:STM32直接下载地址 下载参考博客 FreeROTS下载地址 选用V9.0.0 版本 个人创建目录如下,可做参考 keil目录 链接头文件 • 修改堆栈大小 • 修改中断函数名 去掉stm32f10x_it.c终端函数 增加FreeRTOS中断 特别解释

    2024年02月12日
    浏览(55)
  • STM32F103C8T6 按键扫描输入

    第一章 STM32F103C8T6 点亮LED灯 系列文章目录 前言 一、原理  1.按键类型  2.按键消抖 3.IO口输入配置 1)模拟输出 2)浮空输入模式 3)下拉输入模式(PULL DOWN) 4)上拉输入模式(PULL UP) 二、代码部分 main.c key.c key.h 总结         上一章我们成功入门了STM32F103C8T6,今天我们来

    2023年04月23日
    浏览(78)
  • 嵌入式硬件——stm32F103C8T6

    如下图:    处理器核心:STM32F103C8T6内置了ARM Cortex-M3处理器,这是一种高性能、低功耗的32位RISC处理器,适用于嵌入式系统。 时钟速度:它可以工作在不同的时钟速度,最高主频可达72 MHz。 存储器:包括64KB的Flash程序存储器用于存储程序代码,以及20KB的SRAM用于存储数据和

    2024年02月05日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包