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中就能仿真了。

相关推荐
yutian06061 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
析木不会编程4 小时前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
枯无穷肉8 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名6778 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式科普9 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
嵌入式大圣9 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云山工作室9 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
嵌入式-老费9 小时前
基于海思soc的智能产品开发(mcu读保护的设置)
单片机·嵌入式硬件
qq_3975623111 小时前
MPU6050 , 设置内部低通滤波器,对于输出数据的影响。(简单实验)
单片机
liyinuo201711 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范