STM32用标准库编写按键控制LED灯的proteus仿真

首先打开proteus仿真软件,绘制电路图:

或是下载我已经建立好的工程修改:

链接:https://pan.baidu.com/s/1Nx5p3Tif6eHBIVkcPfsj9w?pwd=1234

提取码:1234

第一步复制整个工程文件夹,就不用重新配置的辛苦了,改个名字直接用:

第二步在工程文件夹中新建一个Mycode文件夹:

在Mycode文件夹中新建6个文件:以后这个文件夹就是我们自己写的新模块放到这里了:

这6个文件的内容都很简单:下面一个一个的展示:

Delay.c:

cs 复制代码
#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

Delay.h:

cs 复制代码
#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

LED.c:

cs 复制代码
#include "stm32f10x.h"                  // Device header



void led_init(void)  // led灯的初始化函数
{
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;            
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	
	GPIOB->ODR = 0xFFFF;
}

void LED_set(uint8_t num, uint8_t EN)
{
	//  如果传过来的是0  那就设置为0引脚为1或0
	if(num == 0 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_0);
	}
	else if(num == 0 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_0);
	}
	//  如果传过来的是1  那就设置为1引脚为1或0
	else if(num == 1 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_1);
	}
	else if(num == 1 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_1);
	}
	
	//  如果传过来的是2  那就设置为1引脚为1或0
	else if(num == 2 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_2);
	}
	else if(num == 2 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_2);
	}
	
	//  如果传过来的是3  那就设置为1引脚为1或0
	else if(num == 3 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_3);
	}
	else if(num == 3 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_3);
	}
	
	//  如果传过来的是4  那就设置为1引脚为1或0
	else if(num == 4 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_4);
	}
	else if(num == 4 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_4);
	}
	
	//  如果传过来的是5  那就设置为1引脚为1或0
	else if(num == 5 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_5);
	}
	else if(num == 5 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_5);
	}
	
	//  如果传过来的是6  那就设置为1引脚为1或0
	else if(num == 6 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_6);
	}
	else if(num == 6 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_6);
	}
	
	//  如果传过来的是7  那就设置为1引脚为1或0
	else if(num == 7 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_7);
	}
	else if(num == 7 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_7);
	}
	
	//  如果传过来的是8  那就设置为1引脚为1或0
	else if(num == 8 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_8);
	}
	else if(num == 8 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_8);
	}
	
	//  如果传过来的是9  那就设置为1引脚为1或0
	else if(num == 9 && EN == 1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_9);
	}
	else if(num == 9 && EN == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_9);
	}
}

LED.h:

cs 复制代码
#ifndef __LED_H

#define __LED_H

void led_init(void);  // 初始化LED点亮需要的一切东西

void LED_set(uint8_t num, uint8_t EN);  // 设置LED  参数1是引脚号  参数2是1或0.

#endif

key.c:

cs 复制代码
#include "stm32f10x.h"                  // Device header

void key_init(void)   // 按键初始化函数
{
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;    //  GPIO为上拉模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;            
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	GPIOA->ODR = 0xFFFF;
}
uint8_t key_Get(uint8_t num)
{
	uint8_t val=0;
	//如果num==0  就返回引脚0的值
	if(num == 0)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
	}
	

	//如果num==1  就返回引脚1的值
	else if(num == 1)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);
	}
	
	
	//如果num==2  就返回引脚2的值
	else if(num == 2)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2);
	}
	
	//如果num==3  就返回引脚3的值
	else if(num == 3)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3);
	}
	
	//如果num==4  就返回引脚4的值
	else if(num == 4)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4);
	}
	
	//如果num==5  就返回引脚5的值
	else if(num == 5)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);
	}
	
	//如果num==6  就返回引脚6的值
	else if(num == 6)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
	}
	
	//如果num==7  就返回引脚7的值
	else if(num == 7)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7);
	}
	
	//如果num==8  就返回引脚8的值
	else if(num == 8)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8);
	}
	
	//如果num==9  就返回引脚9的值
	else if(num == 9)
	{
		val = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9);
	}
	
	return val;
}

key.h:

cs 复制代码
#ifndef __KEY_H
#define __KEY_H


void key_init(void);          // 按键初始化函数

uint8_t key_Get(uint8_t num);  // 按键值获取函数   参数:要获取的引脚号


#endif

最后就是书写main函数了,用来调用自己写的这些个函数,来实现咱们按下按键灯亮的目的:

main.c:

cs 复制代码
#include "stm32f10x.h"                  // Device header
#include "LED.h"
#include "key.h"

int main( void )
{
	led_init();
	key_init();
	
	
	while(1)
	{
		if(key_Get(0) == 0)
			LED_set(0,0);
		if(key_Get(1) == 0)
			LED_set(1,0);
		if(key_Get(2) == 0)
			LED_set(2,0);
		if(key_Get(3) == 0)
			LED_set(3,0);
		if(key_Get(4) == 0)
			LED_set(4,0);
		if(key_Get(5) == 0)
			LED_set(5,0);
		if(key_Get(6) == 0)
			LED_set(6,0);
		if(key_Get(7) == 0)
			LED_set(7,0);
		if(key_Get(8) == 0)
			LED_set(8,0);
		if(key_Get(9) == 0)
			LED_set(9,0);
		else
			GPIOB->ODR = 0XFFFF;
		
	}
}

整体在keil中的文件架构为:

现在编译后把hex文件导入proteus中就能仿真了。

相关推荐
时空自由民.38 分钟前
无人机系统耗电,低功耗管理问题解决方法(chatgpt)
单片机·嵌入式硬件·无人机
时空自由民.43 分钟前
无人机系统耗电,低功耗管理问题解决方法(腾讯元宝)
单片机·嵌入式硬件·无人机
清风6666662 小时前
基于单片机的双档输出数字直流电压源设计
单片机·mongodb·毕业设计·nosql·课程设计
牛马大师兄2 小时前
STM32独立看门狗IWDG与窗口看门狗WWDG知识梳理笔记
笔记·stm32·单片机·嵌入式硬件·嵌入式·看门狗
夜月yeyue2 小时前
STM32 Flash 访问加速器详解(ART Accelerator)
linux·单片机·嵌入式硬件·uboot·bootloard
A9better3 小时前
嵌入式开发学习日志37——stm32之USART
stm32·嵌入式硬件·学习
国科安芯6 小时前
ASP4644芯片低功耗设计思路解析
网络·单片机·嵌入式硬件·安全
充哥单片机设计7 小时前
【STM32项目开源】基于STM32的智能厨房火灾燃气监控
stm32·单片机·嵌入式硬件
CiLerLinux14 小时前
第四十九章 ESP32S3 WiFi 路由实验
网络·人工智能·单片机·嵌入式硬件
时光の尘14 小时前
【PCB电路设计】常见元器件简介(电阻、电容、电感、二极管、三极管以及场效应管)
单片机·嵌入式硬件·pcb·二极管·电感·三极管·场效应管