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

相关推荐
m0_739312879 分钟前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件
嵌入式小章19 分钟前
基于STM32的实时时钟(RTC)教学
stm32·嵌入式硬件·实时音视频
TeYiToKu28 分钟前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
基极向上的三极管1 小时前
【AD】3-4 在原理图中放置元件
嵌入式硬件
徐嵌2 小时前
STM32项目---水质水位检测
stm32·单片机·嵌入式硬件
徐嵌2 小时前
STM32项目---畜牧定位器
c语言·stm32·单片机·物联网·iot
lantiandianzi2 小时前
基于单片机的老人生活安全监测系统
单片机·嵌入式硬件·生活
东胜物联2 小时前
探寻5G工业网关市场,5G工业网关品牌解析
人工智能·嵌入式硬件·5g
stm32发烧友2 小时前
基于STM32的智能家居环境监测系统设计
stm32·嵌入式硬件·智能家居
hairenjing112310 小时前
使用 Mac 数据恢复从 iPhoto 图库中恢复照片
windows·stm32·嵌入式硬件·macos·word